在使用mybatis时,为了方便拓展而使用Map类型的返回值。使用Map作为返回值时,Map中的键值就是查询结果中的列名,而列名一般都是大小写字母或者下画线,和java中使用的驼峰形式不一致。而且由于不同数据库查询结果列名的大小写也并不一致,因此为了保证在使用Map时的属性一致。可以对Map类型的结果进行特殊处理,即将不同格式的列名转换为Java中的驼峰形式。
配置:在mybaits-config.xml中配置
<plugins>
<plugin interceptor=".....CameHumpInterceptor"/>
</plugins>
代码:
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.*;
import java.sql.Statement;
import java.util.*;
/**
* Mybatis Map类型下划线key转小写驼峰形式
*/
@Intercepts(
@Signature(
type = ResultSetHandler.class,
method = "handleResultSets",
args = {Statement.class}
)
)
@SuppressWarnings({"unchecked","rawtypes"})
public class CameHumpInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
List<Object> list = (List<Object>) invocation.proceed();
for(Object object:list){
if(object instanceof Map){
processMap((Map<String, Object>) object);
}else{
break;
}
}
return list;
}
/**
* 处理Map类型
* @param map
*/
private void processMap(Map<String,Object> map){
Set<String> keySet = new HashSet<String>(map.keySet());
for(String key: keySet){
if((key.charAt(0)>='A'
&& key.charAt(0)<='Z')
||key.indexOf("_")>=0){
Object value = map.get(key);
map.remove(key);
map.put(underlineToCamelhump(key),value);
}
}
}
/**
* 将下划线风格替换为驼峰风格
* @param inputString
* @return
*/
private String underlineToCamelhump(String inputString) {
StringBuilder sb = new StringBuilder();
boolean nextUpperCase = false;
for(int i = 0 ; i<inputString.length();i++){
char c = inputString.charAt(i);
if(c=='_'){
if(sb.length()>0){
nextUpperCase = true;
}
}else{
if(nextUpperCase){
sb.append(Character.toUpperCase(c));
nextUpperCase = false;
}else{
sb.append(Character.toLowerCase(c));
}
}
}
return sb.toString();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target,this);
}
@Override
public void setProperties(Properties properties) {
}
}