99热这里有精品-夜夜嗨av色一区二区不卡-亚洲国产精彩中文乱码AV-日本japanese乳偷乱熟

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可以靈活的設置查詢是否需要使用延遲加載,而不需要因為某個查詢不想使用延遲加載將全局的延遲加載設置關閉.

清水县| 玉屏| 榆中县| 旬邑县| 阿拉善盟| 五峰| 大关县| 芒康县| 海阳市| 湖州市| 兰西县| 贵溪市| 元朗区| 铅山县| 岳池县| 福安市| 益阳市| 白山市| 祁东县| 陆良县| 塘沽区| 鹿邑县| 吴川市| 和田市| 汪清县| 新建县| 镇雄县| 柳州市| 珠海市| 中牟县| 克拉玛依市| 奉节县| 仁化县| 新民市| 扶余县| 东宁县| 银川市| 左权县| 苗栗市| 桂平市| 萨迦县|