案例:https://github.com/sun2shadow/simpleMybatis
從策劃到設(shè)計制作,每一步都追求做到細膩,制作可持續(xù)發(fā)展的企業(yè)網(wǎng)站。為客戶提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)頁設(shè)計、域名與空間、虛擬主機、網(wǎng)絡(luò)營銷、VI設(shè)計、 網(wǎng)站改版、漏洞修補等服務(wù)。為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,以客戶的口碑塑造優(yōu)易品牌,攜手廣大客戶,共同發(fā)展進步。resultMap 元素是 MyBatis 中最重要最強大的元素。
先看一個簡單的映射:
它把所有的列映射到HashMap的主鍵上.但是實踐中經(jīng)常把resultType類型制定為JavaBeans或POJOs,如以下語句:
高級映射是開發(fā)中常用的形式:
resultMap概念視圖:
constructor- 類在實例化時,用來注入結(jié)果到構(gòu)造方法中
idArg- ID 參數(shù);標記結(jié)果作為 ID 可以幫助提高整體效能
arg- 注入到構(gòu)造方法的一個普通結(jié)果
id– 一個 ID 結(jié)果;標記結(jié)果作為 ID 可以幫助提高整體效能
result– 注入到字段或 JavaBean 屬性的普通結(jié)果
association– 一個復雜的類型關(guān)聯(lián);許多結(jié)果將包成這種類型
嵌入結(jié)果映射 – 結(jié)果映射自身的關(guān)聯(lián),或者參考一個
collection– 復雜類型的集
嵌入結(jié)果映射 – 結(jié)果映射自身的集,或者參考一個
discriminator– 使用結(jié)果值來決定使用哪個結(jié)果映射
嵌入結(jié)果映射 – 這種情形結(jié)果也映射它本身,因此可以包含很多相 同的元素,或者它可以參照一個外部的結(jié)果映射。
case– 基于某些值的結(jié)果映射
屬性 | 描述 |
---|---|
id | 當前命名空間中的一個唯一標識,用于標識一個result map. |
type | 類的全限定名, 或者一個類型別名 (內(nèi)置的別名可以參考上面的表格). |
autoMapping | 如果設(shè)置這個屬性,MyBatis將會為這個ResultMap開啟或者關(guān)閉自動映射。這個屬性會覆蓋全局的屬性autoMappingBehavior。默認值為:unset。 |
Id&result
id 和 result 都映射一個單獨列的值到簡單數(shù)據(jù)類型(字符 串,整型,雙精度浮點數(shù),日期等)的單獨屬性或字段
屬性 | 描述 |
---|---|
property | 映射到列結(jié)果的字段或?qū)傩?。如果匹配的是存在?和給定名稱相同 的 JavaBeans 的屬性,那么就會使用。否則 MyBatis 將會尋找給定名稱 property 的字段。這兩種情形你可以使用通常點式的復雜屬性導航。比如,你 可以這樣映射一些東西: “username” ,或者映射到一些復雜的東西: “address.street.number” 。 |
column | 從數(shù)據(jù)庫中得到的列名,或者是列名的重命名標簽。這也是通常和會 傳遞給 resultSet.getString(columnName)方法參數(shù)中相同的字符串。 |
javaType | 一個 Java 類的完全限定名,或一個類型別名(參考上面內(nèi)建類型別名 的列表) 。如果你映射到一個 JavaBean,MyBatis 通??梢詳喽愋?。 然而,如果你映射到的是 HashMap,那么你應(yīng)該明確地指定 javaType 來保證所需的行為。 |
jdbcType | 在這個表格之后的所支持的 JDBC 類型列表中的類型。JDBC 類型是僅 僅需要對插入,更新和刪除操作可能為空的列進行處理。這是 JDBC jdbcType 的需要,而不是 MyBatis 的。如果你直接使用 JDBC 編程,你需要指定 這個類型-但僅僅對可能為空的值。 |
typeHandler | 我們在前面討論過默認的類型處理器。使用這個屬性,你可以覆蓋默 認的類型處理器。這個屬性值是類的完全限定名或者是一個類型處理 器的實現(xiàn),或者是類型別名。 |
關(guān)聯(lián):連表查詢時需要關(guān)聯(lián)映射關(guān)系.property:blog中author變量,column表的author的外建,javaType關(guān)聯(lián)的entity
通過映射關(guān)系來告訴MyBatis如何加載關(guān)聯(lián)關(guān)系,MyBatis提供了2中方式:
嵌套查詢:通過執(zhí)行另外一個 SQL 映射語句來返回預期的復雜類型。
嵌套結(jié)果:使用嵌套結(jié)果映射來處理重復的聯(lián)合結(jié)果的子集。首先,然讓我們來查看這個元素的屬性。所有的你都會看到,它和普通的只由 select 和
resultMap 屬性的結(jié)果映射不同。
關(guān)聯(lián)的嵌套查詢:
一個來加載博客,另外一個來加載作者,這種方式大的問題就是N+1查詢問題,查詢一條博客有N個作者需要查詢作者表N次.
關(guān)聯(lián)的嵌套結(jié)果:
先看一個這樣的語句:查詢blog的作者和聯(lián)合作者,作者和聯(lián)合作者的id不能都叫author_id,否則會引起沖突.
首先定義author的結(jié)果映射:
其次定義blog的resultMap,通過columnPrefix來指定前綴以此來區(qū)分是主作者還是聯(lián)合作者.
看完了關(guān)聯(lián),再來看集合就容易多了,基本上是相似的.
private Listposts;
這種關(guān)系就需要用到集合,通過ofType指定,列表內(nèi)數(shù)據(jù)的類型是Post.
上面這個查詢需要映射的關(guān)系如下:collection 中property屬性是blog中的變量posts,看上面的變量聲明
下面來簡單的說明一下鑒別器:根據(jù)查詢結(jié)果的不同來選擇不同的映射器.
鑒別器這個例子比較有意思,查詢車輛信息,返回不同類型的車輛,有轎車,貨車,SUV等不同類型有不同的映射結(jié)果.
如果類型是car的話,則按照carResult來映射結(jié)果:
這種情況下只有 doorCount 屬性會被加載.如果 Car 是一個 Vehicle 實例。因此,我們想要剩余的屬性也被加載。我們設(shè)置的結(jié)果映射的 簡單改變?nèi)缦隆?/p>