MyBatis深入解读懒加载的实现
作者:羡羡ˇ 发布时间:2021-10-02 01:09:44
标签:MyBatis,懒加载,原理,配置
懒加载 ,也称为嵌套查询
需要查询关联信息时,使用 Mybatis 懒加载特性可有效的减少数据库压力, 首次查询只查询主表信息,关联表的信息在用户获取时再加载。
Mybatis 一对一关联的 association 和一对多的 collection 可以实现懒加载。懒加载时要 使用resultMap,不能使用 resultType 。
这里我们以员工表和部门表为例
通过deptId 与 部门表 id 关联
我们这里首先需要开启一个设置
<settings>
<!--指定哪些方法去触发延迟加载,hashCode,equals,clone,toString-->
<setting name="lazyLoadTriggerMethods" value=""/>
</settings>
懒加载功能是默认开启的, 但这里我们也需要设置这个属性, 不设置则不会触发延迟加载功能
Employee selectOneEmployee(int id);
我们以查询单个员工为例 , resultMap 与sql 如下
<!--定义resultMap-->
<resultMap id="employeeMap1" type="Employee">
<id column="id" property="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<!--fetchType为查询的类型,这里选择lazy select为嵌套查询-->
<association property="dept" javaType="Dept" fetchType="lazy"
select="selectDept" column="deptId">
<result column="name" property="name"/>
</association>
</resultMap>
<select id="selectOneEmployee" resultMap="employeeMap1">
select id,name,age,deptId from employee where id=#{id}
</select>
<!--通过上一级sql提供的deptId查询-->
<select id="selectDept" resultType="Dept">
select name from dept where id=#{deptId}
</select>
此处一对一 ,我们使用<association>
java测试 :
public static void main(String[] args) {
SqlSession sqlSession= MybatisUtil.getSqlSession();
EmployeeDao mapper=sqlSession.getMapper(EmployeeDao.class);
Employee employee = mapper.selectOneEmployee(3);
System.out.println(employee);
System.out.println(employee.getDept());
sqlSession.commit(); //提交事务
sqlSession.close(); //关闭
查询结果 :
通过结果可以看到 , 当我们第一次输出这个 employee 对象时, 部门是没有被查询的 , 而当我们需要使用到部门的信息时, 才会去触发这个查询
查询部门 resultMap 与 sql如下:
<resultMap id="deptMap1" type="Dept">
<id column="id" property="id"/>
<result column="name" property="name"/>
<!--collection为一对多 , 这里一个部门包含多个员工-->
<collection property="list" javaType="List" ofType="Employee"
select="selectEmployee" fetchType="lazy" column="id">
<result property="name" column="name"/>
</collection>
</resultMap>
<select id="selectOneDept" resultMap="deptMap1">
SELECT id,name FROM dept where id=#{id}
</select>
<select id="selectEmployee" resultType="Employee">
select name from employee where deptId=#{id}
</select>
一对多,我们使用<collection>
懒加载就介绍到这里,感谢阅读
来源:https://blog.csdn.net/xx12321q/article/details/123848565


猜你喜欢
- 代码如下一、创建CheckCode.xaml代码如下<ResourceDictionary xmlns="http
- 本文实例讲述了C#中DataGridView操作技巧。分享给大家供大家参考。具体分析如下:#region 操作DataGridView///
- 本文实现案例场景: 某系统除了需要从自己的主要数据库上读取和管理数据外,还有一部分业务涉及到其他多个数据库,要求可以在任何方法上可以灵活指定
- 一、显式锁什么是显式锁?由自己手动获取锁,然后手动释放的锁。有了 synchronized(内置锁) 为什么还要 Lock(显示锁)?使用
- 定义注解也叫原数据,它是JDK1.5及之后版本引入的一个特性,它可以声明在类、方法、变量等前面,用来对这些元素进行说明。作用生成文档:通过代
- C#是一门支持多线程的语言,因此线程的使用也是比较常见的。由于线程的知识在Win32编程的时候已经说得过多,所以在.Net中很少介绍这部分(
- Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计
- 你以前听到的谈论关于Java8的所有都是围绕lambda表达式. 但它仅仅是Java8的一部分. Java 8 有许多新特性—一些强大的新类
- 直接看代码,注释都写清楚了public class MainActivity extends Activity { private
- 前言提前说明下:(该方法只适用于监控自己拥有的微信或者QQ ,无法监控或者盗取其他人的聊天记录。本文只写了如何获取聊天记录,服务器落地程序并
- ava:采用大端字节序存储数据【低地址存放数据的高位,高地址存放数据的低位,数据高位存放在数组的前面】windows(intel平台):采用
- SpringCloud Gateway 简介SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基
- 简介happens-before是JMM的核心概念。理解happens-before是了解JMM的关键。1、设计意图JMM的设计需要考虑两个
- 摘要分析验证码素材图片混淆原理,并采用selenium模拟人拖动滑块过程,进而破解验证码。人工验证的过程1、打开威锋网注册页面2、移动鼠标至
- 在使用ComboBox控件时,遇到了重新绑定赋值出问题的情况。正常情况下,对于数据重新赋值的或者绑定数据源的时候,为了防止数据出现问题,都会
- 终日惶惶,不知归路;一日写起代码,突发奇想,若是在运行时发现自定义上下文的数据丢失,我们该如何解决处理数据丢失的问题?问题复现一下,大家看下
- 本文为大家分享了Android操作蓝牙2.0的使用方法,供大家参考,具体内容如下1.Android操作蓝牙2.0的使用流程(1)找到设备uu
- 微信跳一跳辅助的Java具体实现代码,供大家参考,具体内容如下1.参考知乎教你用Python来玩微信跳一跳,鉴于本人Python一直都是半吊
- 前言最近断断续续地把项目的界面部分的代码由JAva改成了Kotlin编写,并且如果应用了kotlin-android-extensions插
- 本文实例讲述了Android编程调用Camera和相册功能。分享给大家供大家参考,具体如下:xml:<LinearLayout xml