MyBatis返回Map鍵值對數據Key值改小寫

--場景一:
select code,name,addr from users
---場景二:
select * from users

使用MyBatis查詢且resultType=Map時,如果未做任何配置,以上兩個SQL查詢結果均如下:

[{
	CODE: '1',
	NAME: '張三',
	ADDR: '上海'
}]

我希望將鍵值改爲小寫:

方法一:設置返回字段的別名

對於場景一,我們可以給每個查詢字段加個別名,如下:

select 
	code as "code",
	name as "name",
	addr as "addr"
from users

但加別名的方式不適用於場景二。

方法二:通用方法(推薦)

  • 步驟一:創建類MapKeyLowerWrapper.java,繼承MapWrapper。該類將查詢結果轉換成Map。
package com.example.demo.filter;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.wrapper.MapWrapper;
import java.util.Map;
/**
 * 將Map的key全部轉換爲小寫
 */
public class MapKeyLowerWrapper extends MapWrapper {

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

    @Override
    public String findProperty(String name, boolean useCamelCaseMapping) {
        return name == null ? "" : name.toLowerCase();
    }
}

步驟二:創建類MapWrapperFactory.java。該類引用調用剛創建的自定義轉換類MapKeyLowerWrapper

package com.example.demo.filter;

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 MapKeyLowerWrapper(metaObject, (Map) object);
    }
}

步驟三:創建類ObjectWrapperFactoryConverter.java

package com.example.demo.filter;

import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;
import org.springframework.boot.context.properties.ConfigurationPropertiesBinding;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;


@Component
@ConfigurationPropertiesBinding
public class ObjectWrapperFactoryConverter implements Converter<String, ObjectWrapperFactory> {
    @Override
    public ObjectWrapperFactory convert(String source) {
        try {
            return (ObjectWrapperFactory) Class.forName(source).newInstance();
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}

步驟四:在yml中添加 MapWrapperFactory 的配置

#mybatis配置
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  configuration:
    object-wrapper-factory: com.example.demo.filter.MapWrapperFactory

重啓即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章