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

@[toc]java

关联关系

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对多关系

查询出全部的部门信息及该部门下全部员工的信息session

部门类mybatis

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就可以查询到全部数据,可是,有的数据有时候一时半会用不上,例如查询员工,捎带获取员工的部门数据,可是部门数据使用的频率很低,这种时候可使用延迟查询,首先获取到全部的员工数据,而后在须要的时候再去获取部门数据。==当须要使用数据的时候才去加载==既是延迟加载app

开启延迟加载

全局配置文件中配置性能

<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 )是计算机领域很是通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其做用是==下降==应用程序直接读写永久性数据存储源的==频率==,从而提升应用的运行性能。缓存中的数据是数据存储源中数据的拷贝,应用程序在运行时直接读写缓存中的数据,只在某些特定时刻按照缓存中的数据来同步更新数据存储源。 缓存的物理介质一般是内存,而永久性数据存储源的物理介质一般是硬盘或磁盘,应用程序读写内在的速度显然比读写硬盘的速度快,若是缓存中存放的数据量很是大,也会用硬盘做为缓存的物理介质。缓存的实现不只须要做为物理介质的硬件,同时还须要用于管理缓存的并发访问和过时等策略的软件。所以,缓存是经过软件和硬件共同实现的 做用:下降访问数据源【数据库】频率spa

缓存分类

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

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);

在这里插入图片描述

相关文章
相关标签/搜索