前情回顾:
在开始介绍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的技术与数据库做交互