1. 程式人生 > >輸入(parameterType)與輸出(resultType、resultMap)對映的區別是什麼?

輸入(parameterType)與輸出(resultType、resultMap)對映的區別是什麼?

在MyBatis中,我們通過parameterType完成輸入對映(指將值對映到sql語句的佔位符中,值的型別與dao層響應方法的引數型別一致),通過resultType完成輸出對映(從資料庫中輸出,通過dao層的方法查詢到的資料輸出到pojo物件中)。 注意輸入與輸出都是相對於資料庫的。接下來我們先談談輸入對映。工程目錄結構如下:
這裡寫圖片描述

1.輸入對映parameterType

通過parameterType傳入簡單型別或物件,我們之前講過了,接下來我們要講的是parameterType傳遞pojo包裝物件。可以定義pojo包裝型別擴充套件mapper介面輸入引數的內容。

看下我們的需求:定義查詢條件查詢使用者資訊,需要向statement輸入查詢條件,查詢條件可以有user資訊、商品資訊等等。

首先我們在domain包下建立UserCustom類並繼承User,
這裡寫圖片描述
UserCustom類用於對User屬性進行擴充套件(例如User中只有使用者資訊,而我們可以在UserCustom中加入商品資訊),然後再建立User的包裝類UserQueryVo.java:
這裡寫圖片描述
UserMapper.xml中新增如下配置資訊:
這裡寫圖片描述
UserMapper.java中新增方法:
這裡寫圖片描述
然後便可以進行測試:
這裡寫圖片描述
可能出現的異常:如果在parameterType中指定了錯誤的屬性名時會出現如下異常:

org.apache.ibatis.exceptions.PersistenceException: ### Error querying database.  Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'userCusto' in 'class cn.itcast.mybatis.po.UserQueryVo'### Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'userCusto' in 'class cn.itcast.mybatis.po.UserQueryVo'
  • 1

2.輸出對映

輸出對映有resultType和resultMap,他們都是指定輸出結果的型別(pojo、簡單型別、hashmap…),並將sql查詢結果對映為java物件 。

2.1resultType

借用上述parameter傳遞包裝pojo物件的知識(不用parameter傳遞包裝pojo物件的知識也行),我們來談談用resultType輸出簡單型別。UserMapper.xml檔案中新增如下配置:
這裡寫圖片描述
然後在UserMapper.java中新增如下方法:
這裡寫圖片描述
測試:
這裡寫圖片描述
這裡因為查詢的記錄結果集為一條記錄且該記錄只有1列,所以我們使用的是返回簡單型別。

使用resultType時我們應該注意:sql查詢的列名要和resultType指定pojo的屬性名相同,指定相同屬性方可對映成功,如果sql查詢的列名要和resultType指定pojo的屬性名全部不相同(或是部分不相同),則對映到pojo物件中的對應屬性為null。例如有時候我們不需要查詢select * from user where id = ?而是select username,address _address where id = ? 此時我們給查詢的address列名給了一個別名_address,這樣我們通過查詢表中address的資料然後在將它對映到User物件時,該物件的address屬性就為null,即沒將從表中查詢到的address資料對映到user物件的address屬性中。

此時resultMap就出現了。如果sql查詢列名和最終要對映的pojo的屬性名不一致,使用resultMap就可以將列名和pojo的屬性名做一個對應關係 (列名和屬性名對映配置)。

2.2resultMap

使用resultMap需要在UserMapper.xml中進行配置:
這裡寫圖片描述
然後在UserMapper.xml中使用它:
這裡寫圖片描述
UserMapper.java檔案中:
這裡寫圖片描述
測試類程式碼:
這裡寫圖片描述
執行測試類發現,即使我們查詢的列名與User物件的屬性不一樣,但是我們的確對映成功了。