Mybatis返回结果封装map过程解析

需求

根据课程id 列表,查询每个课程id的总数,放到一个map里

最简单的就是循环遍历,每一个都查询一次

网上说mybatis可以返回Map 和 List<Map>两种类型

尝试

直接返回Map类型

<select id="listLessonSumByCourseIdList" resultType="java.util.HashMap">
 SELECT course_id, count(1)
 FROM lesson
 WHERE status = 0
 GROUP BY course_id;
</select>

返回的结果是:

{
"course_id":2,
"count(1)":13
}

即便我的数据库里有很过个id,返回结果也只有这一条数据。

如果直接使用 Map<Long, Integer> 类型强转,会报错

Could not write JSON: java.lang.String cannot be cast to java.lang.Number; nested exception is com.fasterxml.jackson.databind.JsonMappingException: java.lang.String cannot be cast to java.lang.Number

所以是不能直接返回Map的,而是先返回List<Map>

最终实现

Dao 类中

List<HashMap<String,Object>> listLessonSumByCourseIdList();

Mapper.xml 中

<select id="listLessonSumByCourseIdList" resultType="java.util.HashMap">
 SELECT course_id as 'key', count(1) as 'value'
 FROM lesson
 WHERE type != 1 AND status = 0
 GROUP BY course_id;
</select>

ServerImpl 中, 将List<Map> 转成 Map

public Map<Long, Long> listLessonSumByCourseIdList() {
 Map<Long, Long> map = new HashMap<>();
 List<HashMap<String, Object>> list = courseDao.listLessonSumByCourseIdList();
 if (list != null && !list.isEmpty()) {
  for (HashMap<String, Object> map1 : list) {
   Long key = null;
   Long value = null;
   for (Map.Entry<String, Object> entry : map1.entrySet()) {
    if ("key".equals(entry.getKey())) {
     key = (Long) entry.getValue();
    } else if ("value".equals(entry.getKey())) {
     value = (Long) entry.getValue();
    }
   }
   map.put(key, value);
  }
 }
 return map;
}

PS:count(1) 数据库中查询这个默认是Long类型,转Integer会报错,所以返回类型是Map<Long, Long>,而不能是Map<Long, Integer>
  java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer

PPS:但是通过这种方法查询出的数据有一些问题,如果我们想要的数据是,即便没有值,也应该返回0,那么就不能通过这种方法了,这种方法如果查询不到是没有值的,还是老老实实的循环吧

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • MyBatis insert操作插入数据之后返回插入记录的id

    MyBatis插入数据的时候,返回该记录的id <insert id="insert" keyProperty="id" useGeneratedKeys="true"
 parameterType="com.demo.domain.CountRateConfig">
 insert into query_rate_config (code,partner_type,search_count, booking_co

  • MyBatis-Plus 查询返回实体对象还是map

    在常见场景下:返回数据建议使用map,不建议使用实体对象 /** * 1. 名字包含雨并且年龄小于40 * sql:name like '%雨%' and age < 40 * <p> * 应用场景: * 当表字段非常多,但是你只需要查询少数几列, * 没必要返回的泛型为实体的list,如果返回的泛型为实体,绝大多字段都是null,这样做不优雅 * 用返回泛型为map建议使用 */ @Test public void selectByWrapperMaps() { QueryWrappe

  • mybatis查询结果返回至实体类的示例代码

    近期,利用mybatis做一个简单查询,先看主要代码: Service层: package com.example1.service; import java.util.List; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.exampl

  • mybatis中查询结果为空时不同返回类型对应返回值问题

    今天在别人的代码基础上实现新需求,看到对于mybatis查询结果的判断不是很正确,如果查询结果为空就会异常,不知道大家有没有这样的疑惑:mybatis中resultType有多种返回类型,对于每种不同类型,查询结果为空时dao接口的返回值是一样的吗?接下来我就总结一下常见的几种情况. 第一种:resultType为基本类型,如string(在此暂且把string归纳为基本类型) 如果select的结果为空,则dao接口返回结果为null 第二种,resultType为基本类型,如int 后台报异

  • 详解mybatis plus使用insert没有返回主键的处理

    项目使用springboot搭建.最初的时候是使用mybatis,后来升级到mybatis plus.按照mp的官网介绍,使用mp的insert方法,对于自增的数据库表,mp会把主键写入回实例的对应属性.但实际操作起来,却没有主键. entity 类设置如下: @TableName(value = "USERINFO") public class UserInfo { /** * 指定自增策略 */ @TableId(value = "user_id",type =

  • mybatis插入与批量插入返回ID的原理详解

    背景 最近正在整理之前基于mybatis的半ORM框架.原本的框架底层类ORM操作是通过StringBuilder的append拼接的,这次打算用JsqlParser重写一遍,一来底层不会存在太多的文本拼接,二来基于其他开源包维护难度会小一些,最后还可以整理一下原有的冗余方法. 这两天整理insert相关的方法,在将对象插入数据库后,期望是要返回完整对象,并且包含实际的数据库id. 基础相关框架为:spring.mybatis.hikari. 底层调用方法 最底层的做法实际上很直白,就是利用my

  • Mybatis Update操作返回值问题

    后端的数据持久化使用的是 Mybatis ,在做高并发下账户增减余额的时候,打算使用乐观锁来解决这个问题.在获取update操作的返回值时遇到了一个问题,似乎 Mybatis 进行 update 操作得到的 int 返回值并不是影响的行数.这下就尴尬了. 一般而言,我们知道当我们使用 Mybatis 在 mapper 接口中定义 insert delete 等操作,定义一个 int 类型的返回值,通过该值是否为 0 来判断数据库中受影响的行数进而判断操作是否成功. 到底 update 返回值代表

  • MyBatis查询返回Map示例代码

    前言 有时候我们做查询, 只需要返回两个string类型的字段,方便我们后续的处理.比如根据商品的code查询对应的分类的名字,需要返回一个map, key为商品code, value为商品分类对应的名称.以方便我们后续对结果集的处理.如果你直接用mybatis返回一个map, 你可能会发现,结果根据不是自己需要的.这时候我们需要自己实现一个ResultHandler来实现我们想要的结果,废话不多说,直接上代码 方法如下 第一步,在mapper.xml文件当中,定义一个ResultMap <re

  • Mybatis返回单个实体或者返回List的实现

    Mybatis 的强大之处之一体现在映射语句上,让我们可以使用简单的配置,就可以实现对参数和返回结果的映射. 实体 package com.test.User public class User{ private String userId; private String userName; private String userPassword; private Date createTime; ... setter getter.... } DAO public interface User

  • Mybatis返回结果封装map过程解析

    需求 根据课程id 列表,查询每个课程id的总数,放到一个map里 最简单的就是循环遍历,每一个都查询一次 网上说mybatis可以返回Map 和 List<Map>两种类型 尝试 直接返回Map类型 <select id="listLessonSumByCourseIdList" resultType="java.util.HashMap"> SELECT course_id, count(1) FROM lesson WHERE stat

  • springmvc处理模型数据Map过程解析

    这篇文章主要介绍了springmvc处理模型数据Map过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 SpringmvcTest.java @RequestMapping("/springmvc") @Controller public class SpringmvcTest { private static final String SUCCESS = "success"; @RequestMapping

  • Mybatis pagehelper分页插件使用过程解析

    这篇文章主要介绍了mybatis pagehelper分页插件使用过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用过mybatis的人都知道,mybatis本身就很小且简单,sql写在xml里,统一管理和优化.缺点当然也有,比如我们使用过程中,要使用到分页,如果用最原始的方式的话,1.查询分页数据,2.获取分页长度,也就是说要使用到两个方法才能完成分页.有没有更更好的分页方式的,pagehelper分页插件因此而诞生,他的原理是利用

  • mybatis返回key value map集合方式

    目录 mybatis返回key value map集合 mybatis返回map,key为主键,value为对象 mybatis返回key value map集合 XML:文件 <select id="getData" resultMap="userMap" >     SELECT id,name FROM user         </select>   <resultMap id="userMap" type=

  • MyBatis动态SQL实现配置过程解析

    动态SQL 什么是动态SQL: ​ 动态SQL就是根据不同的条件生成不同的SQL语句 if choose(when,otherwise) trim(where,set) foreach 1.搭建环境 建表 CREATE TABLE `bolg`( `id` VARCHAR(50) NOT NULL COMMENT '博客id', `title` VARCHAR(100) not null comment '博客标题', `author` VARCHAR(30) not null comment

  • MyBatis开启二级缓存实现过程解析

    MyBatis的一级缓存是sqlSession作用域的,默认开启,执行DML(insert, update, delete)操作后自动删除. 下面介绍一下如何开启MyBatis的二级缓存,作用域为Mapper: 1.修改config.xml配置文件: <settings> <!-- 开启二级缓存 --> <setting name="cacheEnabled" value="true"/> </settings> 这里

  • mybatis中返回多个map结果问题

    目录 mybatis返回多个map结果 mybatis返回map类型的注意事项及小技巧 1.resultType="java.util.Map" 2.定义一个resultMap标签, 3.返回的Map对象 mybatis返回多个map结果 如果返回一条结果,xml直接这样写: <select id="searchncomedateByInvestID" resultMap="java.util.HashMap">     select

  • mybatis plus代码生成器配置过程解析

    这篇文章主要介绍了mybatis plus代码生成器配置过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 最近在玩项目,发现自己写严重浪费时间~于是想到了代码生成器,之前用过一次的mybatis-plus,再重新实现了一下 确保修改好对应的配置即可 依赖: <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boo

  • Spring MVC处理方法返回值过程解析

    这篇文章主要介绍了Spring MVC处理方法返回值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 对于Spring MVC处理方法支持支持一系列的返回方式: (1)ModelAndView (2)Model (3)ModelMap (4)Map (5)View (6)String (7)Void (8)Object 一,ModelAndView @RequestMapping("/threadRequest*") publi

  • Mybatis一对多关联关系映射实现过程解析

    这篇文章主要介绍了Mybatis一对多关联关系映射实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一对多关联关系只需要在多的一方引入少的一方的主键作为外键即可.在实体类中就是反过来,在少的一方添加多的一方,声明一个List<另一方> 属性名 作为少的一方的属性. 用户和订单就是一对多的关系,从用户角度看就是一对多关系,从订单的角度来看就是多对一的关系. /** * 订单持久化类 */ public class Orders { p

随机推荐