mybatis 字段名自动转小写_mybatis会自动把字段名中的下划线转为驼峰命名法?

先看一下转化的调用堆栈:

代码如下:

上面代码只是去掉了下划线,并没有首字母小写变大写的代码。再跟进findProperty方法可以找到获取驼峰结果的代码如下:

可以看出通过reflector.findPropertyName方法把去掉下划线的变量转成了驼峰的变量。再跟过去看到这样的代码:

那么caseInsensitivePropertyMap这个集合又是什么时候初始化的呢?原来是系统启动时,spring加载上下文的时候:

而它的key其实是实体类的set与get方法后面的字符(org.apache.ibatis.reflection.Reflector.addGetMethods,org.apache.ibatis.reflection.property.PropertyNamer.methodToProperty),而这个方法一般都是标准的驼峰格式。所以当get(大写字段)名时,可以得到标准的驼峰字段名。

PropertyTokenizer类

这个类是property包中的重量级类,该类会被reflection包中其他的类频繁的引用到。这个类实现了Iterable和Iterator这两个接口,但在使用时经常被用到的是Iterator接口中的hasNext这个函数。我们着重了解这个类的属性和构造函数:

//包含四个属性,比较简单

private String name;

private String index;

private String indexedName;

private String children;

public PropertyTokenizer(String propertyName) {

// 对参数进行第一次处理,通过“.”分隔符将propertyName分作两部分

int delimiter = propertyName.indexOf(".");

if (delimiter > -1) {

name = propertyName.substring(0, delimiter);

children = propertyName.substring(delimiter + 1);

} else {

name = propertyName;

children = null;

}

indexedName = name;

// 对name进行二次处理,去除“[...]”,并将方括号内的内容赋给index属性,如果name属性中包含“[]”的话

delimiter = propertyName.indexOf("[");

if (delimiter > -1) {

// 先取index内容再截取name更为方便些,要不然还需要一个临时变量,需要三步才能实现

// 这里包含了一个前提:传入的参数如果有有[,则必然存在],并且是属性的最后一个字符

index = name.substring(delimiter + 1, name.length() - 1);

name = name.substring(0, delimiter);

}

}

经常使用的hasNext函数实现比较简单,就是判断children属性是不是为空:

public boolean hasNext() {

// TODO Auto-generated method stub

return children != null;

}

Mybatis 之mapUnderscoreToCamelCase

2015年02月08日 00:01:20

鱼台猿人

阅读数 19192

之前用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 MapcaseInsensitivePropertyMap = new HashMap();

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

再把整个流程整理一下:

所以其实不是转换下划线,而是去掉下划线,再取驼峰的变量。不过最后的效果与转换的一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值