标签:
之前用spring jdbc的时候发下spring可以驼峰转换,所以一直希望mybatis也有,之前还以为mybatis这个是个bug,后来发现原来也是有的,用起来也是很简单的,在setting设置下就可以了,这里就不说了,下面说下是怎么实现的
public String findProperty(String name) { StringBuilder prop = buildProperty(name,new StringBuilder()); return prop.length() > 0 ?prop.toString() : null; } public String findProperty(String name,boolean useCamelCaseMapping) { if (useCamelCaseMapping) { name = name.replace("_",""); } return findProperty(name); }
如果我们设置了,useCamelCaseMapping=ture,那么mybatis就把_给干掉了,看到这里我也很疑惑,还以为是坑爹呢,
我们接着往下看,buildProperty
private StringBuilderbuildProperty(String name, StringBuilder builder) { PropertyTokenizer prop = newPropertyTokenizer(name); if (prop.hasNext()) { String propertyName =reflector.findPropertyName(prop.getName()); if (propertyName != null) { builder.append(propertyName); builder.append("."); MetaClass metaProp =metaClassForProperty(propertyName); metaProp.buildProperty(prop.getChildren(), builder); } } else { String propertyName =reflector.findPropertyName(name); if (propertyName != null) { builder.append(propertyName); } } return builder; }
其实是从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>();
存储的就是field 的upperCaseName和真实的Name 也就是我们的驼峰转换,或者其实不对称的驼峰也是可以的,只要把_去掉,应该就可以拿到的
Mybatis 之mapUnderscoreToCamelCase
标签:
原文地址:http://blog.csdn.net/qjueyue/article/details/43617383