mybatis 面试

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

#{}:表示使用预编译的 SQL 语句,参数会被转义并以安全的方式插入到 SQL 语句中。它可以防止 SQL 注入攻击,并且对于字符串类型的参数会自动添加引号。

${}:表示使用字符串替换的形式,在 SQL 语句中直接替换成参数的值。它不会进行预编译和转义,存在潜在的安全风险,因此需要确保传入的参数是可信的。

2 mybatis 有几种分页方式?

基于数据库的分页:通过在 SQL 语句中使用特定的语法或函数(如 MySQL 的 LIMIT)来实现分页。

基于应用程序的分页:通过在查询之后,使用 Java 代码来处理结果集,截取所需的数据实现分页。这种方式相对较为灵活,但需要额外的代码逻辑。

3 RowBounds 是一次性查询全部结果吗?为什么?

不是。RowBounds 是 MyBatis 提供的一种分页查询的方式,它可以通过设置偏移量和限制数量,从结果集中截取指定范围的数据。

它并不会一次性查询全部结果,而是在数据库层面进行分页查询,减少了网络传输的数据量。

4 mybatis 逻辑分页和物理分页的区别是什么?

逻辑分页:通过应用程序对结果集进行截取和处理,只返回指定范围的数据,不涉及数据库层面的分页操作。逻辑分页的实现比较灵活,但在处理大量数据时性能可能较差。

物理分页:通过在 SQL 语句中使用数据库提供的分页语法(如 MySQL 的 LIMIT)来实现分页,数据库会返回指定范围的数据。物理分页具有更好的性能,尤其是对于大型数据集。

5 mybatis 是否支持延迟加载?延迟加载的原理是什么?

MyBatis 支持延迟加载。延迟加载的原理是通过代理对象延迟加载关联对象的数据。当访问关联对象时,

会触发额外的 SQL 查询,从而获取关联对象的数据。这样可以减少不必要的查询,提高性能。

6 说一下 mybatis 的一级缓存和二级缓存?

MyBatis 的一级缓存是指在同一个 SqlSession 中共享的缓存,它默认是开启的。一级缓存的作用域是 SqlSession,当多次查询相同的数据时,第一次查询的结果会被缓存下来,后续的查询可以直接从缓存中获取结果。

二级缓存是指在不同的 SqlSession 之间共享的缓存,需要手动配置开启。它的作用域是 Mapper 命名空间,可以跨多个 SqlSession 共享缓存。二级缓存使用了缓存提供商(如 Ehcache、Redis)来实现数据的存储和管理。

7 mybatis 和 hibernate 的区别有哪些?

定位:MyBatis 是一款持久层框架,注重 SQL 的灵活性和性能优化;Hibernate 是一个全功能的 ORM(对象关系映射)框架,提供了更高层次的抽象。

配置方式:MyBatis 使用 XML 或注解进行配置;Hibernate 使用 XML、注解或 Java 代码进行配置。

对象关系映射:MyBatis 需要手动编写 SQL,灵活性较高;Hibernate 自动完成对象与数据库表之间的映射,开发者不需要编写 SQL。

缓存:MyBatis 提供了一级缓存和二级缓存;Hibernate 提供了一级缓存、二级缓存和查询缓存。

学习曲线:相对而言,MyBatis 的学习曲线较平缓,更适合对 SQL 有较深理解的开发者;Hibernate 的学习曲线较陡峭,更适合对面向对象思想较熟悉的开发者。

8 mybatis 有哪些执行器(Executor)?

SimpleExecutor:每执行一次 SQL,就会开启一个 Statement 对象,用完即刻关闭。

ReuseExecutor:重用预处理语句(PreparedStatement),在同一个会话中重复使用。

BatchExecutor:批量执行 SQL 语句,通过 JDBC 的 addBatch 和 executeBatch 方法来实现高效的批处理操作。

9 mybatis 分页插件的实现原理是什么?

MyBatis 分页插件的实现原理是通过拦截器(Interceptor)机制来实现的。插件会拦截 Executor 对象的方法调用,根据传入的分页参数动态修改 SQL 语句,从而实现分页查询的功能。

10 mybatis 如何编写一个自定义插件?

编写自定义插件需要实现 MyBatis 的 Interceptor 接口,并重写其中的方法。在插件的拦截方法中,可以通过反射修改 SQL 语句、增加额外的逻辑等。然后,在 MyBatis 的配置文件中配置插件,指定要拦截的方法和插件的顺序。

相关推荐
Nil20820 分钟前
leetcode 763划分字母区间
算法·leetcode·职场和发展
不会就选b2 小时前
算法日常・每日刷题--<动态规划>19
算法·leetcode·职场和发展
考研保研资料分享2 小时前
新闻传播保研经验:中传预推免面试、广告学代表作与实习准备(2025)
面试·职场和发展
夏幻灵4 小时前
每日一题:LeetCode 165:比较版本号
算法·leetcode·职场和发展
智码看视界6 小时前
C++智能指针全景剖析及面试20问
开发语言·c++·深度学习·面试·内存管理·智能指针
触底反弹8 小时前
🎯 LangSmith 学习与面试全攻略:从 Agent「盲盒」到全链路观测与量化评估
人工智能·面试
一tiao咸鱼8 小时前
还在手动海投?我做了个 AI 求职助手,自动筛选 BOSS 职位再精准投递
前端·后端·面试
她的男孩9 小时前
权限通了、列表有数,一点分页就炸Forge Admin 用 COUNT(1) 扛住复杂待办
java·spring boot·mybatis
Nil20810 小时前
leetcode 300最长递增子序列
算法·leetcode·职场和发展
考研保研资料分享11 小时前
通信工程保研经验合辑:北航、北理工申请与夏令营、预推免面试(2025)
面试·职场和发展