• Mybatis 延迟加载


    1、什么是延迟加载

    1. 延迟加载的条件:resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。
    2. 延迟加载的好处:
      先从单表查询、需要时再从关联表去关联查询,大大提高 数据库性能,因为查询单表要比关联查询多张表速度要快。
    3. 延迟加载的实例:
      如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。

    2、如何开启延迟加载功能

    1. Mybatis的延迟加载功能默认是关闭的

    2. 需要在SqlMapConfig.xml文件中通过setting标签配置来开启延迟加载功能

    3. 开启延迟加载的属性:
      lazyLoadingEnabled:全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。默认为false
      aggressiveLazyLoading:当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。默认为true

    4. 配置

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

    3、延迟加载的resultMap

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

    2. 延迟加载需要两个statement语句来完成

    3. 在resultMap中使用association或者collection来配置两个statement直接的管理

    4. resultMap代码 :

       <!--查询订单和创建订单的用户,使用延迟加载-->
       <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>
      

    4、延迟加载的mapper文件

    1. 必须要有两个statement

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

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

    5、mapper接口

      public List<Orders> findOrdersByLazyLoad() throws Exception;
    

    6、测试代码

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

    7、总结

    1. 不使用mybatis提供的association及collection中的延迟加载功能,如何实现延迟加载??
      实现方法如下:
      定义两个mapper方法:
      1、查询订单列表
      2、根据用户id查询用户信息
      实现思路:
      先去查询第一个mapper方法,获取订单信息列表
      在程序中(service),按需去调用第二个mapper方法去查询用户信息。

    2. 总之:
      使用延迟加载方法,先去查询简单的sql(最好单表,也可以关联查询),再去按需要加载关联查询的其它信息。

  • 相关阅读:
    Linux tcpdump 命令详解与示例
    Linux 查看磁盘IO并找出占用IO读写很高的进程
    Rsync 服务部署与参数详解
    Linux curl 表单登录或提交与cookie使用
    Linux curl 常用示例
    Linux curl 命令详解
    Linux下使用 github+hexo 搭建个人博客07-next主题接入搜索和站点管理
    Linux下使用 github+hexo 搭建个人博客06-next主题接入数据统计
    Linux下使用 github+hexo 搭建个人博客05-next主题接入评论系统
    Linux下使用 github+hexo 搭建个人博客04-next主题优化
  • 原文地址:https://www.cnblogs.com/jack1995/p/7260722.html
Copyright © 2020-2023  润新知