mybatis的延时加载

1、定义


 

mybatis延时加载即用时查询,通常用于多表联级查询

 

2、好处


 

mybatis延时加载 把关联表的查询 拆分 一个个单表查询,关联的表需要时再去查询。提升性能

数据库单表查询性能 > 关联查询的性能

 

3、配置


 

默认关闭 如下全局配置中开启

 <settings>
     <!--开启延迟加载-->
     <setting name="lazyLoadingEnabled" value="true"/>
     <!--关闭积极加载-->
     <setting name="aggressiveLazyLoading" value="false"/>
 </settings>

4、使用


 

在resultMap中使用association或者collection,即可使用延迟加载。

如:

    1.  <!--查询订单和创建订单的用户,使用延迟加载-->
       <resultMap id="OrderAndUserLazyLoad" type="Orders">
           <id column="id" property="id"/>
           <result column="user_id" property="userId" />
           <result column="number" property="number" />
           <result column="createtime" property="createtime" />
           <result column="note" property="note" />
           <!--
           select:要延迟加载的statement的id
           colunm:关联两张表的那个列的列名
            -->
           <association property="user" javaType="User" select="findUser" column="user_id">
      
           </association>
       </resultMap>

       

    2. 必须要有两个statement
    3. 两个statement直接必须存在关联的数据列

       <select id="findOrdersByLazyLoad" resultMap="OrderAndUserLazyLoad">
           SELECT * FROM orders
       </select>
      
       <select id="findUser" parameterType="int" resultType="User">
           SELECT * FROM User WHERE id = #{value}
       </select>

       

       

      public void testFindOrdersByLazyLoad() throws Exception{
      SqlSession session = sessionFactory.openSession();
      Mapper mapper = session.getMapper(Mapper.class);
      //只会发送查询订单信息的SQL
      List orders = mapper.findOrdersByLazyLoad();
      for (Orders order : orders){
      //会发生查询用户信息的SQL
      order.getUser();
      }
      }

5、总结


 

association、collection支持延时加载

association:一对一映射

collection:一对多映射

 

参考:

https://www.cnblogs.com/dreamyoung/p/11801950.html

https://www.cnblogs.com/neon/p/10940346.html

posted @ 2020-08-08 20:22  蓝天随笔  阅读(273)  评论(0编辑  收藏  举报