Mybatis的各种查询功能

前言

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

查询的记录有多条

如果查询出来有多条记录,但是我们方法的返回类型是实体类,就会报下面的错误
在这里插入图片描述
在这里插入图片描述

org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne()
因为,当我们的方法返回值类型是实体类,底层会调用selectOne方法,这个方法的返回数据只能有一个

总结:查询出来的记录有一条,返回值类型可以是实体类,也可以是集合,如果记录有多条,返回值类型可以设置成List集合,也可以是Map集合,但是一定不能设置成实体类类型,不然报错TooManyResultsException
在这里插入图片描述
在这里插入图片描述

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

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

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

在这里插入图片描述这里是引用
大家有没有感觉很神奇,为什么会是这个样子的呢?原因是因为mybatis设置了类型别名
MyBatis 已经为Java类型取好的别名(自己起别名时小心重复)
  MyBatis已经为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的,我们在起别名的时候千万不要占用已有的别名。

在这里插入图片描述

查询三 返回值类型为map

当返回数据是一条在这里插入图片描述
如果我们查询出来的结果没有一个实体类与之相对应,我们就可以把返回值类型设置成为Map集合
看到上面查询记录为一条的时候,我们用map可以查询出记录,我们再来看看如果记录是多条,用刚刚的方法能不能查询出来

 Map<String,Object> getUserMap();

这里是引用
解决方法:把多个map放在list集合中
List<Map<String,Object>> getUserMapToList();

在这里插入图片描述
难道说map集合一定要放在list集合中,才可以把查询到的多条记录输出吗?答案是no,我们其实是有办法的,通过注解就可以了
@MapKey(“id”)
Map<String,Object> getUserMap();
在这里插入图片描述
这个是官方解释在这里插入图片描述
在这里我们推荐一篇比较详细的介绍,大家可以看看:
Mybatis源码分析:@Mapkey的使用

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

猜你喜欢

转载自blog.csdn.net/qq_52797170/article/details/123890920