以下为 Jean 学习笔记和习题整理,供学习和参考

# DefaultSqlSession 是线程安全的吗?

线程不安全的,一般整合 Spring 框架使用。

Spring 是怎么解决 MyBatis 这个数据安全问题的?

线程不安全的原因:多个线程操作同一个对象,而这个对象被定义了一个成员变量,解决的方案就是把这个成员变量变成一个局部变量,让多个线程不能操作就可以了;

创建了 SqlSessionTemplate 模板对象,定义了数据库操作相关的方法,本质上是通过代理对象获取了 DefaultSqlSession 对象来执行,而且把 DefaultSqlSession 对象声明在局部变量中,从而解决了线程不安全问题。

# MyBatis 中的缓存设计

1. 在 MyBatis 中有一个单独的缓存模块 -> 用到的装饰器模式

2. 缓存使用的 cache 标签

3.MyBatis 中支持的缓存分类

一级缓存:基于会话(默认)

二级缓存:基于进程

三级缓存:分布式

# 在 MyBatis 缓存中执行顺序

二级缓存 -> 一级缓存 -> 数据库查询

# MyBatis 的工作原理

# 1.MyBatis 启动加载

SqlSessionFactory: 会完成全局配置文件和映射文件的加载解析操作,然后呢会把相关的信息保存的 Configuration 对象中。创建的 SqlSessionFactory 对象的实现是 DefaultSqlSessionFactory 对象

SqlSession: 通过 SqlSessionFactory 获取了 SqlSession 对象,创建的具体的实例是 DefaultSqlSession

# 2.MyBatis 如何处理请求的

SqlSession 中提供了处理请求的方法:select update delete save 方法

调用对应的 Executor 处理,如果有配置缓存处理 --> 先走二级缓存,然后再走一级缓存,如果缓存中都没有查询到对应的数据,才会走数据库操作,交个 StatementHandler 来处理,通过 ParameterHandler 处理 SQL 中的占位符,通过 ResultSetHandler 处理结果集的映射。|

# MyBatis 中 Mapper 接口一致的操作

1.Mapper 接口的方法名和 mapper.xml 的文件名要一致

2.Mapper 接口的方法名要在 mapper.xml 中存在相同的 Id

3.Mapper 接口的返回类型要和 xml 中定义的 sql 标签的返回值类型一致。

4.Mapper.xml 的 namespace 必须要和 Mapper 接口的全类路径名一致

# 介绍 MyBatis 中的执行器有哪些

SimpleExecutor: 简单的执行器,每次执行操作都会开启一个新的 Statement 对象,用完就立刻关闭

ReuseExecutor: 重复使用的执行器,实现了对 Statement 对象的复用

BatchExecutor: 可以批处理任务的执行器。所有的执行器都必须是在 SqlSession 的生命周期之内。

# MyBatis 中的分页

逻辑分页和物理分页:

逻辑分页:不是真正的分页,RowBounds 来进行分页

物理分页:通过拦截器实现

select * from xxx ---> select t.* from (select * from xxx) t limit 0,10

# 映射文件中处理 CRUD 操作的标签外还有哪些标签

sql: SQL 代码片段

cache: 缓存

cache-ref:

resultMap

全局配置文件中的标签:

properties

settings

typeHandler

interceports

elements

mappers

...

# MyBatis 中用到了哪些设计模式

1. 缓存模块:装饰器模式

2. 日志模块:适配器模式

3.SqlSessionFactory: 工厂模式

4.Mapper 接口:代理模式

5.SqlSessionFactoryBuilder: 建造者模式

6....

# 如何获取自动生成的主键

在使用 insert 标签的时候,usergeneratedKeys=true keyproperty='id'

# 属性名和字段名不一致的情况

1. 查询的 SQL 语句我们通过别名处理

2. 通过 resultMap 来设置字段和属性的映射关系

# #和 $ 什么区别

#{} 是预编译处理,在 mybatis 处理 #{} 的时候会替换成?然后调用 PrepareStatement 的 set 方法来对?赋值

${} 在 MyBatis 处理的时候直接替换,会有 SQL 注入的风险

# MyBatis 有哪些缺点

1.SQL 语句的编程量大

2.SQL 语句和具体的数据库依赖很大,导致数据库的移执性差,不能随意的切换数据库

# 为什么要用 mybatis

1. 基于 SQL 编程,相对于更加灵活

2. 和 JDBC 相比,减少了 50% 的代码量

3. 很好的和各种数据库兼容

4. 能够和 spring 很好兼容

5. 提供了非常灵活的标签

# 什么是 MyBatis

是一个半 ORM 框架(对象关系映射)-->Hibernate 全 ORM 框架 --> 基于 JDBC 封装的框架

专注于 SQL 语句,不用关注 JDBC 流程

·

更新于

请我喝[茶]~( ̄▽ ̄)~*

Jean 微信支付

微信支付

Jean 支付宝

支付宝

Jean 贝宝

贝宝