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;i 0){ 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,可以尝试该方法。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接