【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>
这两个配置的意义如下表:
配置的时候还需要注意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延迟加载》】
- 【MyBatis框架点滴】——MyBatis延迟加载
- 【MyBatis框架点滴】——MyBatis二级缓存
- mybatis——延迟加载
- MyBatis——【延迟加载】
- Mybatis框架学习(三)—高级映射,延迟加载
- Mybatis学习系列——延迟加载
- 【MyBatis框架点滴】——MyBatis输入映射
- 【MyBatis框架点滴】——MyBatis输出映射
- 【MyBatis框架点滴】——MyBatis一对一查询
- 【MyBatis框架点滴】——MyBatis一对多查询
- 【MyBatis框架点滴】——MyBatis多对多查询
- 【MyBatis框架点滴】——MyBatis一级缓存
- 【MyBatis框架】高级映射-延迟加载
- 【MyBatis框架】高级映射-延迟加载
- MyBatis延迟加载
- mybatis延迟加载
- MyBatis延迟加载
- Mybatis延迟加载
- gearman在虚拟机上运行没有自动开启的处理
- 如何用googleChrome调试Android程序呢?_Stetho
- c++第七次上机实验
- 【侃山】走进VR开发世界——VR会是未来社会发展的最大动力之一吗?
- 第十二周项目一(3)-实现复数类中的运算符重载
- 【MyBatis框架点滴】——MyBatis延迟加载
- 实验十二 更新语句
- C++作业7
- Android官方开发文档Training系列课程中文版:网络操作之网络管理
- memcache 安装教程
- C++第七次实验
- c++第七次上机作业
- 学学Gearman
- 网络安全菜鸟的学习路程