国产日产欧产精品网站|2022仙踪林官网老狼信息|天天澡天天揉揉Av在线|国产精品成人久久久久久久

MyBatis框架 第4章 MyBatis 映射文件

第4章 MyBatis 映射文件

4.1 Mybatis映射文件簡介

? 1)? MyBatis 的真正強大在于它的映射語句,也是它的魔力所在。由于它的異常強大,映射器的 XML 文件就顯得相對簡單。如果拿它跟具有相同功能的 JDBC 代碼進行對比,你會立即發現省掉了將近 95% 的代碼。MyBatis 就是針對 SQL 構建的,并且比普通的方法做的更好。

? 2)? SQL 映射文件有很少的幾個頂級元素(按照它們應該被定義的順序):

cache – 給定命名空間的緩存配置。

cache-ref – 其他命名空間緩存配置的引用。

resultMap – 是最復雜也是最強大的元素,用來描述如何從數據庫結果集中來加 載對象。

parameterMap – 已廢棄!老式風格的參數映射。內聯參數是首選,這個元素可能 在將來被移除,這里不會記錄。

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數據庫

? 2)? 不支持主鍵自增,例如Oracle數據庫

4.3.2 獲取主鍵值

? 1)? 若數據庫支持自動生成主鍵的字段(比如 MySQL 和 SQL Server),則可以設置 useGeneratedKeys=”true”,然后再把 keyProperty 設置到目標屬性上。? 2)? 而對于不支持自增型主鍵的數據庫(例如 Oracle),則可以使用 selectKey 子元素:selectKey ?元素將會首先運行,id ?會被設置,然后插入語句會被調用

4.4 參數傳遞

4.4.1 參數傳遞的方式

? 1)? 單個參數

可以接受基本類型,對象類型。這種情況MyBatis可直接使用這個參數,不需要經過任 何處理。\

? 2)? 多個參數

任意多個參數,都會被MyBatis重新包裝成一個Map傳入。Map的key是param1,param2,或者0,1…,值就是參數的值

? 3)? 命名參數

為參數使用@Param起一個名字,MyBatis就會將這些參數封裝進map中,key就是我們自己指定的名字

? 4)? POJO

當這些參數屬于我們業務POJO時,我們直接傳遞POJO

? 5)? Map

我們也可以封裝多個參數為map,直接傳遞

? 6)? Collection/Array

會被MyBatis封裝成一個map傳入, Collection對應的key是collection,Array對應的key是array. 如果確定是List集合,key還可以是list.

4.4.2 參數傳遞源碼分析

4.4.3 參數處理

?1)? 參數位置支持的屬性:

javaType、jdbcType、mode、numericScale、resultMap、typeHandler、jdbcTypeName、expression

? 2)? 實際上通常被設置的是:可能為空的列名指定 jdbcType ,例如:

4.4.4 參數的獲取方式

? 1)? #{key}:獲取參數的值,預編譯到SQL中。安全。

? 2)? ${key}:獲取參數的值,拼接到SQL中。有SQL注入問題。ORDER BY ${name}

4.5 select查詢的幾種情況

4.6 resultType自動映射

? 1)? ?autoMappingBehavior默認是PARTIAL,開啟自動映射的功能。唯一的要求是列名和javaBean屬性名一致

? 2)? 如果autoMappingBehavior設置為null則會取消自動映射

? 3)? 數據庫字段命名規范,POJO屬性符合駝峰命名法,如A_COLUMNàaColumn,我們可以開啟自動駝峰命名規則映射功能,mapUnderscoreToCamelCase=true

4.7 resultMap自定義映射

? 1)? 自定義resultMap,實現高級結果集映射

? 2)? id?:用于完成主鍵值的映射

? 3)? result?:用于完成普通列的映射

? 4)? association?:一個復雜的類型關聯;許多結果將包成這種類型

? 5)? collection : 復雜類型的集

4.7.1 ?id&result

4.7.2 ?association

? 1)? POJO中的屬性可能會是一個對象,我們可以使用聯合查詢,并以級聯屬性的方式封裝對象.使用association標簽定義對象的封裝規則

? 2)? 使用級聯的方式:? 3)? Association‘

4.7.3 ?association 分步查詢

? 1)? 實際的開發中,對于每個實體類都應該有具體的增刪改查方法,也就是DAO層, 因此

對于查詢員工信息并且將對應的部門信息也查詢出來的需求,就可以通過分步的方式

完成查詢。

  • 先通過員工的id查詢員工信息
  • 再通過查詢出來的員工信息中的外鍵(部門id)查詢對應的部門信息.

 

4.7.4 ?association 分步查詢使用延遲加載

? 1)? 在分步查詢的基礎上,可以使用延遲加載來提升查詢的效率,只需要在全局的

Settings中進行如下的配置:

4.7.5 collection

? 1)? POJO中的屬性可能會是一個集合對象,我們可以使用聯合查詢,并以級聯屬性的方式封裝對象.使用collection標簽定義對象的封裝規則? 2)? Collection

4.7.6 collection 分步查詢

? 1)? 實際的開發中,對于每個實體類都應該有具體的增刪改查方法,也就是DAO層, 因此

對于查詢部門信息并且將對應的所有的員工信息也查詢出來的需求,就可以通過分步的方式完成查詢。

  • 先通過部門的id查詢部門信息
  • 再通過部門id作為員工的外鍵查詢對應的部門信息.

4.7.7 collection 分步查詢使用延遲加載

4.7.8 擴展: 分步查詢多列值的傳遞

? 1)? 如果分步查詢時,需要傳遞給調用的查詢中多個參數,則需要將多個參數封裝成

Map來進行傳遞,語法如下: {k1=v1, k2=v2....}

? 2)? 在所調用的查詢方,取值時就要參考Map的取值方式,需要嚴格的按照封裝map

時所用的key來取值.

4.7.9 擴展: association 或 collection的 fetchType屬性

? 1)? 在<association> 和<collection>標簽中都可以設置fetchType,指定本次查詢是否要使用延遲加載。默認為 fetchType=”lazy” ,如果本次的查詢不想使用延遲加載,則可設置為

fetchType=”eager”.

? 2)? fetchType可以靈活的設置查詢是否需要使用延遲加載,而不需要因為某個查詢不想使用延遲加載將全局的延遲加載設置關閉.

精河县| 朝阳县| 石林| 延长县| 曲沃县| 张家港市| 竹山县| 密山市| 乾安县| 云南省| 榆树市| 浪卡子县| 东明县| 枣强县| 丰顺县| 诏安县| 加查县| 宁安市| 渑池县| 大姚县| 宕昌县| 贡山| 永清县| 郯城县| 郑州市| 神农架林区| 常宁市| 偃师市| 商河县| 开封市| 江阴市| 青铜峡市| 汽车| 凤冈县| 临沭县| 阿合奇县| 兴海县| 博爱县| 油尖旺区| 长白| 安泽县|