MyBatis的各种查询功能

前言

使用MyBatis进行查询时,查询出来的数据可能是一条数据、或者多条数据,我们需要根据返回数据的条数来指定返回的类型 ------ 实体类、list集合……

查询记录只有一条

只有一条查询记录是最方便的,我们可以使用:

  1. 实体类对象来接收;
  2. List集合接收;
  3. 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集合中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值