欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis查詢返回Map<String,Object>類型的講解

 更新時(shí)間:2022年06月27日 12:00:16   作者:菜鳥筆記  
這篇文章主要介紹了mybatis查詢返回Map<String,Object>類型的講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

查詢返回Map<String,Object>類型

mybatis 查詢返回Map<String,Object> 類型,平時(shí)沒太注意怎么用,今天又遇到了總結(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)計(jì) members 中男女人數(shù)分別是多少,很顯然返回的結(jié)果應(yīng)該是這樣的:

Femal: 3

Male: 6

對(duì)應(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 對(duì)象,并且里面包含兩個(gè) entry。

所以,對(duì)應(yīng)的 mapper 接口應(yīng)該是這樣的子的:

Map<String, Integer> getGenderCount();

但這樣定義接口會(huì)異常,大概的意思是:查詢結(jié)果要么是 null,要么是只有一個(gè),而現(xiàn)在卻出現(xiàn)多個(gè)結(jié)果。

這樣的報(bào)錯(cuò)信息很明顯了,mapper 接口應(yīng)該定義成:

List<Map<String, Integer>> getGenderCount();

xml 文件中的查詢結(jié)果是個(gè) list,這個(gè) list 中包含兩個(gè) map 對(duì)象,每一個(gè) map 對(duì)象中只包含一個(gè)entry。

(好像使用 resultHandler 可以讓xml中查詢的返回結(jié)果為 map 對(duì)象中包含兩個(gè) entry 這種形式)

問題二: list 中有兩個(gè)map,那每個(gè) map 中的 entry 是什么呢? 同樣是按照常規(guī)想法,兩個(gè)map 中應(yīng)該分別應(yīng)該是:{Femal:3},{Male: 6}。但實(shí)際的返回結(jié)果是:

[
map1:{
    key:Femal,
    value: 3
}
map2:{
    key:Male,
    value: 6
}
]

所以需要轉(zhuǎn)換成我們期望的類型。

在這個(gè)demo中,需要將 mapper 接口定義成這樣子。

List<Map<String, Object>> getGenderCount();

因?yàn)?value 的類型能是 String 可能是 Integer。

對(duì)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;
? }

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論