【串线篇】sql映射文件-分布查询(上)association 1-1

1.场景

1把钥匙带1把锁

JavaBean:private Lock lock;//当前钥匙能开哪个锁;

1)、

interface KeyDao:

public Key getKeyByIdSimple(Integer id);//步一

interface LockDao:

public Lock getLockByIdSimple(Integer id);//步二

2)、

KeyDao.xml:

<!--     id  keyname     lockid   -->

 <select id="getKeyByIdSimple" resultMap="mykey02">

        select * from t_key where id=#{id}

 </select>

LockDao.xml:

<select id="getLockByIdSimple" resultType="com.atguigu.bean.Lock">

        select * from t_lock where id=#{id}

</select>

定义两个最原生简单的查询,作为两步

3)、KeyDao.xml:

<resultMap type="com.atguigu.bean.Key" id="mykey02">

        <id property="id" column="id"/>

        <result property="keyName" column="keyname"/>

        <!--告诉mybatis自己去调用一个查询查锁子,步二

        select="":指定一个查询sql的唯一标识;mybatis自动调用指定的sql将查出的lock封装进来

        <!--column:指定将哪一列的数据传递过去,传递到LockDao.xml:

          -->

        <association property="lock"

            select="com.atguigu.dao.LockDao.getLockByIdSimple"

            column="lockid" fetchType="lazy"></association>

</resultMap>

【注意】LockDao.xml:中select * from t_lock where id=#{id}这个id是单个属性可以随便写{haha}

关键是会将KeyDao.xml:中column="lockid" 作为参数传入

Key表                                                            Lock表

 

 

4)、测试

KeyDao mapper = openSession.getMapper(KeyDao.class);    

Key key = mapper.getKeyByIdSimple(1);

System.out.println(key);

【打印】

Key [id=1, keyName=1号钥匙, lock=Lock [id=1, lockName=1号锁]]

2.延迟加载(全局)和按需加载(属性)

由于分布查询的第二步mybatis自己去调用一个查询查锁子,步二,也就是说在测试的时候Key key = mapper.getKeyByIdSimple(1);返回的这个key一定是包括Lock信息的不管你需不需要。这就会造成严重的性能问题

在全局配置文件mybatis-config.xml配置两项

<settings>

        <!-- 开启延迟加载开关 -->

        <setting name="lazyLoadingEnabled" value="true"/>

        <!-- 开启属性按需加载 -->

        <setting name="aggressiveLazyLoading" value="false"/>

</settings>

测试:

Key key = mapper.getKeyByIdSimple(1);

           

            System.out.println(key);//只会发一条sql,即步1

           

//          Thread.sleep(3000);

//          String lockName = key.getLock().getLockName();//规定这个时候再发第二条sql,即步2

//          System.out.println(lockName);

3.不过

<resultMap type="com.atguigu.bean.Key" id="mykey02">

        <id property="id" column="id"/>

        <result property="keyName" column="keyname"/>

        <!--告诉mybatis自己去调用一个查询查锁子,步二

        select="":指定一个查询sql的唯一标识;mybatis自动调用指定的sql将查出的lock封装进来

        column:指定将哪一列的数据传递过去

          -->

        <association property="lock"

            select="com.atguigu.dao.LockDao.getLockByIdSimple"

            column="lockid" fetchType="lazy"></association>

</resultMap>

在<association></association>标签体里有一个属性

fetchType="lazy"/eager

会覆盖这两个全局配置

原文地址:https://www.cnblogs.com/yanl55555/p/11936441.html