1、配置mybatis驼峰转化相关代码
1.1定义类MapKeyLowerWrapper.java处理驼峰转化
import java.util.Map; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.wrapper.MapWrapper; import com.google.common.base.CaseFormat; /** * 将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) { // 是否开启驼峰转化 if (useCamelCaseMapping) { // return name == null ? "" : name.toLowerCase(); 转小写 // 转驼峰 return name == null ? "" : CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name); } else { return name == null ? "" : name; } } }
1.2转化工厂MapWrapperFactory.java
mport java.util.Map; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.wrapper.ObjectWrapper; import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory; public class MapWrapperFactory implements ObjectWrapperFactory { @Override public boolean hasWrapperFor(Object object) { // 返回类型是Map时候触发转化 return object != null && object instanceof Map; } @Override public ObjectWrapper getWrapperFor(MetaObject metaObject, Object object) { return new MapKeyLowerWrapper(metaObject, (Map)object); } }
1.3 ObjectWrapperFactoryConverter.java
mport 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); } } }
1.4 MybatisConfig.java
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.xx.common.util.MapWrapperFactory; @Configuration public class MybatisConfig { @Bean public ConfigurationCustomizer mybatisConfigurationCustomizer() { return new ConfigurationCustomizer() { @Override public void customize(org.apache.ibatis.session.Configuration configuration) { configuration.setObjectWrapperFactory(new MapWrapperFactory()); } }; } }
1.5 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> <!-- 是否开启驼峰转化,这个对resultType为DTO对象时候有效 --> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 设置但JDBC类型为空时,某些驱动程序要指定值,default:OTHER --> <setting name="jdbcTypeForNull" value="NULL"/> <!--显示sql日志--> <!--<setting name="logImpl" value="STDOUT_LOGGING" />--> </settings> <!-- 返回结果处理 --> <objectWrapperFactory type="com.xxxx.common.util.MapWrapperFactory"/> </configuration>
2、测试相关代码
public Map<String, Object> findProvincePredictionByArea(String areaCode) { Map<String, Object> map = new HashMap<>(); Map<String, Object> inputParameters = new HashMap<>(); inputParameters.put("areaCode", areaCode); // 直接处理TEXT CLOB字段 List<Map<String, Object>> list = airPredictProvinceRepository.findProvincePredictionByArea(inputParameters); if (null != list && !list.isEmpty()) { for (int i = 0; i < list.size(); i++) { Map<String, Object> item = list.get(i); list.set(i, item); } map.put("data1", list.get(0)); } // 返回HashMap通过resultMap处理 List<Map<String, Object>> list2 = airPredictProvinceRepository.findProvincePredictionByArea2(inputParameters); if (null != list2 && !list2.isEmpty()) { map.put("data2", list2.get(0)); } return map; }
xml文件
<!-- PREDICTION_INFO 类型为TEXT 强转为varchar-->
<select id="findProvincePredictionByArea" resultType="java.util.Map">
select t.AREA_NAME, convert(varchar(5000),t.PREDICTION_INFO) as PREDICTION_INFO, t.PREDICT_TIME
from T_AIR_PREDICT_PROVINCE t
</select>
<!--resultMap类型指定为HashMap,指定需要处理的字段-->
<resultMap id="textMap" type="HashMap" autoMapping="true">
<result property="predictionInfo" column="PREDICTION_INFO" javaType="java.lang.String" jdbcType="LONGVARCHAR"/>
</resultMap>
<!-- PREDICTION_INFO 类型为TEXT-->
<select id="findProvincePredictionByArea2" resultMap="textMap">
select t.AREA_NAME, t.PREDICTION_INFO, t.PREDICT_TIME from T_PREDICT_PROVINCE t
</select>
3、调试结果