一、为什么要使用延迟加载?

  • 使用延迟加载的意义

    在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度快。

    如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询。当需要关联信息时才进行查询就叫做延迟加载。mybatis中resultMap提供延迟加载功能,通过resultMap配置延迟加载。

在mybatis-config.xml中配置全局参数

<!-- 全局配置参数 -->
<settings>
<!-- 延迟加载总开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 设置按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>

二、案例

  • 需求:查询订单并且关联查询消费者信息,要求只有使用到消费者信息的时候才发送查询用户信息的sql语句。

2.1   创建数据库表和实体对象

Customer.java

package com.shyroke.entity;

public class Customer {
private int user_id;
private String user_name;
private String user_sex;
private String user_birthday;
//隐藏get和set方法

Order.java

package com.shyroke.entity;

public class Orders {
private int order_id;
private String order_number;
private String order_createTime;
private String order_note;
private String user_id;
//消费者信息,为了保存查询得到的关联的User表的信息(一对一)
private Customer customer;
//隐藏get和set方法

2.2 创建OrderMapper.java接口和   OrderMapper.xml配置文件

OrderMapper.java

package com.shyroke.mapper;

import java.util.List;

import com.shyroke.entity.Orders;

public interface OrderMapper {
public List<Orders> selectOrderByLazyLoading();
}

OrderMapper.xml

<?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.shyroke.mapper.OrderMapper"> <resultMap type="com.shyroke.entity.Customer" id="customerMap">
<id column="user_id" property="user_id"/>
<result column="user_name" property="user_name"/>
<result column="user_sex" property="user_sex"/>
<result column="user_birthday" property="user_birthday"/>
</resultMap> <resultMap type="com.shyroke.entity.Orders" id="orderByLazyLoading">
<id column="order_id" property="order_id"/>
<result column="order_number" property="order_number"/>
<result column="order_createTime" property="order_createTime"/>
<result column="order_note" property="order_note"/>
<result column="user_id" property="user_id"/> <association property="customer" select="findCustomerById" column="user_id"></association>
</resultMap> <select id="findCustomerById" parameterType="int" resultMap="customerMap">
SELECT * FROM CUSTOMER WHERE user_id=#{value}
</select> <select id="selectOrderByLazyLoading" resultMap="orderByLazyLoading">
SELECT * FROM orders
</select>
</mapper>
  • association标签中的select属性:延迟加载执行的sql所在的statement的id,如果不在同一个namespace需要加namespace  。

sql:根据用户id查询消费者信息 column:关联查询的列

property:将关联查询的用户信息设置到Orders的哪个属性

  • 整个流程大概为:当需要用到消费者信息时才会发送association标签中select="findCustomerById"对应的select标签中id=“findCustomerById”的sql语句。

2.3 在总配置文件中打开延迟加载的开启

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!--开启延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings> <environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC" />
<property name="username" value="root" />
<property name="password" value="" />
</dataSource>
</environment>
</environments> <mappers>
<package name="com.shyroke.mapper"/>
</mappers> </configuration>

2.4   测试

package com.shyrolk.firstMybatis;

import java.io.IOException;
import java.io.InputStream;
import java.util.List; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import com.shyroke.entity.Orders;
import com.shyroke.mapper.OrderMapper; /**
* Hello world!
*
*/
public class App {
public static void main(String[] args) throws IOException {
String resource = "resource/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sessionFactory.openSession(); OrderMapper orderMapper = session.getMapper(OrderMapper.class);
List<Orders> orderList = orderMapper.selectOrderByLazyLoading(); System.out.println(orderList.get(0).getOrder_id()); }
}

结果:

  • 一对多查询延迟加载

    一对多延迟加载的方法同一对一延迟加载,在collection标签中配置select内容。

(九)mybatis之延迟加载的更多相关文章

  1. mybatis的延迟加载、一级缓存、二级缓存

    mybatis的延迟加载.一级缓存.二级缓存 mybatis是什么? mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入 ...

  2. Mybatis之延迟加载机制

    1.  延迟加载的含义: 用到的时候才会去进行相关操作 2.  延迟加载的例子: 2.1 spring的BeanFactory,在getBean()的时候才创建Bean 2.2 物理分页查询,只有点击 ...

  3. Mybatis的延迟加载和缓存

    1. MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟加载规则推迟对关联对象的select查询.延迟加载可以有效的减少数据库压力.       注意:MyBatis的延迟加 ...

  4. Mybatis 测试延迟加载

    在学习mybatis的延迟加载时,对 lazyLoadingEnabled 和 aggressiveLazyLoading 的区别并不理解,特别是对查询的条件不同时,执行的查询语句也不一样,所以还是测 ...

  5. Mybatis的延迟加载和立即加载

    Mybatis的延迟加载和立即加载 示例:在一对多中,当我们有一个用户,他有100个帐户 问题1:在查询用户时,要不要把关联的账户查出来? 问题2:在查询账户时,要不要把关联的用户信息查出来? 问题1 ...

  6. MyBatis学习--延迟加载

    简介 在resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能.例如:我们查询订单并 ...

  7. 8.Mybatis的延迟加载

    在Mybatis中的延迟加载只有resultMap可以实现,ResultMap 可以实现高级映射(association,collection可以实现一对1和一对多的映射),他们具有延迟加载的功能,r ...

  8. 七 mybatis的延迟加载

    1       延迟加载 1.1     什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.coll ...

  9. mybatis的延迟加载

    1. 什么是延迟加载 举个例子: 如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息.把对用户信息的按需去查询就是延迟加载. 所以延迟加载即先从单 ...

随机推荐

  1. D.Dwarf Tower

    Vasya在玩一个叫做"Dwarf Tower"的游戏,这个游戏中有n个不同的物品, 它们的编号为1到n.现在Vasya想得到编号为1的物品. 获得一个物品有两种方式: 直接购买该 ...

  2. libmidas.so.2

    libmidas.so.2 libmidas.so.2文件,使DATASNAP FOR LINUX中间件,支持OleVariant格式的序列,使TDataSetProvider+TClientData ...

  3. es6语法中的arrow function=>

    (x) => x + 相当于 function(x){ ; }; var ids = this.sels.map(item => item.id).join() var ids = thi ...

  4. python小白之数组索引

    索引 numpy中的数组索引形式和Python是一致的.如: np.arange(10) print x[2]  #单个元素,从前往后正向索引.注意下标是从0开始的. print x[-2]  #从后 ...

  5. ISO/IEC 9899:2011 条款5——5.2.1 字符集

    5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...

  6. Java 8 Steam 例子整理

    Java 8 Steam 例子整理 kexue 关注 2016.06.06 17:44* 字数 1860 阅读 3901评论 0喜欢 6 IBM: Java 8 中的 Streams API 详解 为 ...

  7. C++ - 第一个程序

    代码: #include <iostream> using namespace std; int main() { cout << "hello!" < ...

  8. Golang 项目 GOPATH 总结

    查看GOPATH go env 项目里执行:go  get  github/winyh/XXX 命令时, 包会下载到 GOPATH第一个目录下的src文件夹 项目里引入依赖的时候会自动到GOPATH里 ...

  9. 单例模式-java

    /** * The MIT License * Copyright (c) 2014-2016 Ilkka Seppälä * <p> * Permission is hereby gra ...

  10. PostgreSQL学习笔记——事务

    事务时需要在同一处理单元中执行的一系列更新处理的集合.通过使用事务,可以对数据库中的数据更新处理的提交和取消进行管理. 事务处理的终止指令包括COMMIT(提交处理)和ROLLBACK(取消处理)两种 ...