Spring整合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 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 19 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 20 <property name="dataSource" ref="dataSource" /> 21 22 <property name="configLocation" value="classpath:mybatis-config.xml"/> 23 <property name="mapperLocations" value="classpath:com/maolei/mapper/*.xml"/> 24 bean> 25 28 <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> 29 <constructor-arg index="0" ref="sqlSessionFactory"/> 30 bean> 31 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 6 11 <typeAliases> 12 13 <package name="com.maolei.pojo"/> 14 typeAliases> 15 19 43 49 50 configuration>
通过"configLocation"绑定了mybatis-config.xml文件,通过"mapperLocations"注册了mapper的接口。实际上都是SqlSessionFactoryBean类里相关的set方法注入的。
这里mybatis-config.xml中只剩下起别名的
二、通过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 ListgetUser() { 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 // ListuserList = 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 ListuserList = 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 ListgetUser() { 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 // ListuserList = 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 ListuserList = userMapper.getUser(); 36 for (User user : userList) { 37 System.out.println(user); 38 } 39 } 40 41 }
测试结果与第一种的一致。