zoukankan      html  css  js  c++  java
  • Mybatis第六篇:延迟加载、鉴别器和继承

    一、延迟加载的两种配置方式(全局配置/resultMap配置)

      1、全局配置

      在mybatis-config.xml的文件中增加setting的配置标签

    <settings>
            <!--打开延迟加载的开关  -->
            <setting name="lazyLoadingEnabled" value="true"/>
            <!-- 当为true的时候,调用任意延迟属性,会去加载所有延迟属性,如果为false,则调用某个属性的时候,只会加载指定的属性 -->
            <setting name="aggressiveLazyLoading" value="false"/>
        </settings>

      resultMap配置

    <resultMap id="BaseResultMap7" type="entity.TOrder">
        <id column="id"  property="id" />
        <result column="user_id" property="userId" />
        <result column="create_time"  property="createTime" />
        <result column="up_time"  property="upTime" />
        <association property="tUser" javaType="entity.TUser" column="user_id" select="dao.TUserDao.selectById"/>
        <collection property="orderDetailList" ofType="entity.TOrderDetail" column="id" select="dao.TOrderDetailDao.selectByOrderid"/>
      </resultMap>

      TOrderDao.xml的sql方法

    <select id="selectOrderAllInfoById2" parameterType="java.lang.Integer" resultMap="BaseResultMap7">
        select
          t.id,
          t.user_id,
          t.create_time,
          t.up_time
        from
          t_order t
        where
          t.id = #{id,jdbcType=INTEGER}
      </select>

      TUserDao.xml的sql方法

    <select id="selectById" parameterType="java.lang.Integer" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from t_user
        where id = #{id,jdbcType=INTEGER}
      </select>

      TOrderDetailDao.xml的sql方法

    <select id="selectByOrderid" parameterType="integer" resultMap="BaseResultMap">
        SELECT
          id,
          order_id,
          goods_id,
          num,
          total_price
        from t_order_detail
        WHERE order_id = #{orderId,jdbcType=INTEGER}
      </select>

      test方法查询结果:

      test方法代码,可以在下面的执行结果中看出来,在获取order的tUser属性和orderDetailList属性时才会去触发级联属性的查询方法。

     @Test
        public void test15(){
            SqlSession sqlSession = sqlSessionFactory.openSession(true);
            TOrderDao orderDao = sqlSession.getMapper(TOrderDao.class);
            TOrder order = orderDao.selectOrderAllInfoById2(1);
            log.info("-----------------1");
            log.info("{}", order.gettUser());
            log.info("-----------------2");
            log.info("{}", order.getOrderDetailList());
            sqlSession.close();
        }

      2、resultMap配置,取消setting标签作为全局配置,在resultMap的级联查询中增加fetchType属性,并将其设置为lazy。

    <resultMap id="BaseResultMap7" type="entity.TOrder">
        <id column="id"  property="id" />
        <result column="user_id" property="userId" />
        <result column="create_time"  property="createTime" />
        <result column="up_time"  property="upTime" />
        <association property="tUser" javaType="entity.TUser" column="user_id" select="dao.TUserDao.selectById" fetchType="lazy"/>
        <collection property="orderDetailList" ofType="entity.TOrderDetail" column="id" select="dao.TOrderDetailDao.selectByOrderid" fetchType="lazy"/>
      </resultMap>

      各个dao层方法的sql语句按照上面的不做更改。执行test方法,结果截图如下。

     二、discriminator(鉴别器的使用)

      resultMap配置

    <resultMap id="BaseResultMap8" type="entity.TOrder">
        <id column="id"  property="id" />
        <result column="user_id" property="userId" />
        <result column="create_time"  property="createTime" />
        <result column="up_time"  property="upTime" />
        <discriminator javaType="int" column="id" >
          <case value="1">
            <association property="tUser" javaType="entity.TUser" column="user_id" select="dao.TUserDao.selectById" fetchType="lazy"/>
          </case>
          <case value="2">
            <collection property="orderDetailList" ofType="entity.TOrderDetail" column="id" select="dao.TOrderDetailDao.selectByOrderid" fetchType="lazy"/>
          </case>
        </discriminator>
      </resultMap>

      在test方法中传入主键id值1,运行结果:

       在test方法中传入主键id值2,运行结果:

     三、extends继承的使用

      extends继承的使用,使用在resultMap中,可以简化resultMap标签的书写。

      resultMap配置调整

    <resultMap id="BaseResultMap9" type="entity.TOrder" extends="BaseResultMap">
        <discriminator javaType="int" column="id" >
          <case value="1">
            <association property="tUser" javaType="entity.TUser" column="user_id" select="dao.TUserDao.selectById" fetchType="lazy"/>
          </case>
          <case value="2">
            <collection property="orderDetailList" ofType="entity.TOrderDetail" column="id" select="dao.TOrderDetailDao.selectByOrderid" fetchType="lazy"/>
          </case>
        </discriminator>
      </resultMap>

      sql方法调整:

    <select id="selectOrderAllInfoById2" parameterType="java.lang.Integer" resultMap="BaseResultMap9">
        select
          t.id,
          t.user_id,
          t.create_time,
          t.up_time
        from
          t_order t
        where
          t.id = #{id,jdbcType=INTEGER}
      </select>

      test方法运行结果获取。

  • 相关阅读:
    nginx(二)----ubuntu14.04下启动或重启和关闭nginx
    nginx(一)----ubuntu14.04下安装nginx
    ubuntu安装和查看已安装
    《太阳照常升起》
    [原]Jenkins(十四)---jenkins示例:admin管理所有项目,新建用户只能看部分项目
    第十二节:Nginx的简介、三种轮询配置方式、以及解决微服务架构负载均衡问题
    第一节:CDN、SLB、DNS(4层和7层)、IOT
    第三十节:Asp.Net Core中JWT刷新Token解决方案
    第六节:秒杀业务/超卖的几种解决思路
    第五节: Redis架构演变历程和cluster集群模式架构的搭建
  • 原文地址:https://www.cnblogs.com/8593l/p/12781572.html
Copyright © 2011-2022 走看看