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 List 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 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 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 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 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 userList = userMapper.getUser();
36         for (User user : userList) {
37             System.out.println(user);
38         }
39     }
40 
41 }

测试结果与第一种的一致。

mybatis-spring官方文档