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)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据 ...
随机推荐
- Apollo配置中心介绍与使用指南
转载于https://github.com/ctripcorp/apollo,by Ctrip, Inc. Apollo配置中心介绍 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中 ...
- webpack在用dev-server的时候怎么配置多入口文件
类似下面这样就可以了,entry设置为对象 每个入口设置为属性,属性的值是一个数组,就可以像单入口一样往这个数组添加entry: { Profile: [ 'webpack-dev-server/cl ...
- 分析Java中的length和length()
在不适用任何带有自动补全功能的IDE的情况下,我们怎么获取一个数组的长度?如何获取字符串的长度? 这里我们先举用实例去分析一下:int[] arr=new int[3]:System.out.prin ...
- kafka&&kafka-manager部署安装
一.zk集群部署 二.kafka部署安装 1.创建kafka用户和日志路径,(直接执行) groupadd kafka useradd -g kafka kafka mkdir -p /web/kaf ...
- 关于Linux文件系统
前言 文件系统是在内核中实现,能够对存储在磁盘上的二进制数据进行有效的层次化管理的一种软件.而用户程序为了实现在磁盘上使用或者创建文件,向内核发起系统调用(实际由文件系统向内核发起的系统调用)并转换为 ...
- FPGA小白学习之路(4)PLL中的locked信号解析(转)
ALTPLL中的areset,locked的使用 转自:http://www.360doc.com/content/13/0509/20/9072830_284220258.shtml 今天对PLL中 ...
- FPGA小白学习之路(1) System Verilog的概念以及与verilog的对比(转)
转自CSDN:http://blog.csdn.net/gtatcs/article/details/8970489 SystemVerilog语言简介 SystemVerilog是一种硬件描述和验证 ...
- Java2变量和运算符
课后作业:[必做题] 1√AB互换 已知a,b均是整型变量,写出将a,b两个变量中的值互换的程序.(知识点:变量和运算符综合应用) [必做题] package com.two; public clas ...
- CSS(0)CSS的引入方式
CSS (cascading style sheet) 层叠样式表 css引入的三种方式: 1.行间样式 <!--在body内写入--> <div></div> ...
- iOS中的分类和扩展
一.什么是分类? 概念:分类(Category)是OC中的特有语法,它是表示一个指向分类的结构体指针.根据下面源码组成可以看到它没有属性列表,原则上是不能添加成员变量(其实可以借助运行时功能,进行关联 ...