Mybatis的resultType返回map类型、@MapKey注解的作用

今天继续完善一下mybatis系列相关博客,以便查阅,同时也希望能帮助到有需要的小伙伴,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!

目录

resultType返回map

单条记录封装成一个map

​多条记录封装成一个map


先看下官方文档对resultType属性的表述:resultType结果的类型。通常 MyBatis 可以推断出来,但是为了更加准确,写上也不会有什么问题。MyBatis 允许将任何简单类型用作主键的类型,包括字符串。如果生成列不止一个,则可以使用包含期望属性的 Object 或 Map。

对于resultType为对象的在之前的博客中一直都是这么用的,比如:

<select id="selectById" resultType="com.example.mybatis.domain.User">
    select * from mybatis_user where id=#{id}
 </select>

resultType返回map

单条记录封装成一个map

返回的map中,key就是列名,value就是列值。

Mapper接口中:

Map<Integer,User> testResultMap(int id);

Mapper.xml中:

<select id="testResultMap" resultType="map">
    select * from mybatis_user where id = #{id}
</select>

单条记录封装成一个map,除了像上面那样使用Map<Integer,User>这种方式接收外,还可以直接使用Map<String, Object>接收,更原始一点直接用HashMap接收也是可以的,如下:

HashMap selectHashMap(int id);

Map<String, Object> testResultMap(int id);

Map<Integer, User> testResultMap0(int id);

多条记录封装成一个map

上面这只是查一条记录并返回map,如果我们想查询用户列表,并将结果封装到一个map中怎么使用呢,我们试下:

Mapper接口中:

Map<Integer, User> testResultMap2();

Mapper.xml中:

<select id="testResultMap2" resultType="map">
    select * from t_user
</select>

此时查询会报错:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 21

我们可以通过使用@MapKey注解来解决上面的问题,先看下官方文档中对于@Mapkey的表述:

这是一个用在返回值为 Map 的方法上的注解。它能够将存放对象的 List 转化为 key 值为对象的某一属性的 Map。属性有: value,填入的是对象的属性名,作为 Map 的 key 值。

我们可以使用@Mapkey注解指定封装map时使用对象的哪个属性来作为key,通常我们使用主键就可以,或者唯一索引,确保key不会重复。

只要改下Mapper接口中的方法即可:

@MapKey(value = "id")
Map<Integer, User> testResultMap2();

同返回单条记录一样,返回多条记录封装成map也有三种接收方式, 如下:

List<HashMap> selectHashMap1();

@MapKey(value = "id")
Map<Integer, Map<String, Object>> testResultMap1();

@MapKey(value = "id")
Map<Integer, User> testResultMap2();

只是获取结果时List<HashMap>与后两种略有不同,List<HashMap>封装结果如下:

后两种接收方式的封装结果相同,如下:

如果我的博客对你有帮助,欢迎进行评论✏️✏️、点赞👍👍、收藏⭐️⭐️,满足一下我的虚荣心💖🙏🙏🙏 。 

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值