MyBatis的各种查询功能
前言
使用MyBatis进行查询时,查询出来的数据可能是一条数据、或者多条数据,我们需要根据返回数据的条数来指定返回的类型 ------ 实体类、list集合……
查询记录只有一条
只有一条查询记录是最方便的,我们可以使用:
- 实体类对象来接收;
- List集合接收;
- Map集合接收,结果{password=123456, sex=男, id=1, age=23, username=admin}
查询SQL语句使用了聚合函数
聚合函数举个例子就是求该表有多少条信息。
select count(*) from t_user
此时我们查询出来的数据就是单行单列的数据,类似是int或者String类型,对于Int这种没有实体类的对象我们怎么来设置别名呢:
mybatis设置了类型别名:
MyBatis 已经为Java类型取好的别名(自己起别名时小心重复),MyBatis已经为许多常见的Java 类型内建了相应的类型别名。它们都是大小写不敏感的,我们在起别名的时候千万不要占用已有的别名。
查询记录有多条
当有多条查询记录时,我们使用实体类对象来接收肯定是不行的,会报错哟!报错如下:TooManyResultsException
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne()
因为,当我们的方法返回值类型是实体类,底层会调用selectOne方法,这个方法的返回数据只能有一个
方法一
将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,此时可以将这些map放在一个list集合中获取
/**
* 查询所有用户信息为map集合
* @return
*/
List<Map<String, Object>> getAllUserToMap();
<!--List<Map<String, Object>> getAllUserToMap();-->
<select id="getAllUserToMap" resultType="map">
select * from t_user
</select>
@Test
public void getAllUserToMap(){
SqlSession sqlSession = getSqlSessionUtil.getSqlSession();
SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
List<Map<String, Object>> mapList = mapper.getAllUserToMap();
mapList.forEach(map -> System.out.println(map));
}
结果:
方法二
将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,并且最终要以一个map的方式返回数据,此时需要通过@MapKey注解设置map集合的键,值是每条数据所对应的map集合
/**
* 查询所有用户信息为map集合
* @return
*/
@MapKey("id")
Map<String, Object> getAllUserToMapMapKey();
<!--Map<String, Object> getAllUserToMapMapKey();-->
<select id="getAllUserToMapMapKey" resultType="map">
select * from t_user
</select>
@Test
public void getAllUserToMapMapKey(){
SqlSession sqlSession = getSqlSessionUtil.getSqlSession();
SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
Map<String, Object> map = mapper.getAllUserToMapMapKey();
System.out.println(map);
}
结果:
对于MapKey我们去查阅资料,了解到他的一些信息:
在这里我们推荐一篇比较详细的介绍,大家可以看看:
链接: Mybatis源码分析:@Mapkey的使用
总结:如果查询出来的记录有多条,我们可以有下面几种解决方法
①通过实体类类型的List集合接收
②通过map类型的List集合接收
③在mapper接口的方法上添加@MapKey注解,这个时候就可以把每条数据转换的map集合作为值,以某一个字段的值作为键,放在同一个map集合中