前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【MyBatis框架点滴】——MyBatis延迟加载

【MyBatis框架点滴】——MyBatis延迟加载

作者头像
DannyHoo
发布2018-09-13 12:38:44
3890
发布2018-09-13 12:38:44
举报
文章被收录于专栏:Danny的专栏Danny的专栏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1337149

  什么是延迟加载?

  延迟加载(lazy load)是(也称为懒加载)Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。——摘自百度百科《延迟加载》

  当然,不光是Hibernate,MyBatis也支持延迟加载。

  这里继续以订单业务的例子来说明:

  如上图,以订单表为主查询表,关联查询对应用户的信息,默认只查询订单信息,当客户端用到用户信息时,才去关联查询用户信息。

  Orders.java

代码语言:javascript
复制
public class Orders {
    private Integer id;
    private Integer userId;
    private String number;
    private Date createtime;
    private String note;
    private User user;
    //getter、setter
}

  User.java

代码语言:javascript
复制
public class User {
    private int id;
    private String username;
    private int sex;
    private Date birthday;
    private String address;
    //getter、setter
}

  映射文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.danny.mybatis.mapper.OrdersMapper" >

<resultMap type="com.danny.mybatis.po.Orders" id="OrderUserLazyLoadingResultMap">
        <!-- 配置映射的订单信息 -->  
        <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"/>

        <!-- 配置映射的用户信息 -->
        <association property="user" javaType="com.danny.mybatis.po.User" select="com.danny.mybatis.mapper.UserMapper.findUserById" column="user_id">           
        </association>
    </resultMap>

    <select id="findOrderUserLazyLoading" resultMap="OrderUserLazyLoadingResultMap" >
        select * from orders
    </select>
</mapper>

  mapper接口

代码语言:javascript
复制
public interface OrdersMapper{
    List<Orders> findOrderUserLazyLoading() throws Exception;
}

  MyBatis默认是不支持延迟加载的,所以还要对系统进行配置,在MyBatis全局配置文件中进行如下配置:

代码语言:javascript
复制
<settings>
   <setting name="lazyLoadingEnabled" value="true"/>
   <setting name="aggressiveLazyLoading" value="false"/>
</settings>

  这两个配置的意义如下表:

设置项

描述

允许值

默认值

lazyLoadingEnabled

全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。

true、false

false

aggressiveLazyLoading

当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。

true、false

true

  配置的时候还需要注意MyBatis全局配置文件中的标签时有顺序的,从前到后应该为properties、settings、typeAliases、typeHandlers、objectFactory、plugins、environments、mappers,如果顺序颠倒,则会报错“元素类型为configuration的内容必须匹配(properties?,settings?,typeAliases?,typeHandlers?……”

  测试

代码语言:javascript
复制
@Test
public void findOrderUserLazyLoading(){
    SqlSession sqlSession=sqlSessionFactory.openSession();
    OrdersMapperCustom ordersMapperCustomMapper=sqlSession.getMapper(OrdersMapperCustom.class);
    try {
        List<Orders> list=ordersMapperCustomMapper.findOrderUserLazyLoading();
        if (list!=null) {
                System.out.println(list.get(0).getUser().getUsername());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

  断点调试时,当执行到List<Orders> list=ordersMapperCustomMapper.findOrderUserLazyLoading();时,可以在日志中发现执行的sql语句为select * from orders,如图:

  当执行完list.get(0).getUser().getUsername()时,可以在日志中发现系统又执行了select * from user where id=?,如图:

  上面的例子是通过association延迟加载,collection也是一样的。


【 转载请注明出处——胡玉洋《【MyBatis框架点滴】——MyBatis延迟加载》】

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年06月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档