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方法运行结果获取。

  • 相关阅读:
    ippicv_windows_20151201.zip免费分享地址
    C++获取电脑上连接的多个摄像头名称与编号
    Opencv Laplacian(拉普拉斯算子)
    Java3D-对象基本变换
    opencv3更换图片背景
    解析IFC数据并存储到关系型数据库
    opencv生成灰度图并保存
    opencv3.2加载图片
    matlab rand(3,5)
    水利工程建设标准强制性条文 2016
  • 原文地址:https://www.cnblogs.com/8593l/p/12781572.html
Copyright © 2011-2022 走看看