开发喵星球

若依mybatis返回map将下划线命名转为驼峰式命名(十四)

默认情况,若依不支持这个配置,需要我们重写配置类才能到达需求。

一、需求情景复现

这里只展示controller接口部分代码,其余代码在这里不过多介绍。

@GetMapping("/map")
@ResponseBody
public AjaxResult selectNoticeMap() {
    List<Map<String,Object>> map = noticeService.selectNoticeMap();
    return AjaxResult.success(map);
}

例如以若依中的公告类,返回一个List<Map<String,Object>> 集合,通过postman调用

image-20231017010137000

可以发现,默认情况下,返回的key都是以下划线命令的,本章需求就是解决如何将以下划线命令的key转换为驼峰式。

二、重写配置类

(1)导入guava依赖
ruoyi-common模块中的pom.xml下添加

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

(2)编写配置类

MapWrapperFactory .java

package com.ruoyi.framework.config.mybatis;

import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.wrapper.ObjectWrapper;
import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;

import java.util.Map;

public class MapWrapperFactory implements ObjectWrapperFactory {
    @Override
    public boolean hasWrapperFor(Object object) {
        return object != null && object instanceof Map;
    }
    @Override
    public ObjectWrapper getWrapperFor(MetaObject metaObject, Object object) {
        return new MyMapWrapper(metaObject, (Map) object);
    }
}

MyMapWrapper.java

package com.ruoyi.framework.config.mybatis;

import com.google.common.base.CaseFormat;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.wrapper.MapWrapper;

import java.util.Map;

public class MyMapWrapper extends MapWrapper {

    MyMapWrapper(MetaObject metaObject, Map<String, Object> map) {
        super(metaObject, map);
    }

    /**
     * mybatis查询结果下划线转峰坨
     *
     * @param name
     * @param useCamelCaseMapping 是否进行转换。yml 中配置map-underscore-to-camel-case=true
     * @return
     */
    @Override
    public String findProperty(String name, boolean useCamelCaseMapping) {
        if (useCamelCaseMapping) {
            // 使用guava的转换方法,覆盖Map的默认返回值
            return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name);
        }
        return name;
    }

}

然后在MyBatisConfig.java 中配置@Bean

/**
 * mybatis resultType为map时下划线键值转小写驼峰形式插
 */
@Bean
public ConfigurationCustomizer configurationCustomizer() {
    return configuration -> configuration.setObjectWrapperFactory(new MapWrapperFactory());
}

最后修改mybatis-config.xml,完成最终配置 。

mybatis-config.xml文件位置:ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 全局参数 -->
    <settings>
        <!-- 使全局的映射器启用或禁用缓存 -->
        <setting name="cacheEnabled" value="true"/>
        <!-- 允许JDBC 支持自动生成主键 -->
        <setting name="useGeneratedKeys" value="true"/>
        <!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
        <setting name="defaultExecutorType" value="SIMPLE"/>
        <!-- 指定 MyBatis 所用日志的具体实现 -->
        <setting name="logImpl" value="SLF4J"/>
        <!-- 使用驼峰命名法转换字段 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <objectWrapperFactory type="com.ruoyi.framework.config.mybatis.MapWrapperFactory"/>
</configuration>

注意点:一定要设置mapUnderscoreToCamelCase为true,否则配置将不会生效。

三、验证结果

image-20231017010029295

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2023-10-17 09:14:04 阅读量:213
<<   >>


powered by kaifamiao