您现在的位置是:首页 >技术交流 >SpringBoot——整合MyBatis网站首页技术交流

SpringBoot——整合MyBatis

Error_exception_worn 2024-06-17 10:22:18
简介SpringBoot——整合MyBatis

前情回顾:

在开始介绍SpringBoot整合MyBatis之前,我们先来复习一下在Spring中整合MyBaits是如何来做的。其中的核心思想是将MyBatis中的SqlSession对象交给Spring去管理,并且Spring提供了一个Maper接口扫描器对象去完成为Mapper接口创建动态代理对象的过程,其中的具体步骤由以下几个方面组成:

1、要引入需要用到的依赖坐标,这一步是比较需要细心的,要保证引入的Jar包不会冲突,需要自己做版本管理,我在做整合MyBatis的时候用到的依赖坐标的pom文件内容如下:

<dependencies>
        <!--        mybatis的核心依赖坐标-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.13</version>
        </dependency>
        <!--        mysql连接类的依赖坐标-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.32</version>
        </dependency>
        <!--        这是整合中后加的Spring整合MyBatis的依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.1</version>
        </dependency>
        <!--        数据源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.20</version>
        </dependency>
        <!--        junit单元测试的依赖坐标-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <!--        配合Spring进行测试的单元-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.21.RELEASE</version>
        </dependency>
        <!--        spring的核心依赖坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.21.RELEASE</version>
        </dependency>
        <!--        spring的Jdbc包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.21.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

其中有一些Jar包如果版本发生了改变就很容易导致冲突,引起报错,所以这一步需要细心一些。

2、编写配置文件,我们使用注解的方式,这一步也是核心所在,使用@Bean标签将我们用到的所有的对象都注册到容器中,被Spring管理,基本就完成了Spring的整合。

3.做测试,在我们做测试的时候,对于JUnit4还是JUnit5的测试支持还是有一些区别的,注意我们在导入Test包的时候需要注意。

这是我们在Spring中整合MyBatis的时候的常规做法,那么我们来看一下我们在SpringBoot中是如何完成整合的。

SpringBoot整合MyBaits:

第一步肯定也是要引入依赖,那么看一下我们需要引入何种依赖:

我们不需要导入任何的依赖!

是的,如果你在创建项目的时候勾选了MySQLDriver,MyBatis,lombok这三个选项的话,那么在导入依赖的时候,你不需要导入任何的额外的依赖了,SpringBoot已经帮你导入好了,并且你也不需要关心Jar包冲突,SprigBoot也帮你自动调试好了,只要是SpringBoot内部维护的技术,所有的jar包都不会冲突。

我们来看一下在项目创建的时候都导入了什么jar包:

如果你们的Jar包也和我的一样,那么我们就可以继续下一步了,下一步就是创建一个类来封装我们从数据库中查询到的数据:

 这一步我们已经做了很多次了,所以我们就直接展示一张图片就不放代码了,我们使用lombok中的@Data注解来代替我们之前的Get和Set方法。然后呢?对应上面的步骤是不是就应该是创建一个Mapper接口,里面定义查询方法了:

这一步我们也做过很多次了,展示一下内容就可以了,代码自己敲很简单。

然后就可以进行测试类,是不是感觉少点什么啊,是不是少了配置SqlSessionFactory对象,包扫描对象,这是不是都没有啊。SpringBoot已经很贴心的帮我们做好了。是不是我们直接测试就知道了:

测试的内容跟我们之前是一样的,展示一下,然后直接运行:

 肯定是通过了,既然我们没有配置,那他是怎么知道我们写的Mapper是一个Dao层接口的呢,关键在于我们直接写在UserMapper上的一个注解叫做@Mapper,之前这个注解可以不写,因为我们指定他要扫描的包,但是现在我们不指定了,这个注解就一定要写,他和之前一样,会扫描引导类所在的包以及子包,遇到这个注解标注的类,就会放到容器中,并创建它的动态代理对象,然后调用方法,调用SQL语句进行查询。SqlSessionFactory也是同样的,SpringBoot内部就帮我们维护了一个SqlSessionFactory对象,你说你要是不信,直接从容器中获取试试就知道了:

package com.spring;

import com.spring.dao.UserMapper;
import com.spring.pojo.User;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class SpringBootTest02Application {
    public static void main(String[] args) {
//        获取容器对象
        ConfigurableApplicationContext context = SpringApplication.run(SpringBootTest02Application.class, args);
//        获取容器中的SqlSessionFactory对象
        SqlSessionFactory bean = context.getBean(SqlSessionFactory.class);
//        获取容器中的Mapper对象
        UserMapper bean1 = context.getBean(UserMapper.class);
//        输出对象,只要不为空那就表示获取到了
        System.out.println(bean);
        System.out.println(bean1);
//        使用Mapper对象调用方法,执行SQL语句,如果返回值正确,那就表示这个Mapper确实是我们自己写的那个
        User user = bean1.selectUserById(1);
        System.out.println(user);
    }
}

我们之前说我们在引导类中加载容器对象,这个容器怎么体现呢?就是通过引导类中执行的方法的返回值就是容器对象,既然容器对象有了,我们直接getBean,获取到SqlSessionFactory也是可以的吧,如果这个地方不理解,说明之前在Spring阶段对于容器以及被容器管理的Bean的理解不是很到位。

我们获取这个Bean,顺便获取我们的Mapper的动态代理对象的Bean肯定也是可以获取到的吧,因为我们的Mapper接口会在Bean中生成一个动态代理对象,否则单纯的接口是肯定没法调用的。

最后我们用Mapper调用方法试一下,这个Mapper对象是否可以正常的执行,其实我们知道这个程序是肯定可以执行成功的,关键在于执行结果:

第一个最上面的红色框中的是不是就是我们的SqlSessionFactory对象啊,只不过它加了一个Default表示这是一个默认的,他自己内部维护的,那么第二个自然就是我们的Mapper动态代理对象了,前缀是Mapper,Proxy表示代理。下面的红色框就是我们的执行结果,获取到的内容跟我们数据库中的内容是一样的,说明我们的配置是正确的。右边需要看的就是一个单词叫做Hikari,这是SpringBoot的默认的数据源,在之后我们会详细的介绍SpringBoot内部维护的多个数据源方案,以及如何配置我们自己的数据源方案。

总结: 

我们这一节主要讲的是SpringBoot如何整合MyBartis,其实非常的简单,就是引入依赖,写配置,做测试。和之前Spring中的整合,省去了测试Jar包冲突的部分,省去了配置SqlSessionFactory的部分,省去了配置Mapper扫描器的部分,在之后我们还会整合很多的第三方技术,其实基本流程都差不多,我们之后会总结SpringBoot整合第三方技术的基本流程。

现阶段我们只需要知道如何使用SpringBoot整合MyBatis,以及如何在程序中使用MyBatis的技术与数据库做交互

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。