MyBatis 面试题, MyBatis 是否支持延迟加载?如果支持,它的实现原理是什么?
MyBatis 面试题, MyBatis 是否支持延迟加载?如果支持,它的实现原理是什么?
QA
Step 1
Q:: MyBatis 是否支持延迟加载?如果支持,它的实现原理是什么?
A:: MyBatis 支持延迟加载。延迟加载是一种在实际使用到对象时才执行加载操作的设计模式。MyBatis 的延迟加载通过代理模式实现。具体来说,当查询某个对象时,MyBatis 会为该对象创建一个代理对象,直到访问该对象的延迟加载属性时,才触发 SQL 查询,获取数据。比如,在一个对象中有一个关联的集合属性(如订单对象中包含的订单项列表),MyBatis 会在访问这个集合时,才会去数据库中查询对应的订单项,从而实现延迟加载。
Step 2
Q:: MyBatis 的一级缓存和二级缓存有什么区别?
A:: MyBatis 的一级缓存是基于 SQLSession 的,也就是说在同一个 SQLSession 中执行相同的 SQL 语句,第一次查询时会将结果放入缓存,第二次查询相同的 SQL 会直接从缓存中获取结果,而不再执行数据库查询。二级缓存是基于 Mapper 映射文件的,同一个命名空间内的 SQL 查询共享这块缓存。当同一个 Mapper 中多次查询相同的数据时,可以使用二级缓存来减少数据库访问。
Step 3
Q:: MyBatis 中的动态 SQL 是如何实现的?
A:: MyBatis 中的动态 SQL 通过 <if>、<choose>、<when>、<otherwise>、<where>、<trim>、<set>、<foreach> 等标签来实现。这些标签可以根据传入参数的不同动态生成 SQL 语句。例如,<if>
标签可以根据条件来决定某段 SQL 是否加入到最终生成的 SQL 中。这样可以让 SQL 更加灵活,并且避免了在代码中拼接 SQL 的麻烦。
Step 4
Q:: MyBatis 中的 Mapper 接口是如何工作的?
A:: MyBatis 中的 Mapper 接口与其对应的 XML 映射文件或者注解相结合,通过动态代理机制来实现 SQL 的执行。当调用 Mapper 接口中的方法时,MyBatis 会自动为该接口生成一个实现类,这个实现类会根据方法名称和参数找到对应的 SQL 并执行,并将结果映射为指定的返回类型。