本篇整理了 2021 年 MyBatis 常见面试题并附带详细答案,帮助求职者更好地准备面试。内容涵盖 MyBatis 基础知识、核心概念、高级应用等方面,希望能够为读者提供有价值的参考。

1. 什么是 MyBatis?

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

2. MyBatis 的优点有哪些?

  • 简单易学:MyBatis 本身就很小且简单。没有任何第三方依赖,最简单的安装只需要两个 JAR 文件+配置几个 SQL 映射文件易于学习,易于使用。
  • 灵活:MyBatis 不会对应用程序或者数据库的现有设计强加任何影响。 SQL 写在 XML 里,便于统一管理和优化。
  • 解耦 SQL 与程序代码:通过提供 DAO 层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。
  • 提供映射标签,支持对象与数据库的 ORM 字段关系映射。
  • 提供对象关系映射标签,支持对象关系组件维护对象关系。

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

  • #{} 是预编译处理,MyBatis 会将 sql 中的 #{} 替换为?号,调用 PreparedStatement 的 set 方法来赋值。
  • ${} 是字符串替换,MyBatis 会将 sql 中的 ${} 替换为变量的值。

4. MyBatis 的一级、二级缓存?

  • 一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 后,该 Session 中的所有 Cache 就将清空。
  • 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。

5. MyBatis 如何进行分页?

  • 使用 RowBounds 对象进行分页,它是 MyBatis 内置的分页插件,通过拦截 StatementHandlerprepare 方法,修改要执行的 sql 语句,添加分页内容。
  • 使用分页插件,如 PageHelper,它在编译 sql 语句时动态的将分页的语句添加到 sql 语句中。

6. 简述 MyBatis 的插件运行机制

MyBatis 仅可以编写针对 ParameterHandler、ResultSetHandler、StatementHandler、Executor 这 4 种接口的插件,MyBatis 通过动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这 4 种接口对象的方法时,就会进入拦截方法,具体就是 InvocationHandler 的 invoke()方法,当然,只会拦截那些你指定需要拦截的方法。

7. MyBatis 动态 sql 是做什么的?都有哪些动态 sql?

MyBatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。

MyBatis 提供了 9 种动态 sql 标签:

  • trim | where | set
  • foreach | if | choose
  • when | otherwise | bind

8. MyBatis 的 Xml 映射文件中,不同的 Xml 映射文件,如果配置的信息一致,能不能引用?

答案是可以的,可以使用 标签,提取公共代码片段,以及 标签,引入外部 Xml 文件。

......

总结

本篇整理了部分 MyBatis 常见面试题,并进行了详细解答,希望能对大家有所帮助。MyBatis 作为一款优秀的持久层框架,其应用非常广泛,深入理解其原理和使用方法对于 Java 开发者来说至关重要。