阿里P8私藏的MyBatis 笔记曝光,从入门到精通,纵享源码细节

Hello,今天给各位童鞋们分享Mybatis,赶紧拿出小本子记下来吧!

image.png

1.Mybatis简要概述

1.1 什么是Mybatis

(1)MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

1.2 什么是持久层

(1)持久层就是数据持久化:持久化就是将程序的数据在持久状态和瞬时状态转化的过程

(2)完成持久化工作的代码块

2.配置详解

2.1 环境配置(environments)

(1)MyBatis 可以配置成适应多种环境,不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。即每个数据库对应一个SqlSessionFactory 实例

image.png
1.:

  1. id = development 默认使用的环境ID

2.:

  1. id = “development” 环境ID

3.

  1. 在 MyBatis 中有两种类型的事务管理器 JDBC/MANAGED.

    1. i.JDBC:这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。

    2. ii.MANAGED:这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期

    3. Mybatis默认使用的是JDBC

4.

a)dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。

b)有三种内建的数据源类型UNPOOLED POOLED JNDI

PS:Mybatis连接池默认使用的是POOLED

PS:下面的就是你的数据库连接信息了

2.2 属性(properties)

PS:在外部创建一个xxx.properties文件,输入一下信息

image.png

PS:引入外部的xx.properties文件

image.png

这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置

2.3 类型别名(typeAliases)

给实体类全类路径起别名

image.png

image.png
给包起别名

image.png

image.png

image.png

PS:给包起别名如果不去实体类使用注解的话,默认别名为该实体类的首字母小写(比如UserName实体类即为userName)

2.4 设置(Settings)

(1)这个可前往官网查看:mybatis.org/mybatis-3/z…

2.5 映射器(mappers)

MapperRegistry:注册绑定我们的Mapper文件

绑定方式1:

image.png

绑定方式2:

image.png

image.png

绑定方式3:

image.png

PS:映射文件与dao层的接口名字需一致,不然报如下错误

image.png

3.生命周期和作用域

3.1 SqlSessionFactoryBuilder

① 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了

② 因此SqlSessionFactoryBuilder实例的最佳作用域是方法作用域。即局部方法变量

3.2 SqlSessionFactory

①SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。它不需要多次创建。

②因此 SqlSessionFactory 的最佳作用域是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式

3.3 SqlSession

①每个线程都应该有它自己的 SqlSession 实例。

②SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域

③因此,我们需要在每次用完之后,赶紧关闭,否者资源会被占用。

4.resultMap(结果集映射)

4.1 问题演示

(1) 问题:当数据库字段跟实体类字段不一致时,就会出现获取到的内容为null的情况

(2) 解决:采用resultMap结果集映射–如下

image.png

其实这个只要将字段不一样的去映射就可以了,不必要一样的还去映射一遍(如下)

image.png

5.日志

5.1 开启日志等演示

(1)怎么开启日志:在mybatis核心配置文件开启

image.png

(2)开启Log4j日志工厂①需要先导入log4j的jar包

image.png

②去mybatis核心配置文件设置

image.png

③创建一个log4j.properties文件

image.png

④PS:日志对象,参数为当前类的class。日志对象的创建及用处如下图

image.png

6.分页

6.1 利用sql语句limit进行分页

PS:先写好一个sql语句

image.png
PS:接口定义好,使用万能的map来传参数

image.png
PS:编写测试类

image.png

7.使用注解开发

7.1 使用java注解(编写查询)

PS:在dao层接口方法上注解输入sql语句

image.png

PS:使用class文件注册绑定映射

image.png

PS:其它sql操作万变不离其宗。

image.png

PS:不想要每次增删改都手动提交,可以改 如图

image.png

8.多对一的处理(association:关联)

8.1 按照结果嵌套处理

PS:Student类

image.png

PS:Mapper.xml的查询语句编写

image.png

8.2 按照查询嵌套处理: 即子查询

PS:Student实体类上方有,就不贴出来了,直接上xml配置

image.png

9.一对多的处理(collection:集合)

9.1 按照结果嵌套处理

PS:Teacher实体类

image.png

PS:Mapper.xml查询语句编写

image.png

9.2 按照查询嵌套处理: 即子查询

PS:实体类上面有了,就不重复了,Mapper.xml编写

image.png

9.3 总结一下多对一与一对多

(1) 关联使用:association(多对一)(2) 集合使用:collection(一对多)(3) javaType和ofType

1)javaType用来指定实体类中属性的类型

2)ofType用来指定映射到list或者集合中的实体类类型,即泛型中的约束类型

10.动态SQL

10.1 什么是动态SQL

(1)动态SQL就是根据不同的条件生成不同的SQL语句

10.2 动态SQL之IF

PS:接口方法

image.png

PS:SQL编写

image.png

PS:测试

image.png

10.3 动态SQL语句之choose when otherwise

PS:接口方法

image.png

PS:SQL编写

image.png

PS:测试代码

image.png

10.4 动态SQL之set

PS:接口方法

image.png

PS:SQL编写

image.png

PS:测试

image.png

PS:这里还有个重要的点(这是官网的说法,可以理解一下)mybatis官网

image.png

10.5 动态SQL之foreach

PS:接口方法

image.png

PS:SQL编写

image.png
PS:测试代码

image.png

10.6 SQL片段

(1)SQL片段就是,当我们发现有些部分可以复用的时候,我们使用SQL片段将可以复用的部分提取出来

image.png

11.缓存

11.1 什么是缓存

(1)存在内存中的临时数据

(2)将用户经常查询的数据放在缓存中,用户去查询数据就不用从磁盘上查询,而是从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题

11.2 为什么使用缓存

(1)减少和数据库的交互次数,减少系统开销,提高系统效率

(2)当我们经常查询但是不经常改变的数据,就可以使用缓存

11.3 一级缓存

(1)一级缓存也叫本地缓存

(2)与数据库同一次会话期间查询的数据会放到本地缓存中,以后要用到这些数据的时候直接从缓存中拿,不需要再去查询数据库。

(3)一级缓存结束于你关闭SqlSession的时候。

(4)测试一级缓存

image.png

(5)缓存失效的情况:

1)使用更新 插入 删除语句的时候,缓存会更新,即失效。

2)关闭连接也会失效

3)手动清理缓存

4)不同Mapper文件

11.4 二级缓存

1.二级缓存也叫全局缓存2.基于namespace级别的缓存,一个名称空间对应一个二级缓存3.工作机制

1)一个会话查询到一条数据,这个数据就会被放在当前会话的一级缓存中。

2)如果会话关闭了,这个会话的一级缓存就没了,但是我们想要的是,这个一级缓存关闭了,数据会保存到二级缓存中

3)新的会话查询信息,就可以从二级缓存中获取内容。

4)不同的mapper查处的数据会放在自己对应的缓存中

4.开启二级缓存步骤:

···4.1先去mybatis核心配置文件开启cacheEnabled(虽然它默认就是true)···

image.png

···4.2 在当前Mapper.xml中使用二级缓存···

image.png

···4.3 注意点:一般记得要序列化实体类···

image.png
PS:二级缓存注意点:二级缓存是在一级缓存关闭之后才会将数据放到二级缓存的

11.5 缓存的一个原理(执行顺序)

1.缓存的一个原理(执行顺序)

  1. 先去二级缓存里查看是否有想要的数据,有就直接取

  2. 二级缓存没有再去一级缓存里查看是否有,有就直接取

  3. 如果一级缓存也没有,再去数据库查询,然后数据查询到的会放在一级缓存里,一级缓存关闭数据会放到二级缓存里去。大致就是这么个流程

12.自定义缓存

12.1 流程讲解

(1)首先老规矩先导包

<groupId>org.mybatis.caches</groupId>

<artifactId>mybatis-ehcache</artifactId>

<version>1.2.1</version>
复制代码

(2)然后配置ehcache.xml

image.png

好啦,今天的文章就到这里,希望能帮助到屏幕前迷茫的你们

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享