MyBatis 面试题, MyBatis 执行原理了解吗?
MyBatis 面试题, MyBatis 执行原理了解吗?
QA
Step 1
Q:: MyBatis 执行原理了解吗?
A:: MyBatis 的执行原理可以分为以下几个步骤:首先是加载配置文件并解析,这包括读取 MyBatis 的主配置文件和映射文件。接下来是创建 SqlSessionFactory 对象,这一步通过配置文件生成。然后是通过 SqlSessionFactory 创建 SqlSession,SqlSession 是 MyBatis 与数据库交互的核心对象。最后是通过 SqlSession 执行 SQL 语句,MyBatis 根据映射文件中的配置将 SQL 语句动态生成并执行。执行结果通过 ResultHandler 处理后返回。
Step 2
Q:: MyBatis 中的 SqlSession 是线程安全的吗?
A:: SqlSession 不是线程安全的,它的生命周期应该是短暂的,一般在每次数据库操作时创建,操作完毕后关闭。由于 SqlSession 不是线程安全的,在多个线程中共享一个 SqlSession 会导致线程安全问题,因此每次数据库操作应该获取一个新的 SqlSession。
Step 3
Q:: MyBatis 中的缓存机制是如何实现的?
A:: MyBatis 提供了一级缓存和二级缓存。一级缓存是 SqlSession 级别的缓存,默认开启,作用范围是一个 SqlSession 中的多次数据库查询操作;二级缓存是 Mapper 级别的缓存,可以跨 SqlSession 共享,默认是关闭的,需要手动配置启用。缓存的实现原理是将查询结果保存在内存中,当同样的查询再次执行时直接返回缓存中的结果,而不再去数据库查询,从而提高性能。
Step 4
Q:: 如何在 MyBatis 中使用动态 SQL?
A:: MyBatis 中的动态 SQL 是通过 XML 映射文件中的元素(如 <if>、<choose>、<when>、<otherwise>、<foreach>、<where>、<trim>
)来实现的。动态 SQL 允许根据传入的参数动态地生成不同的 SQL 语句,例如在查询条件中根据参数值决定是否添加某个 WHERE 子句。动态 SQL 的使用可以提高查询的灵活性,但也可能增加代码的复杂度,使用时需要谨慎。
Step 5
Q:: MyBatis 与 Hibernate 的区别是什么?
A:: MyBatis 和 Hibernate 都是 ORM 框架,但它们有显著的区别。MyBatis 是一种半自动的 ORM 框架,主要通过 XML 文件或注解来映射 SQL 语句,灵活性高但需要手动编写 SQL;而 Hibernate 是全自动的 ORM 框架,它通过 HQL(Hibernate Query Language)或 Criteria API 自动生成 SQL 语句,并且提供了丰富的对象关系映射功能。MyBatis 更适合对 SQL 语句有精细控制要求的场景,而 Hibernate 适合更注重开发效率的场景。