Spring整合Mybatis
在上一篇文章如何创建一个Mybatis工程中,写了最原始的使用mybatis的方法。这篇文章在原来的代码上用Spring整合一下Mybatis工程。
一、编写Spring的Application配置文件
spring-dao.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 https://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/aop 8 https://www.springframework.org/schema/aop/spring-aop.xsd"> 9 10 <!-- dataSource:使用Spring的数据源替换Mybatis的配置 c3p0 dbcp druid 11 我们这里使用的Spring提供的JDBC:org.springframework.jdbc.datesource --> 12 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 13 <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 14 <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT"/> 15 <property name="username" value="root"/> 16 <property name="password" value="123456"/> 17 </bean> 18 <!-- sqlsessionFactory --> 19 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 20 <property name="dataSource" ref="dataSource" /> 21 <!-- 绑定Mybatis配置文件 --> 22 <property name="configLocation" value="classpath:mybatis-config.xml"/> 23 <property name="mapperLocations" value="classpath:com/maolei/mapper/*.xml"/> 24 </bean> 25 <!-- sqlsessionTemplate:就是我们使用的sqlsession 26 这里要注入sqlsessionFactory,但是SqlSessionTemplate里没有set方法,只有构造方法,所以使用构造方法注入 27 构造方法注入有三种:下标,名字,类型。这里使用类型--> 28 <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> 29 <constructor-arg index="0" ref="sqlSessionFactory"/> 30 </bean> 31 <!-- <bean id="userMapper" class="com.maolei.mapper.UserMapperImpl"> 32 <property name="sqlsession" ref="sqlSession"/> 33 </bean> --> 34 35 36 </beans>
在这个xml里,原来在mybatis-config.xml中连接MySQL的配置,以及在测试类中通过new的方法创建sqlSessionFactory,都以bean注入的方式来代替了。并且在id为"sqlSessionFactory"的bean里,绑定了Mybatis的配置文件,我们现在看一看Mybatis的配置文件中还剩下些什么:
mybatis-config.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 4 <configuration> 5 <!-- <properties resource="db.properties"/> --> 6 <!-- <settings> 7 <setting name="logImpl" value="STDOUT_LOGGING"/> 8 <setting name="mapUnderscoreToCamelCase" value="true"/> 9 <setting name="logImpl" value="LOG4J"/> 10 </settings> --> 11 <typeAliases> 12 <!-- <typeAlias alias="User" type="com.maolei.pojo.User"/> --> 13 <package name="com.maolei.pojo"/> 14 </typeAliases> 15 <!-- 16 注释快捷键 :ctrl+shift+/ 17 environments与environment值保持一致 18 --> 19 <!-- <environments default="mysql"> 20 environment代表的是环境 21 <environment id="mysql"> 22 23 transactionManager:代表数据库的事务 24 Type统一是JDBC 25 26 <transactionManager type="JDBC"></transactionManager> 27 28 dataSource:代表数据源 29 type:POOLED 30 31 <dataSource type="POOLED"> 32 配置数据库驱动 33 <property name="driver" value="${driver}"/> 34 配置url 35 <property name="url" value="${url}"/> 36 配置用户名 37 <property name="username" value="${username}"/> 38 配置密码 39 <property name="password" value="${password}"/> 40 </dataSource> 41 </environment> 42 </environments> --> 43 <!-- <mappers> 44 45 <mapper resource="com/maolei/dao/UserMapper.xml"/> 46 47 <mapper class="com.maolei.mapper.UserMapper"/> 48 </mappers> --> 49 50 </configuration>
通过"configLocation"绑定了mybatis-config.xml文件,通过"mapperLocations"注册了mapper的接口。实际上都是SqlSessionFactoryBean类里相关的set方法注入的。
这里mybatis-config.xml中只剩下起别名的<typeAliases>标签了。
二、通过SqlSessionTemplate获取sqlsession
在 MyBatis 中,你可以使用 sqlsessionFactory 来创建 sqlsession。 一旦你获得一个 session 之后,你可以使用它来执行映射了的语句,提交或回滚连接,最后,当不再需要它的时候,你可以关闭 session。 使用 MyBatis-Spring 之后,你不再需要直接使用 sqlsessionFactory 了,因为你的 bean 可以被注入一个线程安全的 sqlsession,它能基于 Spring 的事务配置来自动提交、回滚、关闭 session。
在Spring中通过SqlSessionTemplate来获取SqlSession,通过上面的spring-dao.xml可以看到,可以使用 sqlsessionFactory 作为构造方法的参数来创建 sqlsessionTemplate对象。
1 <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> 2 <constructor-arg index="0" ref="sqlSessionFactory"/> 3 </bean>
使用了SqlSessionTemplate,相对于原来的Mybatis,需要多写一个接口的实现类,来写注入sqlSession的set方法
1 package com.maolei.mapper; 2 3 import java.util.List; 4 5 import org.mybatis.spring.SqlSessionTemplate; 6 7 import com.maolei.pojo.User; 8 9 public class UserMapperImpl implements UserMapper{ 10 11 //我们的所有操作在原来都是使用sqlsession来执行,现在都是用sqlsessionTemplate 12 private SqlSessionTemplate sqlsession; 13 14 public void setSqlsession(SqlSessionTemplate sqlsession) { 15 this.sqlsession = sqlsession; 16 } 17 18 public List<User> getUser() { 19 UserMapper userMapper = sqlsession.getMapper(UserMapper.class); 20 return userMapper.getUser(); 21 } 22 23 }
三、将自己的实体类,注入到Spring中
这里写一个专门注册实体类的applicationContext.xml,import上面的spring-dao.xml文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 https://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/aop 8 https://www.springframework.org/schema/aop/spring-aop.xsd"> 9 10 <import resource="spring-dao.xml"/> 11 <bean id="userMapper" class="com.maolei.mapper.UserMapperImpl"> 12 <property name="sqlsession" ref="sqlSession"/> 13 </bean> 14 15 16 17 </beans>
四、编写测试类
1 import java.io.IOException; 2 import java.io.InputStream; 3 import java.util.List; 4 5 import org.apache.ibatis.io.Resources; 6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 9 import org.junit.Test; 10 import org.mybatis.spring.SqlSessionTemplate; 11 import org.springframework.context.ApplicationContext; 12 import org.springframework.context.support.ClassPathXmlApplicationContext; 13 14 import com.maolei.mapper.UserMapper; 15 import com.maolei.pojo.User; 16 17 public class MyTest { 18 @Test 19 public void getUser() throws IOException { 20 //注释掉的部分是Mybatis最原始的实现方式 21 //下面sqlsession的获取可以做成一个工具类 22 // String resource = "mybatis-config.xml"; 23 // InputStream in = Resources.getResourceAsStream(resource); 24 // SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in); 25 // SqlSession sqlSession = ssf.openSession(); 26 // UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 27 // List<User> userList = userMapper.getUser(); 28 // for (User user : userList) { 29 // System.out.println(user); 30 // } 31 32 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 33 UserMapper userMapper = context.getBean("userMapper",UserMapper.class); 34 List<User> userList = userMapper.getUser(); 35 for (User user : userList) { 36 System.out.println(user); 37 } 38 } 39 40 }
测试结果:
User(id=1, name=王五, pwd=123456)
User(id=2, name=张三, pwd=123456)
User(id=3, name=李四, pwd=123456)
User(id=4, name=小明, pwd=123456)
==============================================================================================================================================================
上面的方法是手写的SqlSessionTemplate,mybatis-spring还有一种把SqlSessionTemplate封装起来的方法,继承SqlSessionDaoSupport类,写更少的代码来使用mybatis。
编写另一个接口实现类:UserMapperImpl2.java
1 package com.maolei.mapper; 2 3 import java.util.List; 4 5 import org.mybatis.spring.support.SqlSessionDaoSupport; 6 7 import com.maolei.pojo.User; 8 9 public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper{ 10 11 public List<User> getUser() { 12 return getSqlSession().getMapper(UserMapper.class).getUser(); 13 } 14 15 }
applicationContext.xml里注册这个接口实现类:
1 <bean id="userMapper2" class="com.maolei.mapper.UserMapperImpl2"> 2 <property name="sqlSessionFactory" ref="sqlSessionFactory"/> 3 </bean>
测试类里只需要改一下getBean里的名字:
1 import java.io.IOException; 2 import java.io.InputStream; 3 import java.util.List; 4 5 import org.apache.ibatis.io.Resources; 6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 9 import org.junit.Test; 10 import org.mybatis.spring.SqlSessionTemplate; 11 import org.springframework.context.ApplicationContext; 12 import org.springframework.context.support.ClassPathXmlApplicationContext; 13 14 import com.maolei.mapper.UserMapper; 15 import com.maolei.pojo.User; 16 17 public class MyTest { 18 @Test 19 public void getUser() throws IOException { 20 //注释掉的部分是Mybatis最原始的实现方式 21 //下面sqlsession的获取可以做成一个工具类 22 // String resource = "mybatis-config.xml"; 23 // InputStream in = Resources.getResourceAsStream(resource); 24 // SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in); 25 // SqlSession sqlSession = ssf.openSession(); 26 // UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 27 // List<User> userList = userMapper.getUser(); 28 // for (User user : userList) { 29 // System.out.println(user); 30 // } 31 32 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 33 // UserMapper userMapper = context.getBean("userMapper",UserMapper.class); 34 UserMapper userMapper = context.getBean("userMapper2",UserMapper.class); 35 List<User> userList = userMapper.getUser(); 36 for (User user : userList) { 37 System.out.println(user); 38 } 39 } 40 41 }
测试结果与第一种的一致。
mybatis-spring官方文档