【学习笔记】SSM整合篇
📒博客首页:铁甲小宝同学 📒
**🌞文章目的:
Spring、SpringMVC、Mybatis的整合
🌞**
🙏博主也在学习阶段,如若发现问题,请告知,非常感谢🙏
**💗
同时也非常感谢各位小伙伴们的支持
💗**
🌈每日一语:承遇朝霞,年少正恰。整装戎马,刻印风华! 🌈
💗感谢: 我只是站在巨人们的肩膀上整理本篇文章,感谢走在前路的大佬们!💗
文章目录
什么是SSM?
什么是 SSM 我相信很多学习 Java 的小伙伴都很熟悉吧。
SSM 是
Spring
、
SpringMVC
和
Mybatis
。其三者是学习 Java 框架的入门级别的框架,而正是这些框架能让我们的 WEB 开发更容易。
SSM整体项目结构
本博主是按照本博主最近写的一个 SSM 项目来给大家展示一般的 SSM 整体项目结构的目录。
可能还没整理会有一点小乱,希望大家别建议嘿嘿。
SSM整合的环境
SSM整合的工具
- IDEA(尽量是专业版)
- Maven(自带Maven或者下载的Maven)
- 数据库(博主的数据库是MySQL 8版本)
SSM整合依赖
首先先导入一些工具包的依赖,如在学习 Mybatis需要用的包,学习MVC用的包等。都通过 pom.xml 导入进来。
常用包的依赖:
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.7.RELEASE</version></dependency><!--添加Servlet和JSP依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.7.RELEASE</version></dependency><!--spring AOP的包--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.2.7.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.2.7.RELEASE</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.3</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.20</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3</version></dependency><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>1.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.30</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency><!--注解依赖 https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api --><dependency><groupId>javax.annotation</groupId><artifactId>javax.annotation-api</artifactId><version>1.3.2</version></dependency><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.2</version></dependency><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.12.RELEASE</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>RELEASE</version><scope>compile</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>RELEASE</version><scope>compile</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>RELEASE</version><scope>compile</scope></dependency>
吐槽: 还真是学了 SpringBoot 觉得 SSM 导入WEB开发包比较麻烦哈哈哈。
为了防止我们资源导出失败的问题,我们还需要用 build 导入一下依赖:
<build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource></resources></build>
基本结构的构建
java目录包的构建
在上述目录中我们能看见 java 包下有一下几个包:
- controller
- dao
- service
- pojo
其分别是用来包含我们 WEB开发的每个层次。如 controller 则是控制层,用来接收前端的请求。而 dao 则是用来和处理数据库。 service 则是处理控制层发来的请求。 pojo 则是我们的 实体类 。
resource包下的xml文件构建
mybatis-config.xml:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration></configuration>
Mapper.xml:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace=""></mapper>
Spring等的xml文件:
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/springbeans.xsd"></beans>
**链接数据库文件
database.properties
的配置:**
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/notes?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=密码
jdbc.init=1
jdbc.minIdle=1
jdbc.maxActive=10
MyBatis的核心配置文件 mybatis-config.xml:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!-- 配置数据源,交给Spring--><typeAliases><packagename="com.xiaobao.pojo"/></typeAliases><!-- 用来映射Mapper获取Sql语句的路径,简的来说就是一个获取Mapper的路径--><mappers><packagename="com.xiaobao.dao"/></mappers></configuration>
实体类的创建:
例如我项目其中的一个:
接口的编写和测试
Dao层的Mapper接口
我们就拿上图的 UserMapper 作为一个例子。
UserMapper 接口:
publicinterfaceUserMapper{/**
* 注册用户
* @param name 用户名
* @param passWord 密码
* @return 返回是否注册成功,若为1即为成功
*/intregister(@Param("name")String name,@Param("passWord")String passWord);/**
* 根据用户名和密码来获取User
* @param name 用户名
* @param passWord 密码
* @return 用户名
*/StringgetUserByNameAndPaw(@Param("name")String name,@Param("passWord")String passWord);/**
* 根据用户的用户名来获取用户
* @param name 用户名
* @return 用户名
*/StringgetUserByName(String name);/**
* 根据用户名修改密码
* @param name 用户名
* @param passWord 密码
* @return 返回是否修改数据库的行数
*/intupdatePassWord(@Param("name")String name,@Param("passWord")String passWord);/**
* 保存头像地址到数据库
*/intsaveUserImg(@Param("user_name")String name ,@Param("userImg")String userImg);}
编写对应的xml文件:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.xiaobao.dao.UserMapper"><insertid="register"parameterType="String">
insert into notes.user (user_name,user_password)
values (#{name},#{passWord});
</insert><selectid="getUserByNameAndPaw"parameterType="String"resultType="String">
select user_name from notes.user where user_name = #{name} and user_password = #{passWord}
</select><selectid="getUserByName"parameterType="String"resultType="String">
select user_name from notes.user where user_name = #{name}
</select><updateid="updatePassWord"parameterType="String">
update notes.user
set user_password =#{passWord}
where user_name =#{name};
</update><updateid="saveUserImg"parameterType="String">
UPDATE notes.user
SET userImg = #{userImg}
WHERE user_name = #{user_name}
</update></mapper>
Service层的接口
上述中我们编写完毕 Dao 的 Mapper 接口,而 Mapper 层接口就是为了服务 Service 的业务需求。按照我们上述的例子我们可以来看 Service 层的需求编写。
接口:
publicinterfaceUserService{/**
* 前端传输后端注册信息,返回前端result
* @param userName 用户名
* @param passWord 用户密码
* @return 则return Result.error(2,"用户名已存在",null);
* 注册成功则return Result.success(null);不需要回传数据。
*/publicResult<User>register(String userName,String passWord);/**
* 验证登入信息
* @param userName 用户名
* @param passWord 用户密码
* @return 一共返回三个结果
* Result.error(2,"用户名不存在",null);
* Result.error(2,"密码错误",null);
* Result.success(user.getUsername());
*/publicResult<User>login(String userName,String passWord);/**
* 更新用户密码
* @param userName 用户名
* @param passWord 用户密码
* @return Result.success(null)
*/publicResult<User>updatePassWord(String userName,String passWord);publicResult<User>saveUserImg(String userImg,String name);}
接口的实现类:
@AutowiredprivateUserMapper userMapper;@OverridepublicResult<User>register(String userName,String passWord){try{String name = userMapper.getUserByName(userName);if(name ==null){//用户名不存在
userMapper.register(userName, passWord);//注册信息returnResult.success(null);}else{//用户名存在4returnResult.error(2,"用户名已存在",null);}}catch(Exception e){
e.printStackTrace();returnResult.error(2,"出错了请稍后再试!",null);}}@OverridepublicResult<User>login(String userName,String passWord){try{String nameByName = userMapper.getUserByName(userName);String nameByNameAndPwd = userMapper.getUserByNameAndPaw(userName, passWord);if(nameByName ==null){returnResult.error(2,"用户名不存在",null);}elseif(nameByNameAndPwd ==null){returnResult.error(2,"密码错误",null);}else{returnResult.success(nameByName);}}catch(Exception e){
e.printStackTrace();returnResult.error(2,"出错了请稍后再试!",null);}}@OverridepublicResult<User>updatePassWord(String userName,String passWord){try{
userMapper.updatePassWord(userName,passWord);returnResult.success(null);}catch(Exception e){
e.printStackTrace();returnResult.error(2,"出错了请稍后再试!",null);}}@OverridepublicResult<User>saveUserImg(String userImg,String name){try{
userMapper.saveUserImg(name ,userImg);returnResult.success(userImg);}catch(Exception e){
e.printStackTrace();returnResult.error(2,"出错了请稍后再试!",null);}}publicvoidsetUserMapper(UserMapper userMapper){try{this.userMapper = userMapper;}catch(Exception e){
e.printStackTrace();}}
Spring层的配置文件
Mybatis
整合 Mybatis 则是使用
Spring-dao.xml
来进行一个配置。
扫描数据库的配置文件:
<!--1.关系数据库配置文件 通过Spring配置--><context:property-placeholderlocation="classpath:database.properties"/>
导入数据源:
<beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><propertyname="driverClassName"value="${jdbc.driver}"/><propertyname="url"value="${jdbc.url}"/><propertyname="username"value="${jdbc.username}"/><propertyname="password"value="${jdbc.password}"/></bean>
绑定Mybatis的配置文件:
SqlSessionFactory
需要注入数据源跟
mybatis
路径,这样
mybatis-config.xml
配置的内容才能生效
<beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"><propertyname="dataSource"ref="dataSource"/><!--绑定Mybatis的配置文件--><propertyname="configLocation"value="classpath:mybatis-config.xml"/></bean>
扫描映射器:
配置
dao
接口扫描包,动态的实现了
dao
接口可以注入到
Spring
容器中
<beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer"><!--注入sqlSessionFactoryBeanName--><propertyname="sqlSessionFactoryBeanName"value="sqlSessionFactory"/><!--要扫描的dao包--><propertyname="basePackage"value="com.xiaobao.dao"/></bean>
功能和
mybatis-config
中
mappers
是一样的。都是扫描Mapper,用来配置需要加载的 sql 映射配置文件路径的。
<mappers><packagename="com.xiaobao.dao"/></mappers>
>
文件上传配置:
<beanid="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 --><propertyname="defaultEncoding"value="utf-8"/><!-- 上传文件大小上限,单位为字节(10485760=10M) --><propertyname="maxUploadSize"value="10485760"/><propertyname="maxInMemorySize"value="40960"/></bean>
使用c3p0连接池的完整版:
<context:property-placeholderlocation="classpath:database.properties"/><beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"><propertyname="driverClass"value="${jdbc.driver}"/><propertyname="jdbcUrl"value="${jdbc.url}"/><propertyname="user"value="${jdbc.username}"/><propertyname="password"value="${jdbc.password}"/><!-- c3p0连接池的私有属性 --><propertyname="maxPoolSize"value="30"/><propertyname="minPoolSize"value="10"/><!-- 关闭连接后不自动commit --><propertyname="autoCommitOnClose"value="false"/><!-- 获取连接超时时间 --><propertyname="checkoutTimeout"value="10000"/><!-- 当获取连接失败重试次数 --><propertyname="acquireRetryAttempts"value="2"/></bean><!--3.sqlSessionFactory--><beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"><propertyname="dataSource"ref="dataSource"/><!--绑定Mybatis的配置文件--><propertyname="configLocation"value="classpath:mybatis-config.xml"/></bean><!--4.配置dao接口扫描包,动态的实现了dao接口可以注入到Spring容器中--><beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer"><!--注入sqlSessionFactoryBeanName--><propertyname="sqlSessionFactoryBeanName"value="sqlSessionFactory"/><!--要扫描的dao包--><propertyname="basePackage"value="com.xiaobao.dao"/></bean><!--文件上传配置--><beanid="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 --><propertyname="defaultEncoding"value="utf-8"/><!-- 上传文件大小上限,单位为字节(10485760=10M) --><propertyname="maxUploadSize"value="10485760"/><propertyname="maxInMemorySize"value="40960"/></bean></beans>
Service层
扫描service下的包
<context:component-scanbase-package="com.xiaobao.service"/>
注入数据源:
<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!-- 注入数据源--><propertyname="dataSource"ref="dataSource"/></bean>
注入到Spring:
<beanid="UserServiceImpl"class="com.xiaobao.service.UserServiceImpl"><propertyname="userMapper"ref="userMapper"/></bean>
MVC层
web.xml配置
首先在 web.xml 文件中配置
DispatcherServlet
.
<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
配置乱码过滤:
<filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
文件上传配置:
<filter><filter-name>HiddenHttpMethodFilter</filter-name><filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter><filter-mapping><filter-name>HiddenHttpMethodFilter</filter-name><url-pattern>/**</url-pattern></filter-mapping>
设置session过期时间:
<!--session过期时间--><session-config><session-timeout>15</session-timeout></session-config>
设置监听器启动工厂:
<!--启动spring工厂--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param>
Spring-mvc.xml文件的配置
扫描包:
<context:component-scanbase-package="com.xiaobao.controller"/>
注解驱动:
<!--当SpringMVC中设置任何一个view-controller时,其他控制器中的请求映射将全部失效
此时需要在SpringMVC的核心配置文件中设置开启mvc注解驱动的标签:--><mvc:annotation-driven/>
静态资源过滤:
<mvc:default-servlet-handler/>
thymeleaf视图解析器:
<!-- 配置thymeleaf--><beanid="viewResolver"class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><propertyname="order"value="1"/><propertyname="characterEncoding"value="UTF-8"/><propertyname="templateEngine"><beanclass="org.thymeleaf.spring5.SpringTemplateEngine"><propertyname="templateResolver"><beanclass="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><!-- 视图前缀 --><propertyname="prefix"value="/WEB-INF/templates/"/><!-- 视图后缀 --><propertyname="suffix"value=".html"/><propertyname="templateMode"value="HTML5"/><propertyname="characterEncoding"value="UTF-8"/></bean></property></bean></property></bean>
Spring整合到applicationContext.xml文件
applicationContext.xml文件配置。
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"><importresource="classpath:spring-dao.xml"/><importresource="classpath:spring-service.xml"/><importresource="classpath:spring-mvc.xml"/></beans>
Controller层的编写
UserController:
@RestController@RequestMapping("/user")publicclassUserController{@Autowired@Qualifier("UserServiceImpl")privateUserService userService;@RequestMapping("/register")publicResult<User>register(@RequestBodyUser user){return userService.register(user.getUserName(),user.getPassWord());}@RequestMapping("/hello")publicStringhello(){return"s";}@RequestMapping("/login")publicResult<User>login(@RequestBodyUser user){return userService.login(user.getUserName(),user.getPassWord());}@RequestMapping("/update")publicResult<User>update(@RequestBodyUser user){return userService.updatePassWord(user.getUserName(),user.getPassWord());}//用户头像图片上传@RequestMapping(value ="/upload", method =RequestMethod.POST)publicResultUploadPic(User user,@RequestParam("photo")MultipartFile file,HttpServletRequest request)throwsIOException{System.out.println(user.getUserName());//获取文件名 : file.getOriginalFilename();String uploadFileName = file.getOriginalFilename();//如果文件名为空,直接回到首页!if("".equals(uploadFileName)){returnResult.error(1,"文件名为空",null);}//上传路径保存设置String path = request.getSession().getServletContext().getRealPath("/upload");//如果路径不存在,创建一个File realPath =newFile(path);if(!realPath.exists()){
realPath.mkdir();}InputStream is = file.getInputStream();//文件输入流OutputStream os =newFileOutputStream(newFile(realPath, uploadFileName));//文件输出流//读取写出int len =0;byte[] buffer =newbyte[1024];while((len = is.read(buffer))!=-1){
os.write(buffer,0, len);
os.flush();}
os.close();
is.close();String URL = request.getRequestURL().subSequence(0, request.getRequestURL().length()-11)+"upload/"+ uploadFileName;return userService.saveUserImg(URL,user.getUserName());// return Result.success(URL);}
总结
本篇 SSM 整合是结合了狂神视频的讲解和博主最近一个项目开发的部分功能给大家总结出来的文章,本篇文章主要目的还是用来复习时所使用的,如果本篇文章能够帮助到屏幕前的你,将是博主最大的荣幸。好了废话不多说了,我们下期见!!!
版权归原作者 铁甲小宝同学 所有, 如有侵权,请联系我们删除。