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。
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><dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency><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><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><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/beanshttp://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.2.xsdhttp://www.springframework.org/schema/aophttp://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><?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><?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><dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency><dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency>
同样创建在上面数据库连接使用的classpath下的db.properties
jdbc.driverClass=com.mysql.jdbc.Driverjdbc.jdbcUrl=jdbc:mysql://localhost:3306/mybatisjdbc.user=rootjdbc.password=rootjdbc.driverClass=com.mysql.jdbc.Driver jdbc.jdbcUrl=jdbc:mysql://localhost:3306/mybatis jdbc.user=root jdbc.password=rootjdbc.driverClass=com.mysql.jdbc.Driver jdbc.jdbcUrl=jdbc:mysql://localhost:3306/mybatis jdbc.user=root jdbc.password=root
3.4、配置MyBatis核心初始化类
因为MyBatis中的对象以及初始化都交于Spring来管理,所以,MyBatis核心配置都要写在Spring的核心配置文件中,内容如下:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/></bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> </bean><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);}public interface UserMapper { @Select("select * from user where id = #{userId}") User getUser(@Param("userId")String userid); }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><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><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.6、在Spring核心配置文件中定义MapperBean
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="com.fd.mapper.UserMapper"/><property name="sqlSessionFactory" ref="sqlSessionFactory"/></bean><bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.fd.mapper.UserMapper"/> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean><bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.fd.mapper.UserMapper"/> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>
3.7、编写MyBatis-Spring测试类
public class MyBatisSpringTest {@Testpublic 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);}}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); } }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><!--配置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><!--配置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"/><!--指定mapper接口的扫描路径--> <mybatis:scan base-package="com.fd.dao"/><!--指定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><!--指定mapper接口的扫描路径 方式2--> <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.fd.dao"/> </bean><!--指定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/beanshttp://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.2.xsdhttp://www.springframework.org/schema/aophttp://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><?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><?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>
编写测试代码:
@Testpublic void testSpringMybatisUser(){/*构建一个Spring容器*//*ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring/spring-context.xml");*/ApplicationContext applicationContext = new ClassPathXmlApplicationContext("file:D:\\JAVA\\<a href="https://www.zym88.cn/tag/java" title="更多关于 java 的文章" target="_blank">java</a>\\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);}@Test public void testSpringMybatisUser(){ /*构建一个Spring容器*/ /*ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring/spring-context.xml");*/ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("file:D:\\JAVA\\<a href="https://www.zym88.cn/tag/java" title="更多关于 java 的文章" target="_blank">java</a>\\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); }@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的初始化核心类--> <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的初始化核心类--> <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>
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><?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><?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><dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring-beans.version}</version> </dependency><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><!--加入SpringMVC的GAV依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring-beans.version}</version> </dependency><!--加入SpringMVC的GAV依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring-beans.version}</version> </dependency>
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><!--引入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><!--引入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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--配置SpringMVC包的扫描,因为当前springmvc也是使用了容器,所以它扫描的组件不能和spring扫描的组件重复--><context:component-scan base-package="com.fd.controller" use-default-filters="false"><!--所以要使用排除法,SpringMVC只扫描自己的controller包--><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan></beans><?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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--配置SpringMVC包的扫描,因为当前springmvc也是使用了容器,所以它扫描的组件不能和spring扫描的组件重复--> <context:component-scan base-package="com.fd.controller" use-default-filters="false"> <!--所以要使用排除法,SpringMVC只扫描自己的controller包--> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> </beans><?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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--配置SpringMVC包的扫描,因为当前springmvc也是使用了容器,所以它扫描的组件不能和spring扫描的组件重复--> <context:component-scan base-package="com.fd.controller" use-default-filters="false"> <!--所以要使用排除法,SpringMVC只扫描自己的controller包--> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> </beans>
修改spring的核心配置文件spring-context.xml如下:
<!-- 配置spring包扫描 --><context:component-scan base-package="com.fd"><!--因为controller已经在springMVC中扫描过了,所以在spring扫描的时候,要把controller过滤掉--><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan><!-- 配置spring包扫描 --> <context:component-scan base-package="com.fd"> <!--因为controller已经在springMVC中扫描过了,所以在spring扫描的时候,要把controller过滤掉--> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan><!-- 配置spring包扫描 --> <context:component-scan base-package="com.fd"> <!--因为controller已经在springMVC中扫描过了,所以在spring扫描的时候,要把controller过滤掉--> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
再到springmvc-context.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"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--配置SpringMVC包的扫描,因为当前springmvc也是使用了容器,所以它扫描的组件不能和spring扫描的组件重复--><context:component-scan base-package="com.fd.controller" use-default-filters="false"><!--所以要使用排除法,SpringMVC只扫描自己的controller包--><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan><!-- 视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- jsp所在的位置--><property name="prefix" value="/WEB-INF/jsp/"/><!-- jsp文件的后缀名--><property name="suffix" value=".jsp"/></bean><!--配置默认的servlet--><mvc:default-servlet-handler/><!--启用注解驱动--><mvc:annotation-driven/></beans><?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" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--配置SpringMVC包的扫描,因为当前springmvc也是使用了容器,所以它扫描的组件不能和spring扫描的组件重复--> <context:component-scan base-package="com.fd.controller" use-default-filters="false"> <!--所以要使用排除法,SpringMVC只扫描自己的controller包--> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- jsp所在的位置--> <property name="prefix" value="/WEB-INF/jsp/"/> <!-- jsp文件的后缀名--> <property name="suffix" value=".jsp"/> </bean> <!--配置默认的servlet--> <mvc:default-servlet-handler/> <!--启用注解驱动--> <mvc:annotation-driven/> </beans><?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" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--配置SpringMVC包的扫描,因为当前springmvc也是使用了容器,所以它扫描的组件不能和spring扫描的组件重复--> <context:component-scan base-package="com.fd.controller" use-default-filters="false"> <!--所以要使用排除法,SpringMVC只扫描自己的controller包--> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- jsp所在的位置--> <property name="prefix" value="/WEB-INF/jsp/"/> <!-- jsp文件的后缀名--> <property name="suffix" value=".jsp"/> </bean> <!--配置默认的servlet--> <mvc:default-servlet-handler/> <!--启用注解驱动--> <mvc:annotation-driven/> </beans>
2.6、编程测试Controller
编写一个测试Servlet,用来测试SpringMVC是否正常启动
@Controllerpublic class IndexController {@RequestMapping("/hello")@ResponseBodypublic String test() throws Exception{return "Hello F2135";}}@Controller public class IndexController { @RequestMapping("/hello") @ResponseBody public String test() throws Exception{ return "Hello F2135"; } }@Controller public class IndexController { @RequestMapping("/hello") @ResponseBody public String test() throws Exception{ return "Hello F2135"; } }
这时在浏览器输入http://localhost:8080/hello 如果浏览器输出Hello F2135,则表示SpringMVC启动成功!
2.7、编程验证SpringMVC和Spring完全整合成功
因为Spring和SpringMVC是两个容器,另外SpringMVC的容器时Spring容器的子容器,所以当SpringMVC的Controller中如果注入Spring的Bean成功,那么我们就可以验证SpringMVC和Spring完全整合。
先编写一个Service接口:
public interface UserService {public User getUser();}public interface UserService { public User getUser(); }public interface UserService { public User getUser(); }
再编写一个Service实现类:
@Servicepublic class UserServiceImpl implements UserService {@Overridepublic User getUser() {return null;}}@Service public class UserServiceImpl implements UserService { @Override public User getUser() { return null; } }@Service public class UserServiceImpl implements UserService { @Override public User getUser() { return null; } }
在IndexController中通过@Autowired注入UserService,如果注入成功,那么久说明Spring和SpringMVC整合成功。
代码如下:
@Controllerpublic class IndexController {@Autowiredprivate UserService userService;@RequestMapping("/user")@ResponseBodypublic String getUser() throws Exception{final User user = userService.getUser();return user.toString();}}@Controller public class IndexController { @Autowired private UserService userService; @RequestMapping("/user") @ResponseBody public String getUser() throws Exception{ final User user = userService.getUser(); return user.toString(); } }@Controller public class IndexController { @Autowired private UserService userService; @RequestMapping("/user") @ResponseBody public String getUser() throws Exception{ final User user = userService.getUser(); return user.toString(); } }
<!--加入jackson来完成SpringMVC对JSON的解析--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version></dependency><!--加入jackson来完成SpringMVC对JSON的解析--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency><!--加入jackson来完成SpringMVC对JSON的解析--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency>
2.8、在Spring中调用MyBatis
因为MyBatis完全由Spring接管,所以MyBatis的Dao要通过容器注入,注入和测试如下:
@Servicepublic class UserServiceImpl implements UserService {// 注入MyBatis的Dao对象@Autowiredprivate UserDao userDao;@Overridepublic User getUser() {final User user = userDao.getUser("16");return user;}}@Service public class UserServiceImpl implements UserService { // 注入MyBatis的Dao对象 @Autowired private UserDao userDao; @Override public User getUser() { final User user = userDao.getUser("16"); return user; } }@Service public class UserServiceImpl implements UserService { // 注入MyBatis的Dao对象 @Autowired private UserDao userDao; @Override public User getUser() { final User user = userDao.getUser("16"); return user; } }
测试没有问题,接下来就可以写上华丽的页面完成一个项目了。
4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报。
6 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
暂无评论内容