当前位置: 首页 > news >正文

Mybatis延迟加载、懒加载、二级缓存

DAY22.2 Java核心基础

Mybatis

延迟加载、懒加载

提高程序运行效率的技术

延迟加载,也叫惰性加载或者懒加载

延迟加载如何提升程序的运行效率?

持久层操作有一个原则:Java 程序和数据库交互频率越低越好

Java 程序每次和数据库进行交互,都需要先验证,会消耗资源,所以实际开发中应该尽量减少 Java 程序和数据库的交互次数,从而提高程序的运行效率。

MyBatis 的延迟加载机制,很好的做到了这一点

比如:Class 和 Student 表

当我们查询 Student 对象时,因为有级联关系,所以会将学生对应的班级信息一并查出,等于查了两张表,执行了两条 SQL 语句,分别查询 Class 和 Student

延迟加载的思路:当我们查询 Student 的时候,如果没有访问 Class 属性,则只发送一条 SQL 查询 Student 表,如果需要访问 Class 属性的时候,再发送另一条 SQL,来查询 Class 表。

延迟加载是一种代码优化机制,按需加载,根据具体的代码,来自主选择要发送的 SQL 语句。

比如下面的场景

Student类

@Data
public class Student  {private Integer id;private String name;private Class clazz;
}

Class类

@Data
public class Class  {private Integer id;private String name;
}

StudentMapper接口

public interface StudentMapper {Student getById(Integer id);
}

Mapper的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.shuwu.mapper.StudentMapper"><resultMap id="studentMap" type="com.shuwu.entity.Student"><id property="id" column="id"/><result property="name" column="name"></result><association property="clazz" javaType="com.shuwu.entity.Class" select="com.shuwu.mapper.ClassMapper.getClassById" column="cid"></association></resultMap><select id="getById" resultType="com.shuwu.entity.Student" resultMap="studentMap">select * from student where id = #{id}</select>
</mapper>

Class的sql映射

<select id="getClassById" resultType="com.shuwu.entity.Class">select * from class where id=#{id}
</select>

配置Mybatis打印sql

 <settings><!-- 打印SQL--><setting name="logImpl" value="STDOUT_LOGGING" /></settings>

测试类

public static void main(String[] args) {// 找到类加载器,然后创建一个工厂InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream("com/mybatis-config.xml");SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);// 获取sqlsessionSqlSession sqlSession = build.openSession();// 获取接口的代理对象StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);System.out.println(mapper.getById(1));
}

可以看见sql执行了两次

image-20250409114639483

但是如果我只需要获取到Student的信息呢,不获取Class的信息

System.out.println(mapper.getById(1).getName());

可以看见还是执行了两次sql,是不是这里我们可以省略执行class的sql呢

image-20250409114753175

如何实现呢?这就要用到Mybatis的延迟加载机制了,在配置类设置延迟加载即可
    <settings><!-- 打印SQL--><setting name="logImpl" value="STDOUT_LOGGING" /><!-- 开启延迟加载 --><setting name="lazyLoadingEnabled" value="true"/></settings>

再次运行,发现这次只执行了一次sql

image-20250409115052302

MyBatis 二级缓存

只有在级联查询的时候,Mybatis的延迟加载才有用,如果是单表查询的话我们可以使用二级缓存来优化,解决效率的问题

使用缓存的作用是减少Java程序与数据库的交互次数,提升运行效率,当第一次查出某个对象的时候,Mybatis会这个**对象进行缓存,**当第二次查询的时候就直接从缓存中获取,不需要再次访问数据库

http://www.xdnf.cn/news/62569.html

相关文章:

  • 统计图表ECharts
  • 2025年世界职业院校技能大赛实施方案(意见稿)
  • 【单片机 C语言】单片机学习过程中常见C库函数(学习笔记)
  • 由Ai生成的Linux 入门到精通学习路径
  • 记录seatunnel排查重复数据的案例分析
  • ESP8266_ESP32 Smartconfig一键配网功能
  • qt 配置 mysql 驱动问题:Cannot load library qsqlmysql;QMYSQL driver not loaded
  • 如何编写单元测试
  • 运维工程师面试总结21/4
  • 前端笔记-Axios
  • 3步拆解Linux内核源码的思维模型
  • 汽车动力转向器落锤冲击试验台
  • Java+nanomsg快速实现去broker的数据通信
  • 2025年最新服务器、中间件安全(面试题)
  • HADOOP 3.4.1安装和搭建(尚硅谷版~)
  • 强化学习系统学习路径与实践方法
  • 随机面试--<二>
  • 1+X: Python程序开发职业技能等级要求(初级)练习资料分享
  • 哈希表的学习
  • 基于RK3588+FPGA+AI YOLO的无人船目标检测系统(一)概述
  • 几何编码:启用矢量模式地理空间机器学习
  • OOA-CNN-LSTM-Attention、CNN-LSTM-Attention、OOA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比
  • 【Redis】SpringDataRedis
  • 【自然语言处理与大模型】模型压缩技术之量化
  • 在线查看【免费】avi,mov,rm,webm,ts,rm,mkv,mpeg,ogg,mpg,rmvb,wmv,3gp,ts,swf文件格式网站
  • Spring Boot 集成 Redis 实战总结
  • Idea中实用设置和插件
  • 系统架构师2025年论文《论基于UML的需求分析》
  • 项目实战 -- 发布管理
  • 把dll模块注入到游戏进程的方法_基于文件修改的注入方式