MyBatis 面试题, MyBatis 写个 Xml 映射文件,再写个 DAO 接口就能执行,这个原理是什么?
MyBatis 面试题, MyBatis 写个 Xml 映射文件,再写个 DAO 接口就能执行,这个原理是什么?
QA
Step 1
Q:: 什么是 MyBatis?简述其原理和工作流程。
A:: MyBatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。它消除了几乎所有的 JDBC 代码和手工设置参数及获取结果集的工作。MyBatis 使用 XML 或注解将接口和 SQL 语句配置关联。工作流程主要包括:1. 加载配置文件;2. 创建 SqlSessionFactory;3. 通过 SqlSession 执行数据库操作;4.
释放资源。
Step 2
Q:: MyBatis 的核心组件是什么?各自的作用是什么?
A:: MyBatis 的核心组件包括 SqlSessionFactory、SqlSession、Mapper 接口、Mapper XML 映射文件。SqlSessionFactory 用于创建 SqlSession 实例,SqlSession 是执行 SQL 语句的核心对象,Mapper 接口定义了数据库操作方法,Mapper XML 映射文件存储了 SQL 语句与对象的映射关系。
Step 3
Q:: MyBatis 中如何实现动态 SQL?
A:: MyBatis 通过 XML 映射文件中的 <if>、<choose>、<when>、<otherwise>、<trim>、<where>、<set>
等标签实现动态 SQL。这些标签可以根据条件动态生成 SQL 语句,减少代码冗余,提高灵活性。
Step 4
Q:: MyBatis 如何处理多表关联查询?
A:: MyBatis 通过 resultMap 标签支持复杂的多表关联查询。可以使用 association 和 collection 标签来映射一对一和一对多关系,同时可以通过嵌套查询或嵌套结果映射多表关联数据。
Step 5
Q:: MyBatis 如何进行缓存管理?
A:: MyBatis 提供了一级缓存和二级缓存机制。一级缓存是 SqlSession 级别的缓存,默认开启,同一 SqlSession 下的相同查询会命中缓存。二级缓存是跨 SqlSession 的缓存,通过在映射文件中配置 <cache>
标签来开启,多个 SqlSession 共享同一个缓存区域。
Step 6
Q:: MyBatis 的延迟加载是如何实现的?
A:: MyBatis 的延迟加载通过创建代理对象实现。当查询结果需要使用某些字段时,才会触发真正的 SQL 查询。这可以通过在映射文件中配置 lazyLoadingEnabled 和 aggressiveLazyLoading 属性来控制。
Step 7
Q:: MyBatis 和 Hibernate 的区别是什么?
A:: MyBatis 和 Hibernate 都是持久层框架,但 MyBatis 是半自动 ORM 框架,需要手写 SQL;而 Hibernate 是全自动 ORM 框架,能够自动生成 SQL。MyBatis 更加灵活,适合复杂查询场景,而 Hibernate 更加注重对象与数据库的映射,适合简单对象模型的场景。
Step 8
Q:: MyBatis 如何防止 SQL 注入?
A:: MyBatis 通过 #{} 占位符机制来安全地传递参数,防止 SQL 注入。#{} 会将参数预编译成 SQL 语句,从而避免恶意 SQL 代码的执行,而 ${}
是直接拼接参数到 SQL 语句中,容易导致 SQL 注入。
Step 9
Q:: MyBatis 中如何使用自定义类型处理器?
A:: MyBatis 允许用户自定义类型处理器来处理数据库类型和 Java 类型之间的转换。用户可以实现 org.apache.ibatis.type.
TypeHandler 接口,并在映射文件中使用 typeHandler 属性或全局配置文件中注册自定义类型处理器。
Step 10
Q:: MyBatis 中的 Mapper 接口与 XML 映射文件如何关联?
A:: MyBatis 通过接口的全限定名(如 com.example.mapper.
UserMapper)与 XML 映射文件的 namespace 属性关联。Mapper 接口中的方法名和参数类型与 XML 映射文件中的 SQL 标签 id 和 parameterType 一一对应,实现接口调用 SQL。