@[toc]java
部門對象數據庫
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>
查詢出全部的部門信息及該部門下全部員工的信息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表員工信息和所在的部門名稱 測試
<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);