Mybatis从原生开发到Spring、SpringBoot整合

2021-08-24  本文已影响0人  小驴小驴

这是一篇极简的介绍MyBatis原生开发到一路继承Boot的编程演变过程,旨在回忆吧。

目录

一、原生MyBatis

1.1 API基本流程

1.2 缓存

MyBatis中的缓存分为一级缓存二级缓存,其中一级缓存默认是开启的,二级缓存可以手动开启与关闭,当进行数据库查询时,先查询二级缓存(如果二级缓存处于开启状态)再进行一级缓存

1.2.1 一级缓存

1.2.2 二级缓存

1.3 嵌套懒查询

这种方式应该用的不算多;

正常情况下多表关联查询,一般直接在Mapper中编写SQL语句即可,然后使用resultMap进行结果集的映射(配合association或者collection)。

但假设有的时候表关联过多,但是很多表查询出的数据呢,在Java代码中可能并不需要获取而只是获取某些特定数据格式的关联表的数据,这句话有点绕,举个例子:

现在要关联查询A、B、C表,但是只有符合A.id=双数 && b.name like 'chaoyang%'这样的数据条件时且符合这样条件的数据很少很少。当Java代码才需要获取表C的数据,这个时候,就可以利用懒加载了。伪代码如下:

1.3.1 样例

1.3 配置Mappers

在全局配置文件中一共有四种方式配置Mapper文件

1.4 两种编程模型

1.4.1 面向XML

这种方式的好处是不需要写DAO代码,而是直接编写XML代码即可,XML中的namespace随便填写即可:

1.4.2 面向接口

优点:

二、Spring For MyBatis

2.1 Spring整合的MyBatis的优势

2.2 API 基本流程

2.2.1 配置DataSource

当Spring与MyBatis整合之后,数据源信息可以不配置在MyBatis的全局配置文件中配置,而由Spring进行配置管理。


2.2.2 SqlSessionFactoryBean

在Spring整合后,使用SqlSessionFactoryBean来创建原先的SqlSessionFactory对象

2.2.3 SqlSessionTemplate

SqlSessionTemplate是MyBatis-Spring的核心,作为SqlSession的一个实现,这意味着可以使用他无缝代替你代码中已经使用的SqlSession

SqlSessionTemplate是线程安全的,同一个对象可以被多个DAO或映射器所共享使用。

此外,它管理 session 的生命周期,包含必要的关闭、提交或回滚操作。另外,它也负责将 MyBatis 的异常翻译成 Spring 中的 DataAccessExceptions

2.2.3.1 创建SqlSessionTemplate Bean
2.2.3.2 DAO

Dao实现类中也可以实现SqlSessionDaoSupport,然后通过getSession()方法获得SqlSession对象

2.2.3.3 配置DAO

2.2.4 发现并注册映射器

在原生MyBatis和上面的Spring For MyBatis中,发现还是需要编写类似于DaoImpl的角色,还是需要操作SqlSession接口子类对象;

这种背景下,Spring利用字节码技术去为Dao生成实现类,从而解放开发者对Impl类的编写。

在Service层直接注入DAO对象即可直接操作。

就有了如下的配置方案:

2.2.4.1 单个注册映射器

前提:配置了SqlSessionFactory BeanSelSessionTemplate Bean、只编写DAO接口而不需要编写Impl

这样Spring就会为我们生成一个Dao的代理对象了。

但是这样的配置有个问题就是,假设有100个DAO接口,就得配置100个这样的Mapper bean。因此就有了下述的批量注册方案。

2.2.4.2 批量注册映射器

三、SpringBoot For MyBatis

从简而言,SpringBoot相比于Spring而言,其自动配置是很大的亮点,只需要编写少量的配置,Boot就可以自动帮我们创建出相关的Bean对象并纳入容器中。

SpringMyBatis的整合中,开发模式基本如下:

  • 创建SqlSessionFactoryBean
  • 创建SqlSessionTemplate
  • 自己编写DaoImpl或者开启Mapper-Scan让Spring帮助生成DaoImpl代理类
  • 将Dao注入到Service层即可

3.1 引入Starter依赖

3.2 自动装配

(注:这里不明白自动装配流程的,可以先去熟悉一下,自动装配不是本节重点)

在项目External Libraries文件夹下,找到MyBatis的自动装配:

顺着思路,点开进入类:org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration,可以看见类上一系列的注解:

这些注解不是本文所讨论的,不熟悉的可以去看一下@Condition注解。这里的基本意思是,在编译后的类路径中需要有SqlSessionFactorySqlSessionFactoryBean这些类,且要配置了DataSource,并且需要在DataSourceAutoConfigurationMybatisLanguageDriverAutoConfiguration加载完毕之后再去加载本类。

在源码中继续往下看,会看到两个非常熟悉的Bean:

那就明白了,我们再次借助SpringBoot这样优秀的框架可以帮我们节省这两个类的XML装配代码(就像上述的Spring一样)。

因此我们只需要将注意力放入Mapper的编写即可:

3.3 开发流程

3.3.1 YML配置

3.3.2 DAO

3.3.3 ServiceImpl

3.3.4 发现与注册Mapper

这是用于让Spring扫描我们的DAO类然后自动生成代理类,减少我们对DaoImpl的开发。

这一点同Spring一样,有两种方式:

四、参考

五、未完待续

下一篇介绍一下MyBatis的运行原理与插件开发流程。

上一篇 下一篇

猜你喜欢

热点阅读