MyBatis之输入与输出(resultType、resultMap)映射
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
在MyBatis中,我們通過parameterType完成輸入映射(指將值映射到sql語句的占位符中,值的類型與dao層響應(yīng)方法的參數(shù)類型一致),通過resultType完成輸出映射(從數(shù)據(jù)庫中輸出,通過dao層的方法查詢到的數(shù)據(jù)輸出到pojo對(duì)象中)。?注意輸入與輸出都是相對(duì)于數(shù)據(jù)庫的。接下來我們先談?wù)勢(shì)斎胗成洹9こ棠夸浗Y(jié)構(gòu)如下:
1.輸入映射parameterType
通過parameterType傳入簡(jiǎn)單類型或?qū)ο?#xff0c;我們之前講過了,接下來我們要講的是parameterType傳遞pojo包裝對(duì)象。可以定義pojo包裝類型擴(kuò)展mapper接口輸入?yún)?shù)的內(nèi)容。
看下我們的需求:定義查詢條件查詢用戶信息,需要向statement輸入查詢條件,查詢條件可以有user信息、商品信息等等。
首先我們?cè)赿omain包下創(chuàng)建UserCustom類并繼承User,UserCustom類用于對(duì)User屬性進(jìn)行擴(kuò)展(例如User中只有用戶信息,而我們可以在UserCustom中加入商品信息),然后再創(chuàng)建User的包裝類UserQueryVo.java:
UserMapper.xml中添加如下配置信息:
UserMapper.java中添加方法:
然后便可以進(jìn)行測(cè)試:
可能出現(xiàn)的異常:如果在parameterType中指定了錯(cuò)誤的屬性名時(shí)會(huì)出現(xiàn)如下異常:
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,他們都是指定輸出結(jié)果的類型(pojo、簡(jiǎn)單類型、hashmap…),并將sql查詢結(jié)果映射為java對(duì)象 。
2.1resultType
借用上述parameter傳遞包裝pojo對(duì)象的知識(shí)(不用parameter傳遞包裝pojo對(duì)象的知識(shí)也行),我們來談?wù)動(dòng)胷esultType輸出簡(jiǎn)單類型。UserMapper.xml文件中添加如下配置:
然后在UserMapper.java中添加如下方法:
測(cè)試:
這里因?yàn)椴樵兊挠涗浗Y(jié)果集為一條記錄且該記錄只有1列,所以我們使用的是返回簡(jiǎn)單類型。
使用resultType時(shí)我們應(yīng)該注意:sql查詢的列名要和resultType指定pojo的屬性名相同,指定相同屬性方可映射成功,如果sql查詢的列名要和resultType指定pojo的屬性名全部不相同(或是部分不相同),則映射到pojo對(duì)象中的對(duì)應(yīng)屬性為null。例如有時(shí)候我們不需要查詢select * from user where id = ?而是select username,address _address where id = ??此時(shí)我們給查詢的address列名給了一個(gè)別名_address,這樣我們通過查詢表中address的數(shù)據(jù)然后在將它映射到User對(duì)象時(shí),該對(duì)象的address屬性就為null,即沒將從表中查詢到的address數(shù)據(jù)映射到user對(duì)象的address屬性中。
此時(shí)resultMap就出現(xiàn)了。如果sql查詢列名和最終要映射的pojo的屬性名不一致,使用resultMap就可以將列名和pojo的屬性名做一個(gè)對(duì)應(yīng)關(guān)系 (列名和屬性名映射配置)。
2.2resultMap
使用resultMap需要在UserMapper.xml中進(jìn)行配置:
然后在UserMapper.xml中使用它:
UserMapper.java文件中:
測(cè)試類代碼:
運(yùn)行測(cè)試類發(fā)現(xiàn),即使我們查詢的列名與User對(duì)象的屬性不一樣,但是我們的確映射成功了。
轉(zhuǎn)載于:https://my.oschina.net/u/3881735/blog/1832602
總結(jié)
以上是生活随笔為你收集整理的MyBatis之输入与输出(resultType、resultMap)映射的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到小猫小狗什么意思
- 下一篇: PowerDesigner常用设置