MyBatis之輸入與輸出(resultType、resultMap)映射

在MyBatis中,咱們經過parameterType完成輸入映射(指將值映射到sql語句的佔位符中,值的類型與dao層響應方法的參數類型一致),經過resultType完成輸出映射(從數據庫中輸出,經過dao層的方法查詢到的數據輸出到pojo對象中)。 注意輸入與輸出都是相對於數據庫的。接下來咱們先談談輸入映射。工程目錄結構以下:java

1.輸入映射parameterType

經過parameterType傳入簡單類型或對象,咱們以前講過了,接下來咱們要講的是parameterType傳遞pojo包裝對象。能夠定義pojo包裝類型擴展mapper接口輸入參數的內容。sql

看下咱們的需求:定義查詢條件查詢用戶信息,須要向statement輸入查詢條件,查詢條件能夠有user信息、商品信息等等。數據庫

首先咱們在domain包下建立UserCustom類並繼承User,UserCustom類用於對User屬性進行擴展(例如User中只有用戶信息,而咱們能夠在UserCustom中加入商品信息),而後再建立User的包裝類UserQueryVo.java:apache

UserMapper.xml中添加以下配置信息:mybatis

UserMapper.java中添加方法:app

而後即可以進行測試:dom

可能出現的異常:若是在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'

2.輸出映射

輸出映射有resultType和resultMap,他們都是指定輸出結果的類型(pojo、簡單類型、hashmap…),並將sql查詢結果映射爲java對象 。spa

2.1resultType

借用上述parameter傳遞包裝pojo對象的知識(不用parameter傳遞包裝pojo對象的知識也行),咱們來談談用resultType輸出簡單類型。UserMapper.xml文件中添加以下配置:code

而後在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對象的屬性不同,可是咱們的確映射成功了。

相關文章
相關標籤/搜索