• ​​前言​​
  • ​​查询的记录有多条​​
  • ​​查询二 SQL语句使用了聚合函数​​
  • ​​查询三 返回值类型为map​​

前言

使用Mybatis进行查询的时候,查询出来的数据可能有一条数据,也可能是多条,我们就得根据返回数据的条数来指定返回类型,如果记录是多条,那么返回值类型就不能是实体类。

查询的记录有多条

如果查询出来有多条记录,但是我们方法的返回类型是实体类,就会报下面的错误

Mybatis的各种查询功能_mybatis

Mybatis的各种查询功能_实战教程_02

org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne()

因为,当我们的方法返回值类型是实体类,底层会调用selectOne方法,这个方法的返回数据只能有一个


总结:查询出来的记录有一条,返回值类型可以是实体类,也可以是集合,如果记录有多条,返回值类型可以设置成List集合,也可以是Map集合,但是一定不能设置成实体类类型,不然报错TooManyResultsException
Mybatis的各种查询功能_实战教程_03
Mybatis的各种查询功能_值类型_04


查询二 SQL语句使用了聚合函数

我们有的时候,希望能够查询出来有多少条记录,那么SQL语句就使用了分组函数,那么查询出来的结果应该是单行单列

/**
* 查询用户信息的总记录数
* @param
* @return
*/
Integer getCount();


Mybatis的各种查询功能_实战教程_05Mybatis的各种查询功能_值类型_06
大家有没有感觉很神奇,为什么会是这个样子的呢?原因是因为mybatis设置了类型别名
MyBatis 已经为Java类型取好的别名(自己起别名时小心重复)
  MyBatis已经为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的,我们在起别名的时候千万不要占用已有的别名。


Mybatis的各种查询功能_mybatis_07

查询三 返回值类型为map


当返回数据是一条Mybatis的各种查询功能_项目搭建_08
如果我们查询出来的结果没有一个实体类与之相对应,我们就可以把返回值类型设置成为Map集合
看到上面查询记录为一条的时候,我们用map可以查询出记录,我们再来看看如果记录是多条,用刚刚的方法能不能查询出来


Map<String,Object> getUserMap();


Mybatis的各种查询功能_实战教程_09
解决方法:把多个map放在list集合中
List<Map<String,Object>> getUserMapToList();

Mybatis的各种查询功能_值类型_10
难道说map集合一定要放在list集合中,才可以把查询到的多条记录输出吗?答案是no,我们其实是有办法的,通过注解就可以了
@MapKey(“id”)
Map<String,Object> getUserMap();
Mybatis的各种查询功能_项目搭建_11
这个是官方解释Mybatis的各种查询功能_实战教程_12
在这里我们推荐一篇比较详细的介绍,大家可以看看:
Mybatis源码分析:@Mapkey的使用

总结:如果查询出来的记录有多条,我们可以有下面几种解决方法
①通过实体类类型的List集合接收
②通过map类型的List集合接收
③在mapper接口的方法上添加@MapKey注解,这个时候就可以把每条数据转换的map集合作为值,以某一个字段的值作为键,放在同一个map集合中