MyBatis框架 第4章 MyBatis 映射文件
第4章 MyBatis 映射文件
4.1 Mybatis映射文件簡介
? 1)? MyBatis 的真正強大在于它的映射語句,也是它的魔力所在。由于它的異常強大,映射器的 XML 文件就顯得相對簡單。如果拿它跟具有相同功能的 JDBC 代碼進(jìn)行對比,你會立即發(fā)現(xiàn)省掉了將近 95% 的代碼。MyBatis 就是針對 SQL 構(gòu)建的,并且比普通的方法做的更好。
? 2)? SQL 映射文件有很少的幾個頂級元素(按照它們應(yīng)該被定義的順序):
cache – 給定命名空間的緩存配置。
cache-ref – 其他命名空間緩存配置的引用。
resultMap – 是最復(fù)雜也是最強大的元素,用來描述如何從數(shù)據(jù)庫結(jié)果集中來加 載對象。
parameterMap – 已廢棄!老式風(fēng)格的參數(shù)映射。內(nèi)聯(lián)參數(shù)是首選,這個元素可能 在將來被移除,這里不會記錄。
sql – 可被其他語句引用的可重用語句塊。
insert – 映射插入語句
update – 映射更新語句
delete – 映射刪除語句
select – 映射查詢語
4.2 Mybatis使用insert|update|delete|select完成CRUD
4.2.1 select
4.2.2 insert
4.2.3 ?update
4.2.4 ?delete
4.3?主鍵生成方式、獲取主鍵值
4.3.1 主鍵生成方式
? 1)? 支持主鍵自增,例如MySQL數(shù)據(jù)庫
? 2)? 不支持主鍵自增,例如Oracle數(shù)據(jù)庫
4.3.2 獲取主鍵值
? 1)? 若數(shù)據(jù)庫支持自動生成主鍵的字段(比如 MySQL 和 SQL Server),則可以設(shè)置 useGeneratedKeys=”true”,然后再把 keyProperty 設(shè)置到目標(biāo)屬性上。? 2)? 而對于不支持自增型主鍵的數(shù)據(jù)庫(例如 Oracle),則可以使用 selectKey 子元素:selectKey ?元素將會首先運行,id ?會被設(shè)置,然后插入語句會被調(diào)用
4.4 參數(shù)傳遞
4.4.1 參數(shù)傳遞的方式
? 1)? 單個參數(shù)
可以接受基本類型,對象類型。這種情況MyBatis可直接使用這個參數(shù),不需要經(jīng)過任 何處理。\
? 2)? 多個參數(shù)
任意多個參數(shù),都會被MyBatis重新包裝成一個Map傳入。Map的key是param1,param2,或者0,1…,值就是參數(shù)的值
? 3)? 命名參數(shù)
為參數(shù)使用@Param起一個名字,MyBatis就會將這些參數(shù)封裝進(jìn)map中,key就是我們自己指定的名字
? 4)? POJO
當(dāng)這些參數(shù)屬于我們業(yè)務(wù)POJO時,我們直接傳遞POJO
? 5)? Map
我們也可以封裝多個參數(shù)為map,直接傳遞
? 6)? Collection/Array
會被MyBatis封裝成一個map傳入, Collection對應(yīng)的key是collection,Array對應(yīng)的key是array. 如果確定是List集合,key還可以是list.
4.4.2 參數(shù)傳遞源碼分析
4.4.3 參數(shù)處理
?1)? 參數(shù)位置支持的屬性:
javaType、jdbcType、mode、numericScale、resultMap、typeHandler、jdbcTypeName、expression
? 2)? 實際上通常被設(shè)置的是:可能為空的列名指定 jdbcType ,例如:
4.4.4 參數(shù)的獲取方式
? 1)? #{key}:獲取參數(shù)的值,預(yù)編譯到SQL中。安全。
? 2)? ${key}:獲取參數(shù)的值,拼接到SQL中。有SQL注入問題。ORDER BY ${name}
4.5 select查詢的幾種情況
4.6 resultType自動映射
? 1)? ?autoMappingBehavior默認(rèn)是PARTIAL,開啟自動映射的功能。唯一的要求是列名和javaBean屬性名一致
? 2)? 如果autoMappingBehavior設(shè)置為null則會取消自動映射
? 3)? 數(shù)據(jù)庫字段命名規(guī)范,POJO屬性符合駝峰命名法,如A_COLUMNàaColumn,我們可以開啟自動駝峰命名規(guī)則映射功能,mapUnderscoreToCamelCase=true
4.7 resultMap自定義映射
? 1)? 自定義resultMap,實現(xiàn)高級結(jié)果集映射
? 2)? id?:用于完成主鍵值的映射
? 3)? result?:用于完成普通列的映射
? 4)? association?:一個復(fù)雜的類型關(guān)聯(lián);許多結(jié)果將包成這種類型
? 5)? collection : 復(fù)雜類型的集
4.7.1 ?id&result
4.7.2 ?association
? 1)? POJO中的屬性可能會是一個對象,我們可以使用聯(lián)合查詢,并以級聯(lián)屬性的方式封裝對象.使用association標(biāo)簽定義對象的封裝規(guī)則
? 2)? 使用級聯(lián)的方式:? 3)? Association‘
4.7.3 ?association 分步查詢
? 1)? 實際的開發(fā)中,對于每個實體類都應(yīng)該有具體的增刪改查方法,也就是DAO層, 因此
對于查詢員工信息并且將對應(yīng)的部門信息也查詢出來的需求,就可以通過分步的方式
完成查詢。
- 先通過員工的id查詢員工信息
- 再通過查詢出來的員工信息中的外鍵(部門id)查詢對應(yīng)的部門信息.
4.7.4 ?association 分步查詢使用延遲加載
? 1)? 在分步查詢的基礎(chǔ)上,可以使用延遲加載來提升查詢的效率,只需要在全局的
Settings中進(jìn)行如下的配置:
4.7.5 collection
? 1)? POJO中的屬性可能會是一個集合對象,我們可以使用聯(lián)合查詢,并以級聯(lián)屬性的方式封裝對象.使用collection標(biāo)簽定義對象的封裝規(guī)則? 2)? Collection
4.7.6 collection 分步查詢
? 1)? 實際的開發(fā)中,對于每個實體類都應(yīng)該有具體的增刪改查方法,也就是DAO層, 因此
對于查詢部門信息并且將對應(yīng)的所有的員工信息也查詢出來的需求,就可以通過分步的方式完成查詢。
- 先通過部門的id查詢部門信息
- 再通過部門id作為員工的外鍵查詢對應(yīng)的部門信息.
4.7.7 collection 分步查詢使用延遲加載
4.7.8 擴(kuò)展: 分步查詢多列值的傳遞
? 1)? 如果分步查詢時,需要傳遞給調(diào)用的查詢中多個參數(shù),則需要將多個參數(shù)封裝成
Map來進(jìn)行傳遞,語法如下: {k1=v1, k2=v2....}
? 2)? 在所調(diào)用的查詢方,取值時就要參考Map的取值方式,需要嚴(yán)格的按照封裝map
時所用的key來取值.
4.7.9 擴(kuò)展: association 或 collection的 fetchType屬性
? 1)? 在<association> 和<collection>標(biāo)簽中都可以設(shè)置fetchType,指定本次查詢是否要使用延遲加載。默認(rèn)為 fetchType=”lazy” ,如果本次的查詢不想使用延遲加載,則可設(shè)置為
fetchType=”eager”.
? 2)? fetchType可以靈活的設(shè)置查詢是否需要使用延遲加載,而不需要因為某個查詢不想使用延遲加載將全局的延遲加載設(shè)置關(guān)閉.