MyBatis学习总结(24)——Mybatis常见问题汇总
发布日期:2025-04-14 07:50:22 浏览次数:11 分类:精选文章

本文共 1384 字,大约阅读时间需要 4 分钟。

Mybatis常见问题解析

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

#{} 是预编译处理,用于防止 SQL 注入,通过将其替换为 ? 号后使用 PreparedStatement 的 set 方法赋值。而 ${} 是简单的字符串替换,直接将变量的值替换到 SQL 语句中。

预编译处理:通过将 #{} 转换为 ? 号,避免直接使用用户输入的数据,提升安全性。

字符串替换:直接将 ${} 替换为变量值,适用于非敏感的场景。

2. Dao 接口的工作原理及方法重载情况

Dao 接口是 Mybatis 中的 Mapper 接口,接口名对应 Xml 映射文件的 namespace,方法名对应MappedStatement的 id,参数与 SQL 相关。由于方法是基于全限名和方法名唯一的, Dao 接口的方法不能重载。

工作原理:通过 JDK 动态代理生成代理对象,拦截接口方法,执行对应的 SQL 操作。

方法重载:不支持重载,因为方法的唯一性依赖于全限名和方法名。

3. Mybatis 分页的实现及插件原理

Mybatis 提供两种分页方式:RowBounds 内存分页和物理分页。RowBounds 适用于结果集内存分页,而物理分页通常通过分页插件实现。

分页插件原理:通过拦截 SQL 并添加物理分页语句,如 LIMIT 和 OFFSET,支持自定义插件实现。

4. Mybatis 如何封装结果并映射对象

映射形式

  • 使用 <resultMap> 标签定义列名与属性映射。
  • 使用列别名与对象属性名对应,例如 T_NAME AS NAME

原理:通过反射创建对象并赋值属性,未映射的属性无法赋值。

5. Xml 映射文件中的其他标签

除了基本标签,还有动态 SQL 标签如 trimwheresetforeach 等,用于复杂 SQL 操作和动态条件构建。

6. Mybatis 插件运行原理及编写方法

插件基于 JDK 动态代理,拦截指定接口方法,通过拦截器实现功能。编写插件需实现相应接口,配置插件类和接口拦截方法。

接口类型:ParameterHandler、ResultSetHandler、StatementHandler、Executor。

7. 一级和二级缓存机制

一级缓存:基于 PerpetualCache HashMap,存储作用域为 Session。

二级缓存:默认也是 PerpetualCache,存储作用域可定,支持自定义存储源如 Ehcache。

更新机制:C/U/D 操作会清空相应缓存层。

8. Mybatis 是否支持延迟加载

支持关联对象和集合的延迟加载,通过拦截器在发现关联对象 null 时,单独查询并赋值。

原理:使用 CGLIB 代理,拦截方法调用,执行延迟加载 SQL。

9. Xml 映射文件中包含引用标签的处理

被引用的标签可以定义在任何位置,解析时会重新识别并处理。

原理:解析过程中记录未解析标签,待所有标签解析后重新解析引用标签。

10. Xml 映射文件与 Mybatis 数据结构的关系

Xml 配置封装到 Configuration 对象,各标签解析为相应对象如 ParameterMap、ResultMap 和 MappedStatement。Sql 解析为 BoundSql 对象。

上一篇:MyBatis学习总结(23)——Mybatis打印Sql语句配置
下一篇:MyBatis学习总结(25)——Mybatis Generator generatorConfig.xml配置文件详细说明

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月28日 11时58分08秒