zoukankan      html  css  js  c++  java
  • 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官方文档

  • 相关阅读:
    物联网相关期刊会议
    Java O O第十一天
    mac下安装伪分布hadoop2.6.0和hbase1.0.1.1
    Ubuntu下使用openssl为apache2配置ssl
    ubuntu下安装hadoop
    ubuntu 添加应用到Dash启动器
    Ubuntu12.04中安装Oracle JDK和NetBeans的方法
    Ubuntu12.04中在桌面建立指向网页的链接文件的方法
    Ubuntu12.04中Gvim无法固定到启动器的解决办法
    Ubuntu中apt-get安装或更新软件错误的解决办法
  • 原文地址:https://www.cnblogs.com/maol986162214/p/15712286.html
Copyright © 2011-2022 走看看