mybatis查詢返回Map<String,Object>類型的講解
查詢返回Map<String,Object>類型
mybatis 查詢返回Map<String,Object> 類型,平時沒太注意怎么用,今天又遇到了總結(jié)記錄一下,方便以后處理此類問題。
Mapper.java中的方法:
@MapKey("userId")
Map<String,UserInfo> personalInfoByUserIds(List<String> list);mapper.xml文件中的配置:
<resultMap id="BaseResultMap" type="com.*.*.entity.UserInfo">
<id column="user_id" jdbcType="VARCHAR" property="userId" />
<result column="user_code" jdbcType="INTEGER" property="userCode" />
<result column="user_name" jdbcType="VARCHAR" property="userName" />
<result column="user_gender" jdbcType="INTEGER" property="userGender" />
<result column="mobile_phone" jdbcType="VARCHAR" property="mobilePhone" />
<result column="birthday" jdbcType="DATE" property="birthday" />
</resultMap>
<select id="personalInfoByUserIds" resultMap="BaseResultMap">
select * from t_user_info i where i.user_id in
<foreach collection="list" item="item" separator="," open="(" close=")" index="index">
#{item}
</foreach>
</select>返回結(jié)果如下:

mybatis返回結(jié)果為Map問題
表:members 中的gender 列是這樣:
Female
Female
Male
Female
Male
Male
Male
Male
Male
現(xiàn)在我們想統(tǒng)計 members 中男女人數(shù)分別是多少,很顯然返回的結(jié)果應(yīng)該是這樣的:
Femal: 3
Male: 6
對應(yīng)的xml文件中的查詢語句:
<select id="genderCount" resultMap="genderCount"> ? ? select ? ? ? ? gender, ? ? ? ? count(gender) count ? ? from members ? ? group by gender ? </select> <resultMap id="genderCount" type="java.util.HashMap"> ? ? <result column="gender" property="key" javaType="java.lang.String"/> ? ? <result column="count" property="value" javaType="java.lang.Integer"/> </resultMap>
問題一: 按照常規(guī)想法,mybatis 返回的結(jié)果應(yīng)該是 map 對象,并且里面包含兩個 entry。
所以,對應(yīng)的 mapper 接口應(yīng)該是這樣的子的:
Map<String, Integer> getGenderCount();
但這樣定義接口會異常,大概的意思是:查詢結(jié)果要么是 null,要么是只有一個,而現(xiàn)在卻出現(xiàn)多個結(jié)果。
這樣的報錯信息很明顯了,mapper 接口應(yīng)該定義成:
List<Map<String, Integer>> getGenderCount();
xml 文件中的查詢結(jié)果是個 list,這個 list 中包含兩個 map 對象,每一個 map 對象中只包含一個entry。
(好像使用 resultHandler 可以讓xml中查詢的返回結(jié)果為 map 對象中包含兩個 entry 這種形式)
問題二: list 中有兩個map,那每個 map 中的 entry 是什么呢? 同樣是按照常規(guī)想法,兩個map 中應(yīng)該分別應(yīng)該是:{Femal:3},{Male: 6}。但實際的返回結(jié)果是:
[
map1:{
key:Femal,
value: 3
}
map2:{
key:Male,
value: 6
}
]
所以需要轉(zhuǎn)換成我們期望的類型。
在這個demo中,需要將 mapper 接口定義成這樣子。
List<Map<String, Object>> getGenderCount();
因為 value 的類型能是 String 可能是 Integer。
對xml查詢的 List<Map<String, Object>> 結(jié)果做轉(zhuǎn)化,代碼如下:
private Map<String, Integer> getMetricsLatestVersion(
? ? ? List<Map<String, Object>> genderCountList) {
? ? Map<String, Integer> genderCount = new HashMap<>();
? ? for (Map<String, Object> kv : genderCountList) {
? ? ? String key = null;
? ? ? Integer value = null;
? ? ? for (Map.Entry<String, Object> entry : kv.entrySet()) {
? ? ? ? if (entry.getKey().equals("key")) {
? ? ? ? ? key = (String) entry.getValue();
? ? ? ? } else {
? ? ? ? ? value = (Integer) entry.getValue();
? ? ? ? }
? ? ? }
? ? ? genderCount.put(key, value);
? ? }
? ? return genderCount;
? }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java利用InputStream類實現(xiàn)文件讀取與處理
在Java開發(fā)中,輸入流(InputStream)是一個非常重要的概念,它涉及到文件讀寫、網(wǎng)絡(luò)傳輸?shù)榷鄠€方面,InputStream類是Java中輸入流的抽象基類,定義了讀取輸入流數(shù)據(jù)的方法,本文將以InputStream類為切入點,介紹Java中的輸入流概念及其應(yīng)用,需要的朋友可以參考下2023-11-11
jackson 實現(xiàn)null轉(zhuǎn)0 以及0轉(zhuǎn)null的示例代碼
這篇文章主要介紹了jackson 實現(xiàn)null轉(zhuǎn)0 以及0轉(zhuǎn)null的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
@ConfigurationProperties加載外部配置方式
這篇文章主要介紹了@ConfigurationProperties加載外部配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03

