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

  • 使用延迟加载的意义

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

    如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询。当需要关联信息时才进行查询就叫做延迟加载。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. The First Python man in Github

    Python date VS(可视化了一下前几名) 查了下Github上星星最多的Python man 或许这就是目标吧 刚刚改了github.

  2. qt mvc3

    前面两节讲的model是一维的,这次开始二维的也就是我们常说的Table,相对与list,我们多了一个列的概念. 下面讲解一个例子.我先说明一下我们这个例子,在程序目录下,我们有一个文本文件,其中存放 ...

  3. Flutter移动电商实战 --(41)详细页_数据接口的调试

    建立数据模型层,我们的业务逻辑分开,然后进行后台数据的调试 生成model类 json数据: { "code": "0", "message" ...

  4. TP框架修改后台路径方法

      直接映射 admin 后台修改路径为 myadmin888       文章来源:外星人来地球 欢迎关注,有问题一起学习欢迎留言.评论

  5. Nginx中文文档-安装 Nginx

    nginx可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好. ububtu平台编译环 ...

  6. ArcGIS 10.5 tensorflow安装日记

    ArcGIS 10.5 tensorflow安装日记 商务科技合作:向日葵,135-4855__4328,xiexiaokui#qq.com Datetime: 2019年5月27日星期一 Os: w ...

  7. MediaPlayer: MediaPlayer中的prepare方法和prepareAsync方法的区别

    prepare方法是将资源同步缓存到内存中,一般加载本地较小的资源可以用这个,如果是较大的资源或者网络资源建议使用prepareAsync方法,异步加载.但如果想让资源启动,即start()起来,因为 ...

  8. python分布式进程(windows下)

    分布式进程: 在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上. Py ...

  9. 建站之星v2.7快速更换模版

    网站建设很多人使用建站之星因为它的拖拽功能非常友好.但是很多人不会使用建站之星更换模版,网上的教程又复杂难懂,现在教大家一个简单快捷的办法. 方法/步骤     废话不多说,从模版目录找到你喜欢的模版 ...

  10. mysql插入数据时 insert IGNORE、ON DUPLICATE KEY UPDATE、replace into

    转: mysql insert时几个操作DELAYED .IGNORE.ON DUPLICATE KEY UPDATE的区别 博客分类: mysql基础应用   mysql insert时几个操作DE ...