多学习。

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>
posted @   czyaaa  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示