MyBatis面试题, MyBatis 是否支持延迟加载?如果支持,它的实现原理是什么?
MyBatis面试题, MyBatis 是否支持延迟加载?如果支持,它的实现原理是什么?
QA
Step 1
Q:: MyBatis 是否支持延迟加载?如果支持,它的实现原理是什么?
A:: MyBatis 支持延迟加载。延迟加载是一种在需要时才加载实际数据的技术,而不是在初始查询时加载所有相关数据。MyBatis 的延迟加载通过代理对象实现。当访问一个懒加载的属性时,代理对象会触发加载逻辑,从数据库中获取实际数据。这种方式提高了系统性能,减少了不必要的数据加载和传输。
Step 2
Q:: MyBatis 中的一级缓存和二级缓存有什么区别?
A:: MyBatis 中的一级缓存是 SqlSession 级别的缓存,它在一个 SqlSession 生命周期内有效,默认开启,作用域是会话级别。而二级缓存是 Mapper 映射级别的缓存,不同 SqlSession 共享,生命周期较长,默认是关闭的,需要在配置文件中手动开启。一级缓存用于减少重复查询,提高性能,二级缓存用于跨会话的数据共享。
Step 3
Q:: MyBatis 动态 SQL 是什么?如何使用?
A:: MyBatis 动态 SQL 是指在映射文件中使用标签(如 <if>、<choose>、<when>、<otherwise>、<foreach>
等)根据条件动态生成 SQL 语句。通过动态 SQL,可以在运行时根据传入的参数灵活构建 SQL 语句,避免在 Java 代码中拼接 SQL,提高代码可读性和维护性。
Step 4
Q:: 如何在 MyBatis 中进行批量操作?
A:: MyBatis 支持批量操作,主要通过 ExecutorType.
BATCH 配置实现。在创建 SqlSession 时设置 ExecutorType 为 BATCH,然后在一次会话中执行多次操作,最后统一提交。这样可以减少数据库交互次数,提高批量操作性能。
Step 5
Q:: MyBatis 的缓存机制如何配置和使用?
A:: MyBatis 提供了两级缓存机制。一级缓存是 SqlSession 级别的,默认开启,不需要额外配置。二级缓存需要在配置文件中开启,并在映射文件中指定 <cache>
标签。可以自定义缓存实现类,配置缓存策略(如 LRU、FIFO、Soft Reference 等)。二级缓存提高了查询性能,但需要注意缓存一致性问题。