MyBatis05-关联关系、延迟加载和缓存

本文围绕Java数据库展开,介绍了关联关系,包括1对1、1对多和多对多关系及映射文件处理;阐述了延迟加载,即需要时再加载数据;还讲解了缓存,其可降低应用程序读写数据库频率,MyBatis支持1级和2级缓存,常用Ehcache和Redis实现二级缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@[toc]

关联关系

1对1关系
对象与对象1对1

部门对象

private Integer deptno;

	private String dname;

	private String loc;

员工对象

private Integer empno;
	
	private String ename;
	
	//private Integer deptno;
	
	//员工和部门的关联关系是1VS1
	
	private Dept dept;
映射文件中处理
<mapper namespace="com.sxt.dao.IEmpDao">
	<resultMap type="Emp" id="baseResultMap">
			<id column="empno" property="empno"/>
			<result column="ename" property="ename"/>
		<!-- 配置1对1的关联关系  property对应的是emp中部门成员变量的名称-->
		<association property="dept" javaType="Dept">
			<id column="deptno" property="deptno"/>
			<result column="dname" property="dname"/>
			<result column="loc" property="loc"/>
		</association>
	</resultMap>
	
	<select id="query" resultMap="baseResultMap">
		SELECT
			e.empno
			,e.ename
			,d.deptno
			,d.dname
			,d.loc
		FROM emp e
		LEFT JOIN
			dept d
		ON e.deptno=d.deptno
	</select>
</mapper>

在这里插入图片描述

1对多关系

查询出所有的部门信息及该部门下所有员工的信息

部门类

private Integer deptno;

	private String dname;

	private String loc;

	private List<Emp> emps;

映射文件
<mapper namespace="com.sxt.dao.IDeptDao">
	<resultMap type="Dept" id="baseResultMap">
		<id column="deptno" property="deptno" />
		<result column="dname" property="dname" />
		<result column="loc" property="loc" />
		<!-- 配置1对多的关联关系  ofType集合中泛型的类型-->
		<collection property="emps" ofType="Emp">
			<id column="empno" property="empno" />
			<result column="ename" property="ename" />
		</collection>
	</resultMap>

	<select id="query" resultMap="baseResultMap">
		SELECT
		d.deptno
		,d.dname
		,d.loc
		,e.empno
		,e.ename
		FROM dept d
		LEFT JOIN emp e
		ON d.deptno=e.deptno
	</select>
</mapper>

在这里插入图片描述

多对多关系

==双向的1对多既是多对多关系==

延迟加载

延迟查询是一对一和一对多查询的延续。   在默认的一对一和一对多中,一条SQL就能够查询到所有数据,但是,有的数据有时候一时半会用不上,例如查询员工,捎带获取员工的部门数据,但是部门数据使用的频率很低,这种时候可以使用延迟查询,首先获取到所有的员工数据,然后在需要的时候再去获取部门数据。==当需要使用数据的时候才去加载==既是延迟加载

开启延迟加载

全局配置文件中配置

<settings>
		<!-- 开启延迟加载 -->
		<setting name="lazyLoadingEnabled" value="true" />
		<setting name="aggressiveLazyLoading" value="false" />
	</settings>
<mapper namespace="com.sxt.dao.IEmpDao">
	<resultMap type="Emp" id="baseResultMap">
			<id column="empno" property="empno"/>
			<result column="ename" property="ename"/>
		<!-- 配置1对1的关联关系  property对应的是emp中部门成员变量的名称-->
		<association property="dept" javaType="Dept"
			column="deptno" select="queryDeptId">
			<id column="deptno" property="deptno"/>
			<result column="dname" property="dname"/>
			<result column="loc" property="loc"/>
		</association>
	</resultMap>
	
	<select id="queryDeptId" parameterType="int" resultType="Dept">
		SELECT * from dept where deptno=#{deptno}
	</select>
	
	<select id="query" resultMap="baseResultMap">
		SELECT
			e.empno
			,e.ename
			,e.deptno
		FROM emp e
	</select>
	
</mapper>

测试 只查询emp表的 在这里插入图片描述在这里插入图片描述在这里插入图片描述 查询emp表员工信息和所在的部门名称 在这里插入图片描述在这里插入图片描述在这里插入图片描述

1对多
<mapper namespace="com.sxt.dao.IDeptDao">
	<resultMap type="Dept" id="baseResultMap">
		<id column="deptno" property="deptno" />
		<result column="dname" property="dname" />
		<result column="loc" property="loc" />
		
		<!-- 配置1对多的关联关系  ofType集合中泛型的类型-->
		<collection property="emps" ofType="Emp" column="deptno" select="queryEmpById">
			<id column="empno" property="empno" />
			<result column="ename" property="ename" />
		</collection>
	</resultMap>
	<select id="queryEmpById" parameterType="int" resultType="Emp">
		select * from emp where deptno=#{deptno}
	</select>

	<select id="query" resultMap="baseResultMap">
		SELECT
		d.deptno
		,d.dname
		,d.loc
		FROM dept d
		
	</select>
</mapper>

在这里插入图片描述

缓存

 缓存(Cache )是计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是==降低==应用程序直接读写永久性数据存储源的==频率==,从而提高应用的运行性能。缓存中的数据是数据存储源中数据的拷贝,应用程序在运行时直接读写缓存中的数据,只在某些特定时刻按照缓存中的数据来同步更新数据存储源。 缓存的物理介质通常是内存,而永久性数据存储源的物理介质通常是硬盘或磁盘,应用程序读写内在的速度显然比读写硬盘的速度快,如果缓存中存放的数据量非常大,也会用硬盘作为缓存的物理介质。缓存的实现不仅需要作为物理介质的硬件,同时还需要用于管理缓存的并发访问和过期等策略的软件。因此,缓存是通过软件和硬件共同实现的 作用:降低访问数据源【数据库】频率

缓存分类
类别说明
一级缓存事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期当事务结束时,缓存也就结束生命周期。在此范围下,缓存的介质是内存。
二级缓存进程范围:缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存,因此必须对缓存采取必要的事务隔离机制。缓存、存的生命周期依赖于进程的生命周期,进程结束时,缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据,所以存放的介质可以是内存或硬盘
三级缓存集群范围:在集群环境中,缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致性,缓存中的数据通常采用对象的松散数据形式

MyBatis支持1级缓存和2级缓存,在实际开发中,实际上很少使用到MyBatis自带的缓存,大部分情况下,缓存都是使用EHCache,MemoryCache、Redis等等来实现缓存。

以及缓存

MyBatis中1级缓存是基于SqlSession的

IDeptDao dao = session.getMapper(IDeptDao.class);
		Dept dept = dao.query(10);
		System.out.println(dept);
		System.out.println("----------");
		dept=dao.query(10);
		System.out.println(dept);
		

在这里插入图片描述

二级缓存

二级缓存基于SqlSessionFactory,一级缓存的作用域只是SqlSession,范围比较下,用到的不多。二级缓存是进程级别的缓存,用的比较普遍,二级缓存mybatis本身没有提供,常用的主键有Ehcache和Redis,本文主要讲解Ehcache

导包
<dependency>
	<groupId>net.sf.ehcache</groupId>
	<artifactId>ehcache</artifactId>
	<version>1.5.0</version>
</dependency>

<dependency>
	<groupId>org.mybatis.caches</groupId>
	<artifactId>mybatis-ehcache</artifactId>
	<version>1.1.0</version>
</dependency>

<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
IDeptDao dao = session.getMapper(IDeptDao.class);
		//先从1级缓存中查询看是是否有10的数据,如果没有去数据库中查询,并将查询的结果保存到1级缓存中
		Dept dept = dao.query(10);
		System.out.println(dept);
		//清空1级缓存
		session.close();
		session=factory.openSession();
		dao=session.getMapper(IDeptDao.class);
		System.out.println("----------");
		dept=dao.query(10);
		System.out.println(dept);
		

在这里插入图片描述

转载于:https://my.oschina.net/u/4116634/blog/3047227

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值