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&amp;characterEncoding=UTF-8&amp;useSSL=false&amp;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官方文档

 

posted @ 2021-12-20 18:11  Rookie12138  阅读(30)  评论(0编辑  收藏  举报