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

来源:互联网 发布:js 静态资源公共库 编辑:程序博客网 时间:2024/05/30 04:03


  什么是延迟加载?

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


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

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

    这里写图片描述

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


  Orders.java

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

public class User {    private int id;    private String username;    private int sex;    private Date birthday;    private String address;    //getter、setter}


  映射文件

<?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接口

public interface OrdersMapper{    List<Orders> findOrderUserLazyLoading() throws Exception;}


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

<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?……


  测试

@Testpublic 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延迟加载》】

0 0
原创粉丝点击