1. 程式人生 > >Mybatis第二天

Mybatis第二天

Mybatis第二天
1、高階結果對映(一對一、一對多、多對多)(重點)
2、延遲載入
3、查詢快取
4、Spring和mybatis的整合(重點)
5、逆向工程
2高階結果對映
2.1資料模型分析
1、明確每張表儲存的資訊
2、明確每張表中關鍵欄位(主鍵、外來鍵、非空)
3、明確資料庫中表與表之間的外來鍵關係
4、明確業務中表與表的關係(建立在具體的業務)
2.2一對一對映
2.2.1需求
查詢訂單資訊,關聯查詢使用者資訊

2.2.2Sql
主資訊:orders
從資訊:user

SELECT
orders.id,
orders.user_id,
orders.number

,
user.username,
user.sex
FROM
orders,
USER
WHERE orders.user_id = user.id

2.2.3resultType
2.2.3.1建立擴充套件類

2.2.3.2對映檔案

2.2.3.3Mapper介面

2.2.3.4測試程式碼

2.2.3.5小結
使用resultType來進行一對一結果對映,查詢出的列的個數和對映的屬性的個數要一致。而且對映的屬性要存在與一個大的物件中,它是一種平鋪式的對映,即資料庫查詢出多少條記錄,則對映成多少個物件。

2.2.4resultMap
使用resultMap來進行一對一結果對映,它是將關聯物件新增到主資訊的物件中,具體說是物件巢狀物件的一種對映方式。
2.2.4.1修改擴充套件類

2.2.4.2對映檔案

2.2.4.3Mapper介面

2.2.4.4測試程式碼

2.2.5小結
在一對一結果對映時,使用resultType更加簡單方便,如果有特殊要求(物件巢狀物件)時,需要使用resultMap進行對映,比如:查詢訂單列表,然後在點選列表中的檢視訂單明細按鈕,這個時候就需要使用resultMap進行結果對映。而resultType更適應於查詢明細資訊,比如,查詢訂單明細列表。

2.3一對多對映
2.3.1需求
查詢訂單資訊,關聯查詢訂單明細資訊及使用者資訊

2.3.2Sql
主資訊:orders
從資訊:orderdetail、user

SELECT
orders.id

,
orders.user_id,
orders.number,
user.username,
user.sex,
orderdetail.id detailId,
orderdetail.items_id,
orderdetail.items_num
FROM
orders,
USER,
orderdetail
WHERE orders.user_id = user.id
AND orders.id = orderdetail.orders_id
2.3.3修改擴充套件類

2.3.4對映檔案

2.3.5Mapper介面

2.3.6測試程式碼

2.4多對多對映
多對多對映是一對多對映的特例

2.4.1需求
查詢使用者資訊,關聯查詢該使用者購買的商品資訊

2.4.2Sql
主資訊:user
從資訊:items、orders、orderdetail

SELECT
orders.id,
orders.user_id,
orders.number,
user.username,
user.sex,
orderdetail.id detailId,
orderdetail.items_id,
orderdetail.items_num,
items.name,
items.price
FROM
orders,
USER,
orderdetail,
items
WHERE orders.user_id = user.id
AND orders.id = orderdetail.orders_id
AND orderdetail.items_id = items.id

2.4.3修改po類
在User類中新增List orders;

在Orders類中新增List detailList;

在Orderdetail中新增Items items;

2.4.4Mapper介面

2.4.5對映檔案

2.4.6測試程式碼

3延遲載入
3.1什麼是延遲載入
延遲載入又叫懶載入,也叫按需載入。也就是說先載入主資訊,在需要的時候,再去載入從資訊。

在mybatis中,resultMap標籤 的association標籤和collection標籤具有延遲載入的功能。

3.2需求
查詢訂單資訊,關聯查詢使用者資訊
1、建立一個statement來查詢訂單資訊
2、建立一個statement來查詢使用者資訊

3.3對映檔案
1、建立查詢訂單資訊的對映檔案

2、建立查詢使用者資訊的對映檔案

3.4Mapper介面

3.5測試程式碼

3.6設定延遲載入
在SqlMapConfig.xml中,配置settings標籤

4查詢快取
4.1Mybatis的快取理解

Mybatis的快取,包括一級快取和二級快取

一級快取指的就是sqlsession,在sqlsession中有一個數據區域,是map結構,這個區域就是一級快取區域。一級快取中的key是由sql語句、條件、statement等資訊組成一個唯一值。一級快取中的value,就是查詢出的結果物件。

二級快取指的就是同一個namespace下的mapper,二級快取中,也有一個map結構,這個區域就是一級快取區域。一級快取中的key是由sql語句、條件、statement等資訊組成一個唯一值。一級快取中的value,就是查詢出的結果物件。

一級快取是預設使用的。
二級快取需要手動開啟。

4.2一級快取
4.2.1原理

4.2.2測試1

4.2.3測試2

4.3二級快取
4.3.1原理

4.3.2開啟二級快取
1、開啟二級快取的總開關

2、在mapper對映檔案中開啟二級快取

4.3.3序列化

4.3.4測試1

4.3.5測試2

4.3.6禁用快取
預設值是true

4.3.7重新整理快取

4.3.8整合ehcache
Mybatis本身是一個持久層框架,它不是專門的快取框架,所以它對快取的實現不夠好,不能支援分散式。

Ehcache是一個分散式的快取框架。

4.3.8.1什麼是分散式
系統為了提高效能,通常會對系統採用分散式部署(叢集部署方式)

4.3.8.2整合思路
Cache是一個介面,它的預設實現是mybatis的PerpetualCache。如果想整合mybatis的二級快取,那麼實現Cache介面即可。

4.3.8.3新增jar包

4.3.8.4設定對映檔案中cache標籤的type值為ehcache的實現類

4.3.8.5新增ehcache的配置檔案
在config下,建立ehcache.xml

4.3.8.6測試ehcache的二級快取

4.3.9應用場景
使用場景:對於訪問響應速度要求高,但是實時性不高的查詢,可以採用二級快取技術。
注意:在使用二級快取的時候,要設定一下重新整理間隔(cache標籤中有一個flashInterval屬性)來定時重新整理二級快取,這個重新整理間隔根據具體需求來設定,比如設定30分鐘、60分鐘等,單位為毫秒。
4.3.10侷限性
Mybatis二級快取對細粒度的資料,快取實現不好。
場景:對商品資訊進行快取,由於商品資訊查詢訪問量大,但是要求使用者每次查詢都是最新的商品資訊,此時如果使用二級快取,就無法實現當一個商品發生變化只重新整理該商品的快取資訊而不重新整理其他商品快取資訊,因為二級快取是mapper級別的,當一個商品的資訊傳送更新,所有的商品資訊快取資料都會清空。
解決此類問題,需要在業務層根據需要對資料有針對性的快取。
比如可以對經常變化的 資料操作單獨放到另一個namespace的mapper中。
5Mybatis整合spring
5.1整合思路
1、資料來源資訊交給spring管理
2、SqlSessionFactory交給spring進行單例管理
3、由spring來管理原始dao的實現類或者mapper代理的代理類。

5.2需求
使用原始dao方式和mapper代理方式實現以下功能:
根據使用者ID查詢商品資訊
5.3工程搭建
Mysql的驅動包
Mybatis的核心包和依賴包
Mybatis和spring的整合包
Spring的包
dbcp資料庫連線池包

5.4具體整合
5.4.1整合配置檔案
5.4.1.1Mybatis
在config下,建立mybatis目錄,然後建立SqlMapConfig.xml

將db.properties和log4j.properties拷貝到config目錄下。
5.4.1.2Spring
在config下,建立spring目錄,然後建立applicationContext.xml

5.4.2整合程式碼
5.4.2.1原始dao開發方式
5.4.2.1.1對映檔案
在config/mybatis下建立sqlmap,然後建立User.xml

5.4.2.1.2Dao程式碼
Dao介面

Dao實現類

5.4.2.1.3配置UserDao實現類
在applicationContext.xml中配置UserDao實現類

5.4.2.1.4測試程式碼

5.4.2.2Mapper代理
5.4.2.2.1對映檔案
將對映檔案放到UserMapper介面的同包下

5.4.2.2.2Mapper介面

5.4.2.2.3配置mapper代理類
單個mapper代理類配置

批量設定mapper代理類

5.4.2.2.4測試程式碼

6逆向工程(會用)
6.1什麼是逆向工程
Mybatis提供來一個逆向工程工具,通過逆向工程,可以幫助程式設計師根據單表來生成po類、mapper對映檔案、mapper介面。

6.2下載逆向工程
https://github.com/mybatis/generator/releases/tag/mybatis-generator-1.3.2

6.3建立逆向工程

6.4建立Generator.java

6.5新增generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
	<!-- 預設false,把JDBC DECIMAL 和 NUMERIC 型別解析為 Integer,為 true時把JDBC DECIMAL 
		和 NUMERIC 型別解析為java.math.BigDecimal -->
	<javaTypeResolver>
		<property name="forceBigDecimals" value="false" />
	</javaTypeResolver>

	<!-- targetProject:生成PO類的位置 -->
	<javaModelGenerator targetPackage="com.itheima.ms.po"
		targetProject=".\src">
		<!-- enableSubPackages:是否讓schema作為包的字尾 -->
		<property name="enableSubPackages" value="false" />
		<!-- 從資料庫返回的值被清理前後的空格 -->
		<property name="trimStrings" value="true" />
	</javaModelGenerator>
	<!-- targetProject:mapper對映檔案生成的位置 -->
	<sqlMapGenerator targetPackage="com.itheima.ms.mapper"
		targetProject=".\src">
		<!-- enableSubPackages:是否讓schema作為包的字尾 -->
		<property name="enableSubPackages" value="false" />
	</sqlMapGenerator>
	<!-- targetPackage:mapper介面生成的位置 -->
	<javaClientGenerator type="XMLMAPPER"
		targetPackage="com.itheima.ms.mapper" targetProject=".\src">
		<!-- enableSubPackages:是否讓schema作為包的字尾 -->
		<property name="enableSubPackages" value="false" />
	</javaClientGenerator>
	<!-- 指定資料庫表 -->
	<table tableName="items"></table>
	<table tableName="orders"></table>
	<table tableName="orderdetail"></table>
	<table tableName="user"></table>
</context>

6.6將逆向工程生成的程式碼拷貝到指定專案中
6.7使用逆向工程生成的程式碼

6.8注意事項
Mapper.xml檔案已經存在時,如果進行重新生成則mapper.xml檔案時,內容不被覆蓋而是進行內容追加,結果導致mybatis解析失敗。
解決方法:刪除原來已經生成的mapper xml檔案再進行生成。
Mybatis自動生成的po及mapper.java檔案不是內容而是直接覆蓋沒有此問題。