Mybatis中的延迟加载
引言
在一对多种,当我们有一个用户,他有100个账户。
问题1:在查询用户时,要不要把关联的账户查出来?
问题2:在查询账户时,要不要把关联的用户查出来?
解决: 在查询用户时,用户下的账户信息应该是什么时候使用,什么时候查询。
在查询账户时,账户的所属用户信息应该随着账户查询时一起查询出来。
延迟加载的概念:
在真正使用数据时才发起查询,不用的时候不查询。按需加载(懒加载)。
立即加载的概念:
不管用不用,只要一调用方法,马上发起查询。
在对应四种表关系中:一对多,多对一,一对一,多对多
一对多,多对多:通常情况下采用延迟加载。
多对一,一对一:通常情况下采用立即加载。
一对一实现延迟加载
以账户account为例
在AccountMapper中修改resultMap
<!--定义和封装account和user的resultMap-->
<resultMap id="accountUserMap" type="account">
<id property="ID" column="ID"></id>
<result property="UID" column="UID"></result>
<result property="MONEY" column="MONEY"></result>
<!-- 一对一的关系映射,配置封装user的内容
select属性中指定的内容,查询用户的指定标志
column属性指定的内容,用户根据id查询时,所需要参数的值-->
<association property="user" column="UID" javaType="com.czy.domain.User"
select="com.czy.dao.UserDao.findById"
></association>
</resultMap>
此时进行测试
延迟加载并没有打开
开启延迟加载
在SqlMapConfig中设置(要放在properties后与typeAliases前)
<settings>
<!--延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
测试
使用到user
不使用user
多对一实现延迟加载
以用户user为例
主配置文件已完成配置
account中完成对应的方法(用于select属性的值)
List<Account> findByUid(int uid);
<select id="findByUid" resultType="account" parameterType="INT">
select * from account where UID = #{uid}
</select>
UserMapper配置
<!--定义User的resultMap-->
<resultMap id="userAccountMap" type="user">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="birthday" column="birthday"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
<!--配置user对象中的account集合-->
<collection property="accounts" ofType="account" column="id" select="com.czy.dao.AccountDao.findByUid">
</collection>
</resultMap>
<!--查询所有-->
<select id="findAll" resultMap="userAccountMap">
select * from user
</select>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!