zoukankan      html  css  js  c++  java
  • 【串线篇】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

    会覆盖这两个全局配置

  • 相关阅读:
    单词统计
    学习进度_第十周
    学习进度_第九周
    典型用户、场景分析
    一维数组4.25
    《构建之法》阅读笔记03
    学习进度_第八周
    《构建之法》阅读笔记02
    夏壹队——nabcd
    个人作业阶段二 4
  • 原文地址:https://www.cnblogs.com/yanl55555/p/11936441.html
Copyright © 2011-2022 走看看