MyBatis查询返回Map示例代码

前言

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

方法如下

第一步,在mapper.xml文件当中,定义一个ResultMap

 <resultMap id="cateNameMapping" type="java.util.HashMap" >
  <result property="key" column="commodityCode"></result>
  <result property="value" column="cateName"></result>
 </resultMap>

这个map当中的property的定义,是我们在定义ResultHandler的时候,需要用到的.column是我们做sql查询的时候mysql中字段的名称,注意这里不支持驼峰自动映射,比如我这里写了commodityCode, 后面需要用AS来处理一下.

第二步正常的在我们的mapper.xml中写查询语句

<select id="processCateNameMappingByGoodsCodes" parameterType="java.util.List" resultMap="cateNameMapping">
    SELECT
        c.commodity_code AS commodityCode,
        CONCAT(tc.cate_name,',',tc1.cate_name, ',', tc2.cate_name) AS cateName
    FROM
       t_commodity c LEFT JOIN t_category tc ON c.commodity_first_id = tc.id
              LEFT JOIN t_category tc1 ON c.commodity_second_id = tc1.id
              LEFT JOIN t_category tc2 ON c.commodity_third_id = tc2.id
    WHERE
      c.commodity_code IN
        <foreach collection="list" separator="," open="(" close=")" item="code">
          #[code]
        </foreach>
  </select>

注意返回类型为ResultMap, 也就是我们上面定义的那个.

第三步 自定义一个ResultHandler

package org.linuxsogood.es.statistical.handler;

import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;

import java.util.HashMap;
import java.util.Map;

/**
 * @author honway
 * @date 2018/10/22 11:49.
 * @blog http://linuxsogood.org
 */
public class MapResultHandler implements ResultHandler {

  private final Map<String ,String> mappedResults = new HashMap();

  @Override
  public void handleResult(ResultContext resultContext) {
    Map<String ,String> m = (Map) resultContext.getResultObject();
    mappedResults.put(m.get("key"), m.get("value"));
  }

  public Map getMappedResults() {
    return mappedResults;
  }
}

第四步 就是使用了, 我们在service层, 利用spring的自动注入,来注入mybatis的sqlSession

@Service
public class GoodsSalesServiceImpl implements IGoodsSalesService {

  private final GoodsSalesMapper goodsSalesMapper;
  private final SqlSession sqlSession;

  @Autowired
  public GoodsSalesServiceImpl(GoodsSalesMapper goodsSalesMapper, SqlSession sqlSession) {
    this.goodsSalesMapper = goodsSalesMapper;
    this.sqlSession = sqlSession;
  }

  /**
   * 根据商品code查询商品的一二三级分类
   * @param commodityCodeList 商品code
   * @return 返回商品和分类的映射, key为商品code, value为商品的一二三级分类,用逗号隔开
   */
  @Override
  public Map<String, String> processCateNameMappingByGoodsCodes(List<String> commodityCodeList) {
    MapResultHandler handler = new MapResultHandler();
    sqlSession.select("com.tramy.es.statistical.dao.GoodsSalesMapper.processCateNameMappingByGoodsCodes",commodityCodeList ,handler);
    return handler.getMappedResults();
  }
}

使用sqlSession的select方法,第一个参数是mapper.xml文件当中定义的select的命名空间, 第二个参数是需要传入的参数,如果没有可以不要这个参数.第三个是我们自定义的handler, 这样就能返回我们要的map结果了.

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Mybatis Update操作返回值问题

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

  • Mybatis 插入一条或批量插入 返回带有自增长主键记录的实例

    首先讲一下, 插入一条记录返回主键的 Mybatis 版本要求低点,而批量插入返回带主键的 需要升级到3.3.1版本,3.3.0之前的都不行. <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>3.3.1</version> </dependency> 1.MySQL <

  • Mybatis查不到数据查询返回Null问题

    mybatis突然查不到数据,查询返回的都是Null,但是 select count(*) from xxx查询数量,返回却是正常的. Preparing: SELECT id,a9004,a9005,a9015 FROM a90 where a9010 = ? ORDER BY id LIMIT 1 [DEBUG] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:139):http-bio-8080

  • MyBatis中insert操作返回主键的实现方法

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能 针对Sequence主键而言,在执行insert sql前必须指定一个主键值给要插入的记录,如Oracle.DB2,可以采用如下配置方式: <insert id="add" parameterType="vo.Category"> <selectKey resultType="

  • Mybatis返回int或者Integer类型报错的解决办法

    会报错如下: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Mapper method 'com.bill.springMybatis.dao.UserDao.getUserIdByName attempted to return null from a m

  • MyBatis查询返回Map示例代码

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

  • mybatis查询返回Map<String,Object>类型的讲解

    目录 查询返回Map<String,Object>类型 mybatis返回结果为Map问题 查询返回Map<String,Object>类型 mybatis 查询返回Map<String,Object> 类型,平时没太注意怎么用,今天又遇到了总结记录一下,方便以后处理此类问题. Mapper.java中的方法: @MapKey("userId") Map<String,UserInfo> personalInfoByUserIds(Lis

  • Mybatis查询返回Map<String,Object>类型实例详解

    这篇我们来说一下Mybatis的查询结果返回Map类型. 首先我们在企业开发中是很少使用到Map返回类型的,很多都是直接返回一个对象实体.尤其是苞米豆出了MP框架之后,XML都是很少写的. 那么在什么情况下需要使用Map来作为返回的结果类型呢? 案例:有一个模块A和模块B,A模块的POM依赖引入了B模块,A模块可以直接使用B模块的实体,但是B模块使用不到A模块的实体,如果在B模块POM中引入A模块的依赖,那么在运行时会出现依赖循环错误,这时候就需要自己写SQL来返回Map类型了,因为返回不了另一

  • MyBatis Plus 实现多表分页查询功能的示例代码

    在Mybatis Plus 中,虽然IService 接口帮我们定义了很多常用的方法,但这些都是 T 对象有用,如果涉及到 多表的查询,还是需要自定义Vo 对象和自己编写sql 语句,Mybatis Plus提供了一个Page 对象,查询是需要设置其中的 size 字段 和 current 字段的值 一.分页配置 可以直接使用selectPage这样的分页,但返回的数据确实是分页后的数据,但在控制台打印的SQL语句其实并没有真正的物理分页,而是通过缓存来获得全部数据中再进行的分页,这样对于大数据

  • MyBatis XML方式的基本用法之多表查询功能的示例代码

    1. 多表查询 在之前,我们示例的2个查询都是单表查询,但实际的业务场景肯定是需要多表查询的,比如现在有个需求: 查询某个用户拥有的所有角色.这个需求要涉及到sys_user,sys_user_role,sys_role三张表,如何实现呢? 首先,在SysUserMapper接口中定义如下方法. /** * 根据用户id获取角色信息 * * @param userId * @return */ List<SysRole> selectRolesByUserId(Long userId); 然后

  • 史上最简单的MyBatis动态SQL入门示例代码

    假如有如下的关于书籍基本信息的表: DROP DATABASE IF EXISTS `books`; CREATE DATABASE `books`; USE books; DROP TABLE IF EXISTS `book`; CREATE TABLE `book` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(128) DEFAULT NULL, `author` varchar(64) DEFAULT NULL, `pres

  • Mybatis动态SQL的示例代码

    目录 基本流程 IF,Where Set Choose(when,otherwise) SQL片段 总结 什么是动态SQL:动态SQL就是根据不同的条件生成不同的SQL语句 基本流程 1,数据库准备一张表 2,导包 3,编写核心配置文件 4,编写实体类 5,编写实体类对应的Mapper和Mapper.xml文件 6,在核心配置文件中注册Mapper.xml 7,测试 开启自动驼峰命名规则映射 <!--开启驼峰命名映射--> <setting name="mapUnderscor

  • Python调用百度根据经纬度查询地址的示例代码

    如下所示: def locatebyLatLng(lat, lng, pois=0): ''' 根据经纬度查询地址 ''' items = {'location': str(lat) + ',' + str(lng), 'ak': '你自己申请的百度ak', 'output': 'json'} res = requests.get('http://api.map.baidu.com/geocoder/v2/', params=items) result = res.json() print(re

  • mybatis insert返回主键代码实例

    这篇文章主要介绍了mybatis insert返回主键代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在使用ibatis插入数据进数据库的时候,会用到一些sequence的数据,有些情况下,在插入完成之后还需要将sequence的值返回,然后才能进行下一步的操作. 使用ibatis的selectKey就可以得到sequence的值,同时也会将值返回.不过对于不同的数据库有不同的操作方式. 对于oracle: <insert id="

  • Mybatis中返回Map的实现

    在Mybatis中,我们通常会像下边这样用: 返回一个结果 User selectOne(User user); <select id="selectOne" parameterType="cn.lyn4ever.entity.User" resultType="cn.lyn4ever.entity.User"> select id,username,telphone from user where telphone=#{telpho

随机推荐