Spring5(21) —— 整合MyBatis方式1


1.什么是MyBatis-Spring

    MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring

2.MyBatis-Spring版本问题

    MyBatis-Spring 需要以下版本:
在这里插入图片描述


3.安装

    使用 Maven 作为构建工具,仅需要在 pom.xml 中加入以下代码即可:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>2.0.5</version>
</dependency>

4.上手

  • 创建一个新的xml资源文件在resources文件夹下,这个文件就是我们的spring的配置文件
  • DataSource数据源配置(mybatis中的数据源配置就是在配置连接数据库中的哪一张表)
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  • sqlsessionFactory配置(代替原来自己写的mybatis工具类的来获取sqlsession对象的操作)
        这么做的原因很简单,IOC要求没收程序中所有非IOC提供对象的手段,这也是保证DI一定会成功的前提
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • dataSource配置数据源,即连接数据库的配置

  • sqlSessionFactory配置mybatis核心配置文件中的所有参数节点,可以这样做的原因就在于我们写的mybatis核心配置文件本来就是要被sqlSessionFactory加载然后解析生成sqlSession对象的,而spring为了简便,就直接让我们将参数配置在sqlSessionFactory节点中;换句话来说,原来写的mybatis核心配置文件就是为sqlSessionFactory对象写的(因为sqlSessionFactory对象的获取要读取mybatis的核心配置文件,这个文件也只有它一个类会进行读取),所以现在在spring中,我们可以将mybatis核心配置文件中的节点全部都写在sqlSessionFactory节点中

    • 注意点:我们还是会习惯性的将typeAliases节点和setting节点留在mybatis核心配置文件中,其他的节点我们可以随便配置spring的sqlSessionFactory节点中或者mybatis核心配置文件中,但是某一个节点只能在二者之间选一个写,不能两边都写,都写就会报错

在这里插入图片描述


    配置了sqlSessionFactory的bean之后,我们还可以将原来需要在java代码中获取的sqlSession的bean也注入到spring的容器中,这样我们在使用的时候就可以直接从容器中获取sqlSession对象了

//java代码获取sqlsession对象,原来将它封装成了工具类
String resources = "mybatis-config.xml";
InputStream in = Resources.getResourceAsStream(resources);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = factory.openSession(true);

    spring官方为了让我们使用更加方便已经在spring-mybatis的API中内置了一个sqlsession类,我们直接使用它来装配sqlsession对象到容器中即可,而不用再自己去定义一个工具类来专门获取sqlsession对象

    官方给这个内置的sqlsession类取名叫做SqlSessionTemplate,我们需要明确一点,SqlSessionTemplate对象就是我们使用的SqlSession对象,只是spring在整合mybatis的时候给它换了一个名称
在这里插入图片描述

在这里插入图片描述

<!--sqlsession-->
<bean id="sqlsession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>

在这里插入图片描述


  • 编写一个UserMapper的实现类(不同点)
    • 这是因为spring为了将mybatis彻底的内嵌到自己的内部,就干脆不让用户使用mybatis的步骤来调用mybatis的mapper.xml文件,它给出的做法就是我们多定义一个mapper的实现类,这里就是UserMapperImpl,有了这样一个类,我们就应该为它去spring容器中进行注册,否则我们就不能直接获取这个对象,而需要自己手动new一个对象,这是不符合IOC规定的;在这个类中,由于我们继承了mapper接口,所以我们就在mapper方法的实现中调用sqlSession.getMapper(UserMapper.class),并将mapper.queryUserList()的结果返回出去;即将mybatis的操作完全封装在这个类中
    • 这样做的好处就在于,客户端在调用的时候完全不用涉及mybatis的操作,首先获取context容器对象,然后调用getBean()从容器中获取UserMapperImpl的对象,然后直接按照接口中定义的方法即可获取到结果(即使用getBean()的重载,不用使用强转);可见整个操作流程都是标准的spring操作
package com.thhh.mapper;

import com.thhh.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;

import java.util.List;

public class UserMapperImpl implements UserMapper{
    private SqlSessionTemplate sqlSession;

    public void setSqlSession(SqlSessionTemplate sqlSession) {
        this.sqlSession = sqlSession;
    }

 //封装的mybatis操作,这里就已经调用完了mybatis的操作,使用的时候直接调用这个方法即可
    @Override
    public List<User> queryUserList() {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        return mapper.queryUserList();
    }
}

在这里插入图片描述

  • 将这个实现类注入到spring容器中
<!--userMapper-->
<bean id="userMapper" class="com.thhh.mapper.UserMapperImpl">
    <property name="sqlSession" ref="sqlsession"/>
</bean>
  • 测试
import com.thhh.mapper.UserMapper;
import com.thhh.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;
import java.util.List;

public class MyTest {
    @Test
    public void test01() throws IOException {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
        UserMapper userMapper = context.getBean("userMapperImpl", UserMapper.class);
        List<User> userList = userMapper.queryUserList();
        for (User user : userList) {
            System.out.println(user);
        }
    }
}

在这里插入图片描述
在这里插入图片描述


5.小结

整合MyBatis方式1使用步骤

  1. 在spring配置文件中装配数据源datasource【对应mybatis配置文件中的enviroment节点,删除】
  2. 在spring配置文件中装配sqlSessionFactory【我们可以将mybatis配置文件中的属性节点作为property字节点配置在该节点中,因为mybatis配置文件本来就是为这个对象配置的】
  3. 在spring配置文件中装配SqlSessionTemplate【就是学习mybatis的时候使用的SqlSession对象,现在配置在IOC容器中了,我们可以直接获取】
  4. 给mapper节点添加一个实现类【这一步就是整个spring和mybatis整合的精髓,它的作用就是将mybatis的整个操作都内嵌到spring中,让用户/客户端在操作的时候完全按照spring的步骤实现】
  5. 将添加的mapper节点的实现类装配到spring配置文件中【还是配置在sqlSessionFactory节点的mappers子节点中,因为它属于mybatis配置文件中的一个配置节点,而mybatis配置文件就是为sqlSessionFactory对象准备的,直接配置在sqlSessionFactory里面还省去了读取文件的环节】
  6. 测试

通过上面的例子我们可以看出整合MyBatis方式1的实质

  • 将mybatis配置文件的内容迁移到spring配置文件中。我们可以专门创建一个spring的子配置文件,就叫spring-dao,这个配置文件就只使用spring的两个bean节点,一个用来配置dataSource,一个用来配sqlSessionFactory;

  • 甚至我们可以摒弃调用mybatis的配置文件,完全使用spring配置文件来实现配置;因为mybatis配置文件的作用就是用来被sqlSessionFactory读取,所以我们在spring中可以直接在sqlSessionFactory节点上配置mybatis配置文件中的所有节点
    在这里插入图片描述

    • 但是我们在实际使用的时候还是会保留mybatis配置文件,一般会在mybatis中配置typeAliases和setting节点;此外由于现在mybatis配置文件和spring配置文件都在配置mybatis的参数,所以为了避免冲突,我们会在spring配置文件中将两个配置文件链接,链接方式入下图
      在这里插入图片描述
  • 将使用mybatis的Java代码内嵌到spring中

    • 做法就是再定义一个mapper的实现类,这个实现类就封装了本来我们应该在客户端进行的mybatis的操作
      在这里插入图片描述

    • 封装完毕之后我们还要去spring容器中装配这个实现类

    • 最后就是在客户端测试被spring封装的mybatis,客户端的代码里再也没有调用mybatis的操作
      在这里插入图片描述


    所以,所谓的mybatis和spring的整合,就是spring单方面霸道的吞并mybatis,作为其内部的一个功能模块(这个功能模块就是我们新创建的mapper接口的实现类)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值