Java面试题详解
一、请介绍 MyBatis 中二级缓存的一些情况
问题:MyBatis 中二级缓存的作用和使用方法是什么?
答案:
- 一级缓存:默认开启,数据存储在 SqlSession 的生命周期中,SqlSession 关闭后缓存释放。由于 SqlSession 通常使用后马上关闭,缓存生存时间短,命中率低。
- 二级缓存:作用范围更大,属于 Mapper namespace 级别。数据存储在 namespace 级别的缓存中,随着 MyBatis 加载长期存在于内存中,命中率比一级缓存高得多。
- 二级缓存的开启和使用:
- 在 Mapper XML 文件中增加
<cache>
子标签,可配置缓存的淘汰算法、刷新时间、缓存数据总长度及是否只读。 - 开启二级缓存后,所有查询操作会先从缓存中提取数据,若无则进行实际查询并将结果存入缓存。
- 涉及写操作时,会更新底层数据库并清空当前 namespace 下的二级缓存,因此对于频繁写入的表不建议开启二级缓存。
- 可通过
useCache="FALSE"
禁用特定查询的缓存,或使用flushCache
在执行操作后强制清空缓存。
- 在 Mapper XML 文件中增加
二、请介绍 MyBatis 支持哪些缓存淘汰策略
问题:MyBatis 中支持的缓存淘汰策略有哪些?
答案:
- FIFO(先进先出):先进入的缓存数据优先被淘汰。
- LRU(最近最少使用):常用策略,最近频繁访问的数据保留,长时间未访问的数据优先淘汰。
- SOFT(软引用):基于 JVM 的垃圾回收机制,内存不足时清理软引用数据。
- WEAK(弱引用):比软引用更积极,垃圾回收时会清理弱引用数据。
三、请介绍 MyBatis 获取新记录自增主键是如何做到的
问题:MyBatis 如何获取新记录的自增主键?
答案:
- 对于支持自增主键的数据库(如 MySQL、SQL Server):
- 在
<insert>
标签中设置useGeneratedKeys="true"
,并指定keyProperty
和keyColumn
。 - 底层通过数据库的
last_insert_id()
函数获取最新主键值,并回填到实体对象的属性中。该函数基于连接执行,线程安全。
- 在
- 对于不支持自增主键的数据库(如 Oracle):
- 使用
<selectKey>
子标签,通过序列(sequence)生成主键值。 - 在插入数据前执行
<selectKey>
语句获取序列值,并将其注入到实体对象的属性中,再执行插入操作。
- 使用