天天看點

Mybatis中ResultType和ResultMap區分,id和result屬性

ResultType和ResultMap的差別

總結:

基本映射:(resultType)使用resultType進行輸出映射,隻有查詢出來的列名和pojo中的屬性名一緻,該列才可以映射成功
(資料庫,實體,查詢字段,這些全部都得一一對應),進階映射:(resultMap)如果查詢出來的列名和pojo的屬性名不一緻,
通過定義一個resultType對列名和pojo屬性名之間作一個映射關系。(進階映射,字段名稱可以不一緻,通過映射來實作)。
resultType和resultMap功能類似,都是傳回對象資訊,但是resultMap要更強大一些,可自定義,resultMap要配置一下,表
和類的一一對應關系,是以說就算你的字段名和你的實體類的屬性名不一樣也沒關系,都會給你映射出來,但是
           
Mybatis中在查詢進行select映射的時候,傳回類型可以用resultType,也可以用resultMap,resultType是直接表示傳回類型
的,resultMap則是對外部resultMap的引用,但是resultType和resultMap不能同時存在。
在Mybatis進行查詢映射的時候,其實查詢出來的每一個屬性都是放在一個對應的Map裡面,其中鍵是屬性名,值則是其對應的值。
(1)當提供的傳回值類型屬性是resultType時,Mybatis會将Map裡面的鍵值對取出賦給resultType所指定的對象對應的屬性,
是以其實Mybatis的每一個查詢映射的傳回值類型都是resultMap,隻是當提供的傳回類型屬性是resultType的時候,Mybatis
會自動的給把對應的值賦給resultType所指定對象的屬性。
(2)當提供的傳回值類型是resultMap時,因為Map不能很好的表示領域模型,就需要自己再進一步的把它轉化為對應的對象,
這常常在複雜查詢中很有作用。
           
resultMap:适合使用傳回值是自定義實體類的情況。
resultType:适合使用傳回值的資料類型是非自定義的,即jdk提供的類型。
           

ResultType

resultType可以直接傳回給出的傳回值類型,比如:String,int,Map等等,其中傳回List也是将傳回類型定義為Map,然後
Mybatis會自動将這些map放在一個List中,resultType還可以是一個對象。
           
resultType對應的是Java對象中的屬性,大小寫不敏感。
resultType如果放的是java.lang.Map,key是查詢語句的列名,value是查詢的值,大小寫敏感。
resultMap指的是定義好了的id,是定義好的resultType的引用。
注意:
用resultType的時候,要保證結果集的列名與Java對象的屬性相同,而resultMap則不用,而且resultMap可以用typeHander轉換
parameterType:參數類型,隻能傳一個參數,如果有多個參數要封裝,如封裝成一個類,要寫包名+類名,基本資料類型則可以省略。
一對一,一對多時,若有表的字段相同必須寫别名,不然查詢結果無法正常映射,出現某屬性為空或者傳回的結果與想象中的不同時,而這往往是沒有報錯的。
           

ResultMap

适合使用傳回值是自定義實體類的情況。
映射實體類的資料類型
id:resultMap的唯一辨別
column:庫表的字段名
property:實體類的屬性名
           

id和result屬性

<id property=" " column=" "/>
<result property=" " column=" "/>
這是最基本的結果集映射,id和result将列映射到屬性或簡單的資料類型字段(String,int,double,Date等)
這兩者唯一不同的是,在比較對象執行個體時,id作為結果集的辨別屬性,這有助于提高總體性能,特别是應用緩存和嵌套結果映射的時候。
           
Attribute Description
property 映射資料庫列的字段或屬性。如果JavaBean 的屬性與給定的名稱比對,就會使用比對的名字。否則,MyBatis 将搜尋給定名稱的字段。兩種情況下您都可以使用逗點的屬性形式。比如,您可以映射到“username”,也可以映射到“address.street.number”。
column 資料庫的列名或者列标簽别名。與傳遞給resultSet.getString(columnName)的參數名稱相同。
javaType 完整java類名或别名(參考上面的内置别名清單)。如果映射到一個JavaBean,那MyBatis 通常會自行檢測到。然而,如果映射到一個HashMap,那您應該明确指定javaType 來確定所需行為。
jdbcType 這張表下面支援的JDBC類型清單列出的JDBC類型。這個屬性隻在insert,update或delete 的時候針對允許空的列有用。JDBC 需要這項,但MyBatis 不需要。如果您直接編寫JDBC代碼,在允許為空值的情況下需要指定這個類型。
typeHandler 我們已經在文檔中讨論過預設類型處理器。使用這個屬性可以重寫預設類型處理器。它的值可以是一個TypeHandler實作的完整類名,也可以是一個類型别名。

繼續閱讀