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

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

目录

resultType返回map

单条记录封装成一个map

​多条记录封装成一个map


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

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

resultType返回map

单条记录封装成一个map

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

Mapper接口中:

Map testResultMap(int id);

Mapper.xml中:

Mybatis的resultType返回map类型、@MapKey注解的作用_第1张图片

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

HashMap selectHashMap(int id);

Map testResultMap(int id);

Map testResultMap0(int id);

多条记录封装成一个map

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

Mapper接口中:

Map testResultMap2();

Mapper.xml中:

此时查询会报错:

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 testResultMap2();

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

List selectHashMap1();

@MapKey(value = "id")
Map> testResultMap1();

@MapKey(value = "id")
Map testResultMap2();

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

Mybatis的resultType返回map类型、@MapKey注解的作用_第2张图片

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

Mybatis的resultType返回map类型、@MapKey注解的作用_第3张图片

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

你可能感兴趣的:(mybatis)