MyBatis Map结果的Key转为驼峰式
MyBatis配置文件中,支持下面这几种配置:
properties,settings,typeAliases,typeHandlers,
objectFactory,objectWrapperFactory,reflectorFactory,
plugins,environments,databaseIdProvider,mappers
我们使用objectWrapperFactory来解决这个问题。
配置这个属性时,必须遵守上面属性配置的顺序进行配置(在objectFactory后面,在reflectorFactory前面),否则就会出错。
objectWrapperFactory接口如下:
publicinterfaceObjectWrapperFactory{
booleanhasWrapperFor(Objectobject);
ObjectWrappergetWrapperFor(MetaObjectmetaObject,Objectobject);
}
通过实现这个接口,可以判断当object是Map类型时,返回true,然后在下面的getWrapperFor中返回一个可以处理key为驼峰的Wrapper类即可。
首先,参考已有的MapWrapper实现自己的MyWrapper:
packagetk.mybatis;
importorg.apache.ibatis.reflection.MetaObject;
importorg.apache.ibatis.reflection.wrapper.MapWrapper;
importjava.util.Map;
/**
*驼峰处理
*/
publicclassMyMapWrapperextendsMapWrapper{
publicMyMapWrapper(MetaObjectmetaObject,Mapmap){
super(metaObject,map);
}
@Override
publicStringfindProperty(Stringname,booleanuseCamelCaseMapping){
if(useCamelCaseMapping
&&((name.charAt(0)>='A'&&name.charAt(0)<='Z')
||name.indexOf("_")>=0)){
returnunderlineToCamelhump(name);
}
returnname;
}
/**
*将下划线风格替换为驼峰风格
*@paraminputString
*@return
*/
publicStringunderlineToCamelhump(StringinputString){
StringBuildersb=newStringBuilder();
booleannextUpperCase=false;
for(inti=0;i0){
nextUpperCase=true;
}
}else{
if(nextUpperCase){
sb.append(Character.toUpperCase(c));
nextUpperCase=false;
}else{
sb.append(Character.toLowerCase(c));
}
}
}
returnsb.toString();
}
}
这种方式实现起来很容易。然后提供ObjectWrapperFactory实现类:
packagetk.mybatis;
importorg.apache.ibatis.reflection.MetaObject;
importorg.apache.ibatis.reflection.wrapper.ObjectWrapper;
importorg.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;
importjava.util.Map;
/**
*Map类型结果转驼峰
*/
publicclassMapWrapperFactoryimplementsObjectWrapperFactory{
@Override
publicbooleanhasWrapperFor(Objectobject){
returnobject!=null&&objectinstanceofMap;
}
@Override
publicObjectWrappergetWrapperFor(MetaObjectmetaObject,Objectobject){
returnnewMyMapWrapper(metaObject,(Map)object);
}
}
仍然很简单,在MyBatis配置文件中配置上objectWrapperFactory:
因为代码中判断了useCamelCaseMapping,所以想要真正能够使用这个功能,还需要在settings中增加如下配置:
这种方式不需要使用拦截器,而且直接从源头对Map的key进行处理,不会产生任何额外的消耗,如果你经常设置返回值resultType为map,可以尝试该方法。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接