IT评测·应用市场-qidao123.com技术社区

标题: MyBatis如那边理延迟加载? [打印本页]

作者: 魏晓东    时间: 2024-12-30 19:54
标题: MyBatis如那边理延迟加载?
各人好,我是锋哥。今天禀享关于【MyBatis如那边理延迟加载?】口试题。希望对各人有帮助;

MyBatis如那边理延迟加载?

1000道 互联网大厂Java工程师 精选口试题-Java资源分享网
MyBatis 支持 延迟加载(Lazy Loading),允许在必要数据时才从数据库加载,而不是在查询结果第一次返回时就立即加载所有数据。这种方式可以优化性能,减少不须要的数据库查询,提高应用的相应速度和资源利用服从。
延迟加载的原理

延迟加载的焦点头脑是,将关联对象或集合的加载推迟到真正必要时才举行加载,而不是在主查询时一次性加载。这可以通过两种主要方式实现:

MyBatis 通过代理模式(代理对象)和懒加载机制来实现延迟加载。以下是 MyBatis 如那边理延迟加载的具体信息:
1. 开启延迟加载

MyBatis 默认开启延迟加载机制,但你必要在配置文件中指定相关配置。
在 mybatis-config.xml 配置文件中:

  1. <settings>
  2.   <setting name="lazyLoadingEnabled" value="true"/>
  3.   <setting name="aggressiveLazyLoading" value="false"/>
  4.   <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode"/>
  5. </settings>
复制代码

2. 延迟加载的配置

在 MyBatis 中,可以通过以下几种方式配置延迟加载:
2.1 利用 resultMap 配置延迟加载

延迟加载通常与映射关系中的关联对象一起利用。比方,当你在 resultMap 中映射一个对象时,可以通过 fetchType 来指定加载计谋。
  1. <resultMap id="orderResultMap" type="Order">
  2.     <id property="id" column="order_id"/>
  3.     <result property="user" column="user_id" fetchType="lazy"/>
  4. </resultMap>
复制代码

fetchType 是 @Many 和 @One 注解的属性,控制关联对象的加载方式。
2.2 利用 @One 和 @Many 注解举行延迟加载

如果利用注解方式举行映射,可以利用 @One 和 @Many 注解来指定加载计谋:
  1. public class Order {
  2.     private int id;
  3.     private String name;
  4.     @One(fetchType = FetchType.LAZY)
  5.     private User user; // 延迟加载 User 对象
  6. }
复制代码
在这种配置下,user 关联对象会在访问时触发延迟加载。
2.3 在查询时设置延迟加载

在某些情况下,你可能希望通过在查询方法中控制延迟加载。你可以在 Mapper 中利用 @Select 注解来控制:
  1. @Select("SELECT * FROM orders WHERE id = #{id}")
  2. @Results({
  3.     @Result(property = "user", column = "user_id", one = @One(select = "com.example.mapper.UserMapper.selectUser", fetchType = FetchType.LAZY))
  4. })
  5. Order selectOrderById(int id);
复制代码
此时 user 关联对象会被延迟加载。
3. 怎样触发延迟加载

延迟加载是通过代理对象实现的。当你访问被延迟加载的关联对象时,MyBatis 会触发数据库查询。
比方,假设有一个 Order 对象,它有一个关联的 User 对象,在访问 Order 对象时,User 不会立即加载,只有当你访问 Order.getUser() 时,MyBatis 才会实行 SQL 查询,加载 User 数据。
  1. Order order = orderMapper.selectOrderById(1);
  2. User user = order.getUser();  // 此时会触发延迟加载,查询 User 数据
复制代码
4. 延迟加载的代理机制

为了支持延迟加载,MyBatis 在内部利用 代理模式 来创建一个代理对象。当你访问延迟加载的属性时,代理对象会触发实际的数据库查询,并将查询结果赋给原始对象。代理对象会在数据库查询后举行添补,并返回给调用者。

5. 注意事项


总结

MyBatis 提供了强大的延迟加载功能,它通过代理模式、fetchType 配置以及延迟加载触发机制来实现数据的按需加载。配置合理的延迟加载可以或许优化性能,减少不须要的数据库查询,但也必要小心处置惩罚 N+1 查询题目事务管理

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4