SSM框架整合—详细整合教程(Spring+SpringMVC+MyBatis)
Posted 苏州程序大白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSM框架整合—详细整合教程(Spring+SpringMVC+MyBatis)相关的知识,希望对你有一定的参考价值。
SSM框架整合—详细整合教程(Spring+SpringMVC+MyBatis)
✨博主介绍
💂 个人主页:苏州程序大白
💂 个人社区:CSDN全国各地程序猿
🤟作者介绍:中国DBA联盟(ACDU)成员,CSDN全国各地程序猿(媛)聚集地管理员。目前从事工业自动化软件开发工作。擅长C#、Java、机器视觉、底层算法等语言。2019年成立柒月软件工作室,2021年注册苏州凯捷智能科技有限公司
💅 有任何问题欢迎私信,看到会及时回复
👤 微信号:stbsl6,微信公众号:苏州程序大白
💬如果文章对你有帮助,欢迎关注、点赞、收藏(一键三连)
🎯 想加入技术交流群的可以加我好友,群里会分享学习资料
MyBatis和Spring整合
1、整合原因
因为Spring中有强大的bean管理机制,解决了对象之间的耦合度,另外对于重用的对象,通过容器来管理比较方便,还提供了强大的事务处理机制。所以把重复的代码都交给spring去处理,也可以提高代码的灵活性。
2、整合条件
根据MyBatis官网的Spring要求,使用MyBatis-Spring的插件继续整合。
官网地址如下:http://mybatis.org/spring/zh/index.html
它的好处是:MyBatis-Spring
会帮助你将 MyBatis 代码无缝地整合到 Spring 中。
它将允许MyBatis
参与到 Spring 的事务管理之中,创建映射器 mapper
和 SqlSession
并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring
的 DataAccessException
。
最终,可以做到应用代码不依赖于 MyBatis
,Spring
或 MyBatis-Spring
。
Spring和MyBatis-Spring的版本要求:
MyBatis-Spring | MyBatis | Spring Framework | Spring Batch | Java |
---|---|---|---|---|
2.0 | 3.5+ | 5.0+ | 4.0+ | Java 8+ |
1.3 | 3.4+ | 3.2.2+ | 2.1+ | Java 6+ |
3、整合入门
3.1、在项目中加入mybatis-spring依赖包
在项目的pom.xml中加入以下代码:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
3.2、继续添加spring的依赖
<properties>
<spring-beans.version>5.2.14.RELEASE</spring-beans.version>
</properties>
<!-- 添加spring的依赖包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>$spring-beans.version</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>$spring-beans.version</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>$spring-beans.version</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>$spring-beans.version</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>$spring-beans.version</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>$spring-beans.version</version>
</dependency>
3.3、配置spring核心配置文件
默认的spring的核心配置文件是applicationContext.xml,我在此命名为spring-context.xml并且放在resources下新建的spring包中.在项目中的相对路径为:src/main/resources/spring/spring-context.xml
内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
<!-- 配置spring包扫描 -->
<context:component-scan base-package="com.fd"/>
<!-- 添加属性文件配置 -->
<context:property-placeholder location="classpath:config/db.properties" />
<!--连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="$jdbc.driverClass"
p:jdbcUrl="$jdbc.jdbcUrl"
p:user="$jdbc.user"
p:password="$jdbc.password"
/>
</beans>
因为上面使用了c3p0
连接池,所以在pom.xml
中添加c3p0
的依赖
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
同样创建在上面数据库连接使用的classpath
下的db.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/mybatis
jdbc.user=root
jdbc.password=root
注意:db.properties是在classpath:config/db.properties路径下
3.4、配置MyBatis核心初始化类
因为MyBatis中的对象以及初始化都交于Spring来管理,所以,MyBatis核心配置都要写在Spring的核心配置文件中,内容如下:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
3.5、定义Mapper对象
为了测试方便,先定义一个绑定SQL到接口中的Mapper,这种就可以省略xml映射文件的编写,但是可维护性比较差,一般用来做测试
public interface UserMapper
@Select("select * from user where id = #userId")
User getUser(@Param("userId")String userid);
引入依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
3.7、编写MyBatis-Spring测试类
public class MyBatisSpringTest
@Test
public void testSpringMyBatis()
/*构建一个Spring容器*/
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-context.xml");
/*从容器中获取Mapper*/
UserMapper userMapper = applicationContext.getBean(UserMapper.class);
User user = userMapper.getUser("1");
System.out.println("user = " + user);
4、整合MyBatis现有配置
4.1、修改Spring核心配置文件
在基础的MyBatis
用法中,是通过SqlSessionFactoryBuilder
来创建SqlSessionFactory
的而在MyBatis-Spring
中,则使用SqlSessionFactoryBean
来创建,所以默认MyBatis
的配置属性都都可以通过SqlSessionFactoryBean
来设置,最常见的两个设置就是mapper
文件的位置和Mapper
接口的扫描配置。
<!--配置MyBatis的初始化核心类-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--指定默认mapper映射文件的扫描路径,扫描多个时,可使用list标签-->
<property name="mapperLocations">
<list>
<value>classpath*:mybatis/mapper-*.xml</value>
</list>
</property>
</bean>
如果mapper映射文件的路径和Mapper接口的路径不一样,一般要指定Mapper接口的扫描路径,在Spring核心配置文件中添加Mapper接口扫描路径,如下:
<!--指定mapper接口的扫描路径-->
<mybatis:scan base-package="com.fd.dao"/>
或(2选1即可)
<!--指定mapper接口的扫描路径 方式2-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.fd.dao"/>
</bean>
完整的Spring配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p" xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
<!-- 配置spring包扫描 -->
<context:component-scan base-package="com.fd"/>
<!-- 添加属性文件配置 -->
<context:property-placeholder location="classpath:config/db.properties" />
<!--连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="$jdbc.driverClass"
p:jdbcUrl="$jdbc.jdbcUrl"
p:user="$jdbc.user"
p:password="$jdbc.password"
/>
<!--配置MyBatis的初始化核心类-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--指定默认mapper映射文件的扫描路径,扫描多个时,可使用list标签-->
<property name="mapperLocations">
<list>
<value>classpath*:mybatis/mapper-*.xml</value>
</list>
</property>
</bean>
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.fd.mapper.UserMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<!--指定mapper接口的扫描路径-->
<mybatis:scan base-package="com.fd.dao"/>
</beans>
编写测试代码:
@Test
public void testSpringMybatisUser()
/*构建一个Spring容器*/
/*ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring/spring-context.xml");*/
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("file:D:\\\\JAVA\\\\java\\\\MySSM\\\\src\\\\main\\\\resources\\\\spring\\\\spring-context.xml");
/*从容器中获取Mapper*/
UserDao userDao = applicationContext.getBean(UserDao.class);
User user = userDao.getUser("16");
System.out.println("user = " + user);
4.2、使用旧的mybatis核心配置文件
在Spring核心配置文件的SqlSessionFactory下添加一行代码:
<!--配置MyBatis的初始化核心类-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--使用旧的mybatis核心配置文件-->
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
<!--指定默认mapper映射文件的扫描路径,扫描多个时,可使用list标签-->
<property name="mapperLocations">
<list>
<value>classpath*:mybatis/mapper-*.xml</value>
</list>
</property>
</bean>
注意:上述MyBatis核心配置文件中的一些配置(比如mysql环境)等已经交由Spring去管理,所以不需要再做该配置,否则就可能会和Spring中的配置属性起冲突。
SpringMVC和Spring整合
1、整合理论
因为Spring是一个容器,用来解决对象之间的耦合度,所以整合结果就是要Spring统一管理所有Bean和MyBatis以及数据库的事务等。
另外:SpringMVC是基于Spring开发,所以SpringMVC中也有一个管理自己Bean(@Controller)的容器,这个容器和上面Spring的容器不是一个容器,它只管理自己,所以两个容器之间包的扫描要分开。
2、整合实战
因为在整个框架整合中,Spring是管理Bean的容器,所以Spring容器要最先初始化,但是SSM是一个WEB项目,在WEB项目里最先启动的是Listener,所以Spring在WEB项目初始化是通过监听器(Listener)来启动,SpringMVC的启动是通过Servlet来启动。
2.1、配置Spring的启动
首先要把当前项目转换成一个web项目,在maven结构中,web项目的路径是:src/main/webapp/WEB-INF/web.xml
配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--配置Spring监听器启动,在服务器启动的时候最先启动-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-context.xml</param-value>
</context-param>
</web-app>
如果当前项目没有spring-web依赖包,那么需要加入一下:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>$spring-beans.version</version>
</dependency>
2.2、SpringMVC和Spring代码整合
因为SpringMVC依赖于Spring,所以他自己内部也有个容器,但是该容器只管自己的Controller,所以在包扫描的地方要配置过滤。
2.3、加入SpringMVC的pom依赖
先要在pom.xml加入依赖
<!--加入SpringMVC的GAV依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>$spring-beans.version</version>
</dependency>
注意:jar的名字是spring-webmvc
2.4、配置核心Servlet
因为SpringMVC的核心是DispatchServlet,是一个WEB开发中的Servlet组件,所以必须要配置在web.xml中,配置如下:
<!--引入SpringMVC的核心控制器DispatchServlet-->
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置SpringMVC的核心配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc-context.xml</param-value>
</init-param>
</servlet>
<!--配置Spring监听器启动,在服务器启动的时候最先启动-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!--配置SpringMVC核心配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-context.xml</param-value>
</context-param>
<!-- 访问DispatcherServlet对应的路径 -->
<!--配置Servlet映射,默认/ 不是/*-->
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>/</url-pattern> <!--/不过滤jsp防止死循环-->
</servlet-mapping>
2.5、配置SpringMVC的核心配置文件
按照上面web.xml中的配置,我们需要springmvc-context.xml中做如下配置:
<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlnsSSM三大框架整合详细教程(Spring+SpringMVC+MyBatis)
SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
SSM整合SpringMVC + Spring + Mybatis整合详细教程