MyBatis框架——延迟加载
延迟加载也叫惰性加载或者懒加载,使⽤延迟是为了提⾼程序的运⾏效率,具体是通过尽量少执⾏ SQL 语句来提升效率。Java 程序与数据库的交互频率越低越好,MyBatis 提供的延迟加载功能就可以做到这 ⼀点。
延迟加载是作⽤于级联查询的场景下:
查询⽬标表时,如果仅查询⽬标表就可以获取相应的字段,则不需要查询级联表;
除⾮必须查询级联表才能获取的字段,则查询级联表,通过延迟加载可以有效减少 SQL 语句的执⾏次数。
延迟加载的思路:
将级联查询的 SQL 语句进⾏拆分,不要⽤⼀条 SQL 语句进⾏级联查询,改为两条 SQL 的单表查询。
当我们查询 Order 的时候,如果没有访问 customer 的属性,则只发送⼀条 SQL 语句查询 Order;
如果需要访问 customer 的属性,则发送两条 SQL 语句查询 Order 和 Customer。
示例:
1、创建数据库
2、创建实体类
package com.sunjian.entity;
import java.util.List;
/**
* @author sunjian
* @date 2020/3/23 14:37
*/
public class Customer {
private Long id;
private String name;
private List<Order> orders;
public List<Order> getOrders() {
return orders;
}
public void setOrders(List<Order> orders) {
this.orders = orders;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Customer{" +
"id=" + id +
", name='" + name + '\'' +
", orders=" + orders +
'}';
}
}
package com.sunjian.entity;
/**
* @author sunjian
* @date 2020/3/23 14:38
*/
public class Order {
public Long getId() {
return id;
}
@Override
public String toString() {
return "Order{" +
"id=" + id +
", name='" + name + '\'' +
", customer=" + customer +
'}';
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
private Long id;
private String name;
private Customer customer;
}
3、创建repository接口
package com.sunjian.repository;
import com.sunjian.entity.Customer;
import com.sunjian.entity.Order;
/**
* @author sunjian
* @date 2020/3/23 14:41
*/
public interface CustomerRepository {
public Customer findCustomerById(Long id);
}
package com.sunjian.repository;
import com.sunjian.entity.Order;
/**
* @author sunjian
* @date 2020/3/23 14:41
*/
public interface OrderRepository {
public Order findOrderById(Long id);
}
4、创建repository.xml编写SQL(单独查询)
<?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.sunjian.repository.CustomerRepository">
<select id="findCustomerById" parameterType="java.lang.Long" resultType="com.sunjian.entity.Customer">
select * from t_customer where id = #{id}
</select>
</mapper>
<?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.sunjian.repository.OrderRepository">
<resultMap id="orderMap" type="com.sunjian.entity.Order">
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<!-- 将查询结果中的cid字段,映射为另一个接口中的参数;达到级联查询-->
<association property="customer" javaType="com.sunjian.entity.Customer" column="cid" select="com.sunjian.repository.CustomerRepository.findCustomerById"></association>
</resultMap>
<select id="findOrderById" parameterType="java.lang.Long" resultMap="orderMap">
select * from t_order where id = #{id}
</select>
</mapper>
5、创建config.xml全局配置文件(开启延迟加载配置),将repository.xml注册到config.xml中
<?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>
<!-- 打印SQL语句 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- 开启延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
<!-- 配置 MyBatis 数据源 -->
<environments default="development">
<environment id="development">
<!-- JDBC事务管理 -->
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 注册 -->
<mappers>
<!-- 单表 -->
<mapper resource="com/sunjian/mapper/UserMapper.xml"></mapper>
<mapper resource="com/sunjian/repository/UserRepository.xml"></mapper>
<!-- 多表 一对一 -->
<mapper resource="com/sunjian/repository/StudentRepository.xml"></mapper>
<!-- 多表 一对多 -->
<mapper resource="com/sunjian/repository/ClassesRepository.xml"></mapper>
<!-- 多表 多对多 -->
<mapper resource="com/sunjian/repository/CourseRepository.xml"></mapper>
<mapper resource="com/sunjian/repository/OrderRepository.xml"></mapper>
<mapper resource="com/sunjian/repository/CustomerRepository.xml"></mapper>
</mappers>
</configuration>
6、创建测试类
package com.sunjian.test;
import com.sunjian.entity.Customer;
import com.sunjian.entity.Order;
import com.sunjian.entity.User;
import com.sunjian.repository.CustomerRepository;
import com.sunjian.repository.OrderRepository;
import com.sunjian.repository.UserRepository;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
/**
* @author sunjian
* @date 2020/3/22 10:20
*/
public class Test {
public static void main(String[] args) {
// Mapper 代理实现自定义接口
InputStream inputStream = Order.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
// 获取接口的处理对象
OrderRepository orderRepository = sqlSession.getMapper(OrderRepository.class);
Order order = orderRepository.findOrderById(1L);
System.out.println(order.getName());
}
}
开启延迟加载
Opening JDBC Connection Created connection 793315160. Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@2f490758] ==> Preparing: select * from t_order where id = ? ==> Parameters: 1(Long) <== Columns: id, name, cid <== Row: 1, 订单1, 1 <== Total: 1 订单1
未开启延迟加载
Opening JDBC Connection Created connection 793315160. Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@2f490758] ==> Preparing: select * from t_order where id = ? ==> Parameters: 1(Long) <== Columns: id, name, cid <== Row: 1, 订单1, 1 ====> Preparing: select * from t_customer where id = ? ====> Parameters: 1(Long) <==== Columns: id, name <==== Row: 1, 张三 <==== Total: 1 <== Total: 1 订单1
OK.
MyBatis框架——延迟加载的更多相关文章
- 在mybatis框架中,延迟加载与连表查询的差异
1.引子 mybatis的延迟加载,主要应用于一个实体类中有复杂数据类型的属性,包括一对一和一对多的关系(在xml中用collection.association标签标识).这个种属性往往还对应着另一 ...
- Hibernate框架与Mybatis框架的对比
学习了Hibernate和Mybatis,但是一直不太清楚他们两者的区别的联系,今天在网上翻了翻,就做了一下总结,希望对大家有帮助! 原文:http://blog.csdn.net/firejuly/ ...
- MyBatis 框架笔记
Mybatis 框架笔记 ------技术源于热爱! 获取更多内容请关注小编的个人微信公众平台 1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jd ...
- 【mybatis】使用mybatis框架中踩过的坑
好久没来记录一下自己的学习情况,最近都在学框架,今天来记录一下关于mybatis框架的学习过程中碰过的一些问题: 以下内容可能稍微有点凌乱,因为是把之前遇到过的错误或异常都集中一起了,不过我已经把问题 ...
- mybatis的延迟加载、一级缓存、二级缓存
mybatis的延迟加载.一级缓存.二级缓存 mybatis是什么? mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入 ...
- Spring MVC 学习总结(十)——Spring+Spring MVC+MyBatis框架集成(IntelliJ IDEA SSM集成)
与SSH(Struts/Spring/Hibernate/)一样,Spring+SpringMVC+MyBatis也有一个简称SSM,Spring实现业务对象管理,Spring MVC负责请求的转发和 ...
- MyBatis框架的使用及源码分析(九) Executor
从<MyBatis框架的使用及源码分析(八) MapperMethod>文中我们知道执行Mapper的每一个接口方法,最后调用的是MapperMethod.execute方法.而当执行Ma ...
- MyBatis框架的使用及源码分析(三) 配置篇 Configuration
从上文<MyBatis框架中Mapper映射配置的使用及原理解析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder> 我们知道XMLConf ...
- MyBatis 框架 基础应用
1.ORM的概念和优势 概念: 对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据 ...
随机推荐
- maven工程根项目运行ok但是子项目就报错的解决办法
正常启动没错 项目出现问题 maven工程根项目运行ok但是子项目就报错 报错信息是xxxx没有创建 解决办法 原来是子项目的依赖少了 没有配置1.8 所以会出现莫明其妙的bug
- 云服务器离线安装MariaDB安装步骤和解决办法
前面我写了tomcat的安装那么接下来我们来安装云服务的数据库服务 第一步:下载安装包 https://downloads.mariadb.org/ 按照上图所示操作就能完成在线安装,但由于国内的网络 ...
- 点击一个ul的五个li元素,分别弹出他们的序号,怎么做?
方法1 : for(var i=0; i<oLis.length; i++){ oLis[i].onclick = (function(j){ return function(){ alert( ...
- 849. Dijkstra求最短路 I
给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...
- SpringMVC之@SessionAttribute和@ModelAttribute
1.Controller package com.tz.controller; import java.util.Map; import org.springframework.stereotype. ...
- LSTM 句子相似度分析
使用句子中出现单词的Vector加权平均进行文本相似度分析虽然简单,但也有比较明显的缺点:没有考虑词序且词向量区别不明确.如下面两个句子: "北京的首都是中国"与"中国的 ...
- Design Patterns | 01 为什么要尽早掌握设计模式
标题:Design Patterns | 01 为什么要尽早掌握设计模式 链接: 标签:设计模式 摘要:设计模式是前人经验的总结,教大家如何写出可扩展.可读.可维护的高质量代码.设计模式与日常工作中的 ...
- java反序列化-ysoserial-调试分析总结篇(3)
前言: 这篇文章主要分析commoncollections3,这条利用链如yso描述,这个与cc1类似,只是反射调用方法是用的不是invokeTransformer而用的是InstantiateTra ...
- 连接器巨头Molex莫仕:替代品厂PK原厂
序言:在中国电子产业,原厂PK替代品厂一直是一个极具话题性.美国在贸易战背景下,挤压中国的发展空间,迫使这一类企业要觉醒.当然受影响的不止中国电子企业,美国电子企业也一样. 在连接器这一领域,Mole ...
- 使用 Hexo 创建项目文档网站
当我们发布一个开源项目的时候,最重要的事情之一就是要创建项目文档.对使用项目的用户来说,文档是非常有必要的,通常我们可以使用下面这些方式来创建文档: GitHub Wiki:在 Github 上我们可 ...