关于java:Mybatis常见面试题

7次阅读

共计 2660 个字符,预计需要花费 7 分钟才能阅读完成。

1、MyBatis 中 #{} 和 ${} 的区别是什么?

{} 是预编译解决,${} 是字符替换。

在应用 #{} 时,MyBatis 会将 SQL 中的 #{} 替换成“?”,配合 PreparedStatement 的 set 办法赋值,这样能够无效的避免 SQL 注入,保障程序的运行平安。

2、MyBatis 有哪两种分页形式?
逻辑分页:应用 MyBatis 自带的 RowBounds 进行分页,它是一次性查问很多数据,而后在数据中再进行检索。

物理分页:本人手写 SQL 分页或应用分页插件 PageHelper,去数据库查问指定条数的分页数据的模式。

3、RowBounds 是一次性查问全副后果吗?为什么?
不是。RowBounds 外表是在“所有”数据中检索数据,其实并非是一次性查问出所有数据。

因为 MyBatis 是对 jdbc 的封装,在 jdbc 驱动中有一个 Fetch Size 的配置,它规定了每次最多从数据库查问多少条数据,如果你要查问更多数据,它会在你执行 next() 的时候,去查问更多的数据。

就好比你去主动取款机取 10000 元,但取款机每次最多能取 2500 元,所以你要取 4 次能力把钱取完。只是对于 jdbc 来说,当你调用 next() 的时候会主动帮你实现查问工作。这样做的益处能够无效的避免内存溢出。

4、MyBatis 是否反对提早加载?提早加载的原理是什么?
MyBatis 反对提早加载,设置 lazyLoadingEnabled=true 即可。

提早加载的原理的是调用的时候触发加载,而不是在初始化的时候就加载信息。比方调用 a. getB(). getName(),这个时候发现 a. getB() 的值为 null,此时会独自触发当时保留好的关联 B 对象的 SQL,先查问进去 B,而后再调用 a. setB(b),而这时候再调用 a. getB(). getName() 就有值了,这就是提早加载的基本原理。

当然了,不光是 Mybatis,简直所有的包含 Hibernate,反对提早加载的原理都是一样的。

5、说一下 MyBatis 的一级缓存和二级缓存?
一级缓存:基于 PerpetualCache 的 HashMap 本地缓存,它的生命周期是和 SQLSession 统一的,有多个 SQLSession 或者分布式的环境中数据库操作,可能会呈现脏数据。当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认一级缓存是开启的。

二级缓存:也是基于 PerpetualCache 的 HashMap 本地缓存,不同在于其存储作用域为 Mapper 级别的。如果多个 SQLSession 之间须要共享缓存,则须要应用到二级缓存,并且二级缓存可自定义存储源,如 Ehcache。默认不关上二级缓存,要开启二级缓存,应用二级缓存属性类须要实现 Serializable 序列化接口 (可用来保留对象的状态)。

开启二级缓存数据查问流程:二级缓存 -> 一级缓存 -> 数据库。

缓存更新机制:当某一个作用域(一级缓存 Session/ 二级缓存 Mapper)进行了 C /U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。

6、MyBatis 有哪些执行器(Executor)?
MyBatis 有三种根本的 Executor 执行器:

SimpleExecutor:每执行一次 update 或 select 就开启一个 Statement 对象,用完立即敞开 Statement 对象;

ReuseExecutor:执行 update 或 select,以 SQL 作为 key 查找 Statement 对象,存在就应用,不存在就创立,用完后不敞开 Statement 对象,而是搁置于 Map 内供下一次应用。简言之,就是重复使用 Statement 对象;

BatchExecutor:执行 update(没有 select,jdbc 批处理不反对 select),将所有 SQL 都增加到批处理中(addBatch()),期待对立执行(executeBatch()),它缓存了多个 Statement 对象,每个 Statement 对象都是 addBatch() 结束后,期待逐个执行 executeBatch() 批处理,与 jdbc 批处理雷同。

作用范畴:Executor 的这些特点,都严格限度在 SqlSession 生命周期范畴内。

7、Mybatis 有哪四大对象?
Executor、ParameterHandler、StatementHandler、ResultSetHandler

8、MyBatis 分页插件的实现原理是什么?
分页插件的基本原理是应用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦挡办法内拦挡待执行的 SQL,而后重写 SQL,依据 dialect 方言,增加对应的物理分页语句和物理分页参数。

9、什么是 MyBatis 的接口绑定?有哪些实现形式?
接口绑定,就是在 MyBatis 中任意定义接口,而后把接口外面的办法和 SQL 语句绑定,咱们间接调用接口办法就能够,这样比起原来了 SqlSession 提供的办法咱们能够有更加灵便的抉择和设置。

接口绑定有两种实现形式:

通过注解绑定,就是在接口的办法下面加上 @Select、@Update 等注解,外面蕴含 Sql 语句来绑定;

通过 xml 外面写 SQL 来绑定,在这种状况下,要指定 xml 映射文件外面的 namespace 必须为接口的全路径名。当 Sql 语句比较简单时候,用注解绑定,当 SQL 语句比较复杂时候,用 xml 绑定,个别用 xml 绑定的比拟多。

10、Mybatis 动静 sql 是做什么的?都有哪些动静 sql?能简述一下动静 sql 的执行原理不?
Mybatis 动静 sql 能够让咱们在 Xml 映射文件内,以标签的模式编写动静 sql,实现逻辑判断和动静拼接 sql 的性能,Mybatis 提供了 9 种动静 sql 标签:

trim、where、set、foreach|、if、choose、when、otherwise、bind。

其执行原理为,应用 OGNL 从 sql 参数对象中计算表达式的值,依据表达式的值动静拼接 sql,以此来实现动静 sql 的性能。

学习更多 JAVA 常识与技巧,关注与私信博主(666)
最次要的是给本人减少常识的储备,有恃无恐。最初给大家分享 Spring 系列的学习笔记和面试题,蕴含 spring 面试题、spring cloud 面试题、spring boot 面试题、spring 教程笔记、spring boot 教程笔记、最新阿里巴巴开发手册(63 页 PDF 总结)、2022 年 Java 面试手册。一共整顿了 1184 页 PDF 文档。私信博主(666)支付,祝大家更上一层楼!!!

正文完
 0