(九)mybatis之延迟加载
一、为什么要使用延迟加载?
使用延迟加载的意义
在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度快。
如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询。当需要关联信息时才进行查询就叫做延迟加载。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&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&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之延迟加载的更多相关文章
- mybatis的延迟加载、一级缓存、二级缓存
mybatis的延迟加载.一级缓存.二级缓存 mybatis是什么? mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入 ...
- Mybatis之延迟加载机制
1. 延迟加载的含义: 用到的时候才会去进行相关操作 2. 延迟加载的例子: 2.1 spring的BeanFactory,在getBean()的时候才创建Bean 2.2 物理分页查询,只有点击 ...
- Mybatis的延迟加载和缓存
1. MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟加载规则推迟对关联对象的select查询.延迟加载可以有效的减少数据库压力. 注意:MyBatis的延迟加 ...
- Mybatis 测试延迟加载
在学习mybatis的延迟加载时,对 lazyLoadingEnabled 和 aggressiveLazyLoading 的区别并不理解,特别是对查询的条件不同时,执行的查询语句也不一样,所以还是测 ...
- Mybatis的延迟加载和立即加载
Mybatis的延迟加载和立即加载 示例:在一对多中,当我们有一个用户,他有100个帐户 问题1:在查询用户时,要不要把关联的账户查出来? 问题2:在查询账户时,要不要把关联的用户信息查出来? 问题1 ...
- MyBatis学习--延迟加载
简介 在resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能.例如:我们查询订单并 ...
- 8.Mybatis的延迟加载
在Mybatis中的延迟加载只有resultMap可以实现,ResultMap 可以实现高级映射(association,collection可以实现一对1和一对多的映射),他们具有延迟加载的功能,r ...
- 七 mybatis的延迟加载
1 延迟加载 1.1 什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.coll ...
- mybatis的延迟加载
1. 什么是延迟加载 举个例子: 如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息.把对用户信息的按需去查询就是延迟加载. 所以延迟加载即先从单 ...
随机推荐
- D.Dwarf Tower
Vasya在玩一个叫做"Dwarf Tower"的游戏,这个游戏中有n个不同的物品, 它们的编号为1到n.现在Vasya想得到编号为1的物品. 获得一个物品有两种方式: 直接购买该 ...
- libmidas.so.2
libmidas.so.2 libmidas.so.2文件,使DATASNAP FOR LINUX中间件,支持OleVariant格式的序列,使TDataSetProvider+TClientData ...
- es6语法中的arrow function=>
(x) => x + 相当于 function(x){ ; }; var ids = this.sels.map(item => item.id).join() var ids = thi ...
- python小白之数组索引
索引 numpy中的数组索引形式和Python是一致的.如: np.arange(10) print x[2] #单个元素,从前往后正向索引.注意下标是从0开始的. print x[-2] #从后 ...
- ISO/IEC 9899:2011 条款5——5.2.1 字符集
5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...
- Java 8 Steam 例子整理
Java 8 Steam 例子整理 kexue 关注 2016.06.06 17:44* 字数 1860 阅读 3901评论 0喜欢 6 IBM: Java 8 中的 Streams API 详解 为 ...
- C++ - 第一个程序
代码: #include <iostream> using namespace std; int main() { cout << "hello!" < ...
- Golang 项目 GOPATH 总结
查看GOPATH go env 项目里执行:go get github/winyh/XXX 命令时, 包会下载到 GOPATH第一个目录下的src文件夹 项目里引入依赖的时候会自动到GOPATH里 ...
- 单例模式-java
/** * The MIT License * Copyright (c) 2014-2016 Ilkka Seppälä * <p> * Permission is hereby gra ...
- PostgreSQL学习笔记——事务
事务时需要在同一处理单元中执行的一系列更新处理的集合.通过使用事务,可以对数据库中的数据更新处理的提交和取消进行管理. 事务处理的终止指令包括COMMIT(提交处理)和ROLLBACK(取消处理)两种 ...