备战金九银十 你必须知道的Mybatis面试题

1. #{}和${}的区别是什么?

#{}是预编译处理,${}是字符串替换。
Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;
Mybatis 在处理时,就是把{}替换成变量的值。
使用#{}可以有效的防止 SQL 注入,提高系统安全性。

2. Mybatis 是如何进行分页的?分页插件的原理是什么?

Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内 存分页,而非物理分页,可以在 sql 内直接书写带有物理分页的参数来完成物 理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插 件的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对 应的物理分页语句和物理分页参数。

3. 当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

第 1 种: 通过在查询的 sql 语句中定义字段名的别名,让字段名的别名和实体 类的属性名一致
第 2 种: 通过来映射字段名和实体类属性名的一一对应的关系

4.为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?

 Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关 联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。
 而 Mybatis 在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所 以,称之为半自动 ORM 映射工具。

5.Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?

Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载, association 指的就是一对一,collection 指的就是一对多查询。在 Mybatis 配置 文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。
它的原理是,使用 CGLIB 创建目标对象的代理对象,当调用目标方法时,进入拦 截器方法,比如调用 a.getB().getName(),拦截器 invoke()方法发现 a.getB() 是 null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来, 然后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName()方法的调用。这就是延迟加载的基本原理。
当然了,不光是 Mybatis,几乎所有的包括 Hibernate,支持延迟加载的原理 都是一样的。

6.简述 Mybatis 的插件运行原理,以及如何编写一个插件

7.如何获取自动生成的(主)键值?

8.MyBatis 与 Hibernate 有哪些不同?

9.Mybatis 都有哪些 Executor 执行器?它们之间的区别是什么?

10.Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?

11.在 mapper 中如何传递多个参数

12.Mybatis 动态 sql 是做什么的?都有哪些动态 sql?能简述一下动态 sql 的执 行原理不?

13.通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个 Dao 接 口的工作原理是什么?Dao 接口里的方法,参数不同时,方法能重载吗?

14.接口绑定有几种实现方式,分别是怎么实现的?

15…Mybatis 都有哪些 Executor 执行器?它们之间的区别是什么?

16.Mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形 式?

17.Xml 映射文件中,除了常见的 select|insert|update|delete 标签之外,还 有哪些标签?

18. 一级、二级缓存

19. Mybatis 映射文件中,如果 A 标签通过 include 引用了 B 标签的内容,请问, B 标签能否定义在 A 标签的后面,还是说必须定义在 A 标签的前面?

20.简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系?

这些都是我曾经刷过的和最近一个多月整理出来的一些面试题及答案,在这里给大家分享出来,有兴趣的小伙伴可以关注公众号 l谈java 以上问题pdf的获取在里面。

你可能感兴趣的:(java)