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

在這裏插入圖片描述

相關文章
相關標籤/搜索