Mybatis 之mapUnderscoreToCamelCase

之前用spring jdbc的时候发下spring可以驼峰转换,所以一直希望mybatis也有,之前还以为mybatis这个是个bug,后来发现原来也是有的,用起来也是很简单的,setting设置下就可以了,这里就不说了,下面说下是怎么实现的

 

  1. public String findProperty(String name) {  
  2.    StringBuilder prop = buildProperty(name,new StringBuilder());  
  3.    return prop.length() > 0 ?prop.toString() : null;  
  4.  }  
  5.   
  6.  public String findProperty(String name,boolean useCamelCaseMapping) {  
  7.    if (useCamelCaseMapping) {  
  8.      name = name.replace("_","");  
  9.    }  
  10.    return findProperty(name);  
  11.  }  


 

如果我们设置了,useCamelCaseMapping=ture,那么mybatis就把_给干掉了,看到这里我也很疑惑,还以为是坑爹呢,

我们接着往下看,buildProperty

  1. private StringBuilderbuildProperty(String name, StringBuilder builder) {  
  2.     PropertyTokenizer prop = newPropertyTokenizer(name);  
  3.     if (prop.hasNext()) {  
  4.       String propertyName =reflector.findPropertyName(prop.getName());  
  5.       if (propertyName != null) {  
  6.         builder.append(propertyName);  
  7.         builder.append(".");  
  8.         MetaClass metaProp =metaClassForProperty(propertyName);  
  9.        metaProp.buildProperty(prop.getChildren(), builder);  
  10.       }  
  11.     } else {  
  12.       String propertyName =reflector.findPropertyName(name);  
  13.       if (propertyName != null) {  
  14.         builder.append(propertyName);  
  15.       }  
  16.     }  
  17.     return builder;  
  18.   }  


其实是从reflector获取的数据,做个reflector是干嘛的呢,其实就是mybatis来存储class信息的,也可以说是mybatis的反射工具类

 

Reflector里面

public StringfindPropertyName(String name) {

    returncaseInsensitivePropertyMap.get(name.toUpperCase(Locale.ENGLISH));

  }

做个toUpperCase是个关键,他忽略了我们类里面的属性值,也就是说我们一个id和一个ID属性,对于mybatis来说可能是一直的呦

 

private Map<String, String>caseInsensitivePropertyMap = new HashMap<String, String>();

存储的就是fieldupperCaseName和真实的Name也就是我们的驼峰转换,或者其实不对称的驼峰也是可以的,只要把_去掉,应该就可以拿到的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值