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

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

目录

  • 一、原生MyBatis
    • 1.1 API基本流程
    • 1.2 缓存
      • 1.2.1 一级缓存
      • 1.2.2 二级缓存
    • 1.3 嵌套懒查询
      • 1.3.1 样例
    • 1.3 配置Mappers
    • 1.4 两种编程模型
      • 1.4.1 面向XML
      • 1.4.2 面向接口
  • 二、Spring For MyBatis
    • 2.1 Spring整合的MyBatis的优势
    • 2.2 API 基本流程
      • 2.2.1 配置DataSource
      • 2.2.2 SqlSessionFactoryBean
      • 2.2.3 SqlSessionTemplate
        • 2.2.3.1 创建SqlSessionTemplate Bean
        • 2.2.3.2 DAO
        • 2.2.3.3 配置DAO
      • 2.2.4 发现并注册映射器
        • 2.2.4.1 单个注册映射器
        • 2.2.4.2 批量注册映射器
  • 三、SpringBoot For MyBatis
    • 3.1 引入Starter依赖
    • 3.2 自动装配
    • 3.3 开发流程
      • 3.3.1 YML配置
      • 3.3.2 DAO
      • 3.3.3 ServiceImpl
      • 3.3.4 发现与注册Mapper
  • 四、参考
  • 五、未完待续

一、原生MyBatis

1.1 API基本流程

  • 创建全局配置文件

  • 创建Mapper XML文件

  • 创建SqlSessionFactoryBuilder


  • 创建SqlSessionFactory


  • 创建SqlSession(Thread Not Safe)


1.2 缓存

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

1.2.1 一级缓存

  • 一级缓存总是开启的
  • 一级缓存作用域存在于SqlSession中,在不同的SqlSession间是无法进行缓存共享
  • 在同一个SqlSession中,在两次查询语句中进行了删、改、增,则会清空一级缓存,之后重新查询数据库

1.2.2 二级缓存

  • 二级缓存可以开启也可以关闭,在MyBatis3中二级缓存默认被开启
  • 二级缓存作用域存在于NameSpace中(即一个Mapper映射文件),在同一个Mapper中不同的SqlSession都可以共享
  • 当进行了删、改、增,除了会清空一级缓存,同样也会清空二级缓存,之后重新查询数据库
  • 当一级缓存Close时,一级缓存的数据才会保存到二级缓存中(除非设置了flushCachefalse

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文件

  • resource

    使用相对于类路径的资源引用

  • url

    使用完全限定资源定位符

  • class

    使用映射器接口实现类的完全限定名,

    除了需要满足1.4.2小节的面向接口查询之外还要满足下述条件:

    Mapper XML文件必须和Java Dao类同名同包

  • name

    通过package标签将包中的所有类注册成映射器

1.4 两种编程模型

1.4.1 面向XML

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

1.4.2 面向接口

优点:

  • 解决了参数类型的限定
  • 返回值的限定
  • 面向接口思路更加清晰


二、Spring For MyBatis

2.1 Spring整合的MyBatis的优势

  • 将DAO层纳入容器中,并使用Spring原生的数据源配置与事务控制
  • 在最优配置情况下,Spring会帮我们完成DaoImpl的动态类,从而进一步解放我们对MyBatis的API层操作

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 批量注册映射器
  • 使用XML配置

    在Spring的XML配置中添加如下代码,base-package需要指定DAO的类路径

  • 使用注解方式

    在标注@Configuration的配置类中,在类上标注注解:


三、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一样,有两种方式:

  • XML

    在XML中使用,但你会在SpringBoot中再去写这些XML吗?没特殊原因肯定不会了。

  • 注解

    • 在每个DAO类中标注@Mapper
    • 在全局的@Configuration配置类中,使用@MapperScan扫描

四、参考

  • MyBatis:https://mybatis.org/mybatis-3/zh/index.html
  • Spring MyBatis:http://mybatis.org/spring/zh/index.html
  • SpringBoot MyBatis:http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/index.html#

五、未完待续

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

你可能感兴趣的:(Mybatis从原生开发到Spring、SpringBoot整合(一))