mybatis 返回Map类型key改为小写的操作

默认情况下,当resultType=“java.util.Map”时,返回的key值都是大写的。

现在想key改成自己想要的,只需为查询出来的字段增加个别名即可。

如:

<select id="getStudentList" resultType="java.util.Map">
select t.name as "sName",t.sex as "sSex"
 from student
</select>

as 后的双引号很关键,否则不起作用。

补充知识:mybatis返回map key值大小写去重,CaseInsensitiveMap、LinkedCaseInsensitiveMap源码

今天在写项目的时候遇见一个问题:

编写的是一套完全解耦的模块,用于利用freemarker模板动态拼接sql

然而拼接好的sql只能用LinkedHashMap返回结果集,保证数据有序,但是在数据输出的时候,mybatis 返回了key 相同,但大小写不同的数据,

在处理这个数据的时候,首先我选用了利用value值相同去做处理,但是有些数据的value值相同但是key不同

看来只能用key去做处理,首先我用了CaseInsensitiveMap 将linkedHashMap的数据放入到CaseInsensitiveMap 中,

输出的时候结果确实起到了去重的效果,但是在excel导出的时候要对应header标题头,mybatis 查询的顺序跟header 抬头是对应的,但是取出的顺序却不是对应的,

因此只能通过排序进行数据对应,但是排序的话只能使用LinkedHashMap去记住顺序

因此查询了资料发现了LinkedCaseInsensitiveMap

LinkedCaseInsensitiveMap 继承了 LinkedHashMap,可以检测关键字(不区分大小写)的唯一性,所以 ok bug完美解决

附加 LinkedCaseInsensitiveMap 源码

package org.springframework.util;

import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;

public class LinkedCaseInsensitiveMap<V> extends LinkedHashMap<String, V> {
 private Map<String, String> caseInsensitiveKeys;
 private final Locale locale;

 public LinkedCaseInsensitiveMap() {
 this((Locale)null);
 }

 public LinkedCaseInsensitiveMap(Locale locale) {
 this.caseInsensitiveKeys = new HashMap();
 this.locale = locale != null?locale:Locale.getDefault();
 }

 public LinkedCaseInsensitiveMap(int initialCapacity) {
 this(initialCapacity, (Locale)null);
 }

 public LinkedCaseInsensitiveMap(int initialCapacity, Locale locale) {
 super(initialCapacity);
 this.caseInsensitiveKeys = new HashMap(initialCapacity);
 this.locale = locale != null?locale:Locale.getDefault();
 }

 public V put(String key, V value) {
 String oldKey = (String)this.caseInsensitiveKeys.put(this.convertKey(key), key);
 if(oldKey != null && !oldKey.equals(key)) {
  super.remove(oldKey);
 }

 return super.put(key, value);
 }

 public void putAll(Map<? extends String, ? extends V> map) {
 if(!map.isEmpty()) {
  Iterator var2 = map.entrySet().iterator();

  while(var2.hasNext()) {
  Entry entry = (Entry)var2.next();
  this.put((String)entry.getKey(), entry.getValue());
  }

 }
 }

 public boolean containsKey(Object key) {
 return key instanceof String && this.caseInsensitiveKeys.containsKey(this.convertKey((String)key));
 }

 public V get(Object key) {
 if(key instanceof String) {
  String caseInsensitiveKey = (String)this.caseInsensitiveKeys.get(this.convertKey((String)key));
  if(caseInsensitiveKey != null) {
  return super.get(caseInsensitiveKey);
  }
 }

 return null;
 }

 public V getOrDefault(Object key, V defaultValue) {
 if(key instanceof String) {
  String caseInsensitiveKey = (String)this.caseInsensitiveKeys.get(this.convertKey((String)key));
  if(caseInsensitiveKey != null) {
  return super.get(caseInsensitiveKey);
  }
 }

 return defaultValue;
 }

 public V remove(Object key) {
 if(key instanceof String) {
  String caseInsensitiveKey = (String)this.caseInsensitiveKeys.remove(this.convertKey((String)key));
  if(caseInsensitiveKey != null) {
  return super.remove(caseInsensitiveKey);
  }
 }

 return null;
 }

 public void clear() {
 this.caseInsensitiveKeys.clear();
 super.clear();
 }

 public Object clone() {
 LinkedCaseInsensitiveMap copy = (LinkedCaseInsensitiveMap)super.clone();
 copy.caseInsensitiveKeys = new HashMap(this.caseInsensitiveKeys);
 return copy;
 }

 protected String convertKey(String key) {
 return key.toLowerCase(this.locale);
 }
}

以上这篇mybatis 返回Map类型key改为小写的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • mybatis多层嵌套resultMap及返回自定义参数详解

    1.两层嵌套,一个list中加另外一个list data:[ {a:123,b:456,c:[{d:7,e:8}]} ] xml文件定义的sql select * from zhy z LEFT JOIN wl w on z.id = w.zid resultMap可以定义: <resultMap id="zhyResultMap" type="zhy的doman实体" extends="zhy自动生成的BaseResultMap">

  • mybatis-plus返回map自动转驼峰配置操作

    mybatis-plus返回map自动转驼峰配置object-wrapper-factory不生效问题解决:配置map-underscore-to-camel-case: true不生效问题解决 很多时候我们工作中查询很多字段的时候一般是返回一个VO来接收,这个时候我们只要在yml中配置了 map-underscore-to-camel-case: true 就会自动将查询数据库的字段带下划线的属性转成对应实体类VO中驼峰命名的属性. 但是会经常有这种场景:例如我们只查询2个字段要返回给前端,这

  • 解决mybatis用Map返回的字段全变大写的问题

    mybatis通常情况都是用javabean作为resultType的对象,但是有时也可以使用Map去接收. <select id="execute" parameterType="String" resultType="java.util.HashMap"> ${value} </select> 如果使用Map,返回来的字段名全是大写,处理方法 Select name as "name" from v

  • mybatis 返回Map类型key改为小写的操作

    默认情况下,当resultType="java.util.Map"时,返回的key值都是大写的. 现在想key改成自己想要的,只需为查询出来的字段增加个别名即可. 如: <select id="getStudentList" resultType="java.util.Map"> select t.name as "sName",t.sex as "sSex" from student <

  • mybatis 返回Map类型key默认为大写问题

    目录 返回Map类型key默认为大写 在工作中发现的问题 修改方法 关于mybatis返回map的坑 Map中key是分大小写的 返回Map类型key默认为大写 在工作中发现的问题 默认情况下,当resultType="java.util.Map"时,返回的key值都是大写的!! <select id="getSystemDataOutZxwtList" resultType="java.util.Map"> </select&

  • mybatis返回map类型数据空值字段不显示的解决方案

    目录 mybatis返回map数据空值字段不显示 查询sql添加每个字段的判断空 ResultType利用实体返回 springMVC+mybatis查询数据 mybatis返回map空值未返回字段 mybatis开启CallSettersOnNulls mybatis返回map数据空值字段不显示 查询sql添加每个字段的判断空 IFNULL(rate,'') as rate ResultType利用实体返回 不用map springMVC+mybatis查询数据 返回resultType=”m

  • mybatis返回map结果集@MapKey使用的场景分析

    目录 mybatis返回map结果集@MapKey使用场景 使用id作为map的ke Map的value为Map,一条记录对应一个Map 使用name作为map的key mybatis使用@MapKey注解 背景和含义 具体示例 mybatis返回map结果集@MapKey使用场景 select的 resultType属性为map时: 通过MapKey指定map的key值 使用id作为map的ke @MapKey("id") Map<Long, UserInfo> getU

  • Mybatis返回map集合时,列的顺序与select不一致问题

    目录 返回map集合,列的顺序与select不一致 mybatis中返回map集合问题 1.mapper.xml中写一个查询返回map的sql 2.mapper.java 对应接收 3.错误写法 4.正确写法 返回map集合,列的顺序与select不一致 <select id="queryPercentByAsset" resultType="java.util.HashMap"> 将Hashmap换成LinkedHashMap即可 <select

  • Mybatis返回Map数据方式示例

    目录 一. 方式1 接口 调用 二. 方式2 接口 调用 三. 方式3 接口 调用 一. 方式1 接口 public interface UserMapper { List<Map<String, String>> selectTestData1(); } <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//

  • 解决MyBatis返回结果类型为Boolean的问题

    问题描述: 在使用MyBatis时,有时需要检查某个记录是否存在数据库中,然后根据其返回的布尔值true or false,来进行逻辑判断.那怎么做呢? 解决方案: 如检测某个手机号是否被注册过: <select id="checkPhoneExist" parameterType="java.lang.String" resultType="java.lang.Boolean"> <![CDATA[ select count(

  • 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查找返回Map,List集合类型的数据方式

    Mybatis查找返回Map,List集合类型的数据 一.查找返回Bean对象的List集合 基本与返回Bean对象没什么区别,resultType依然为Bean对象的全类名,只是接口中的方法类型要进行修改 public List<Employee> getEmpListByEmail(String email); 二.查询返回Bean对象的Map集合 同样,resultType依然为Bean对象的全类名,只是接口中的方法类型要进行修改,添加注解. @MapKey("Bean对象属性

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

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

随机推荐