先看一下转化的调用堆栈:
代码如下:
上面代码只是去掉了下划线,并没有首字母小写变大写的代码。再跟进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
 
版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明。

之前用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>();

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

再把整个流程整理一下:

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

Mybatis 之mapUnderscoreToCamelCase

2015年02月08日 00:01:20 鱼台猿人 阅读数 19192
 
版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明。

之前用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>();

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

mybatis会自动把字段名中的下划线转为驼峰命名法?的更多相关文章

  1. js中字符串下划线转为驼峰

    function camelCase(string){ // Support: IE9-11+ return string.replace( /-([a-z])/g, function( all, l ...

  2. 解决ASP.NET MVC返回的JsonResult 中 日期类型数据格式问题,和返回的属性名称转为“驼峰命名法”和循环引用问题

    DateTime类型数据格式问题 问题 在使用ASP.NET MVC 在写项目的时候发现,返回给前端的JSON数据,日期类型是 Date(121454578784541) 的格式,需要前端来转换一下才 ...

  3. MyBatis Generator 下划线转驼峰命名

    MyBatis Generator配置文件--指定生成实体类使用实际的表列名作为实体类的属性名 table标签下的设置属性useActualColumnNames用于指定生成实体类时是否使用实际的列名 ...

  4. Python3中关于下划线变量和命名的总结

    变量 #!-*-coding:utf-8-*- #__author__ = 'ecaoyng' # # 变量 #_xxx,单下划线开头的变量,标明是一个受保护(protected)的变量,原则上不允许 ...

  5. mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)字符串拼接cancat实战例子

    mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)mysql字符串拼接cancat实战例子: mysql update set 多个字段相加,如果是数字相加可以直接用+号(注:hund ...

  6. ABAP开发环境终于支持以驼峰命名法自动格式化ABAP变量名了

    Jerry进入SAP成都研究院前,一直是用C/C++开发,所以刚接触ABAP,对于她在某些语法环境下大小写敏感,某些环境下不敏感的特性很不适应.那时候Jerry深深地怀念之前在C/C++编程时遵循的驼 ...

  7. C语言中变量名及函数名的命名规则与驼峰命名法

    一.C语言变量名的命名规则:(可以字母,数字,下划线混合使用) 1. 只能以字母或下划线开始:2. 不能以数字开始:3. 一般小写:4. 关键字不允许用(eg:int float=2//error  ...

  8. mybatis 下划线转驼峰配置

    一直以来,在sqlmap文件中,对于数据库中的下划线字段转驼峰,我们都是通过resultmap来做的,如下: <resultMap id="ISTableStatistics" ...

  9. Mybatis 结果映射下划线转驼峰

    mybatis 结果映射下划线转驼峰 Spring Boot 配置: #下划线转驼峰 mybatis.configuration.map-underscore-to-camel-case=true m ...

随机推荐

  1. 关于vue 里:class 的几种使用方式

    最近一直在做vue项目 从网上搜索到的资料不太多.关于:class的使用 结合自己的实现 整理如下.接下来一篇写:style .其实从:class 这里可以想到:style的使用 也是类似的 一 cl ...

  2. 实例:通过调用外部程序进行录制视频(ffmpeg.exe)

    相关知识点: 1. ffmpeg可以用下面的参数来录制Windows 桌面操作的视频. ffmpeg.exe -y -rtbufsize 100M -f gdigrab -framerate 10 - ...

  3. Codeforces Round #622 (Div. 2)C(单调栈,DP)

    构造出的结果一定是一个单峰/\这种样子的 #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ...

  4. youtube-dl parameters

    how to select the format of vidoes from youtube-dl? https://www.jianshu.com/p/611009843919 https://u ...

  5. C语言-防止输入字母

    今天群里一位小伙伴问了一个关于scanf函数的问题: scanf("%d", &n); 这个代码怎么防止输入字母? 因为他下面是判断n是否为质数,所以这里肯定有个判断,不然 ...

  6. Carmichael Numbers (快速幂)

       当今计算机科学的一个重要的领域就是密码学.有些人甚至认为密码学是计算机科学中唯一重要的领域,没有密码学生命都没有意义. 阿尔瓦罗就是这样的一个人,它正在设计一个为西班牙杂烩菜饭加密的步骤.他在加 ...

  7. SpringBoot集成flowable碰见DMN不能初始化

    在idea创建了SpringBoot项目,集成flowable,运行的时候DMN引擎初始化失败,花了一天时间也没解决. 抱着试试的态度重新建立一个项目,加入同样的依赖,成功运行. 但把成功运行的项目配 ...

  8. ET框架之自写模块SmartTimerModule

    1.代码结构图 2.SmartTimer 模块Entity: using System; namespace ETModel { [ObjectSystem] public class SmartTi ...

  9. HihoCoder 1174

    虽然没有西加加的语言来检验,我却写了西加加的…… 就是stl使用不太熟练 勉勉强强强行c++写的 就当练手 #include <iostream>#include <vector&g ...

  10. 在Linux系统上安装Git

    Git是目前流行的非常好用的版本控制工具,这里介绍两种安装方式,1.yum安装,2.从github上下载最新的源码编译后安装 一.yum安装 1.在Linux上是有yum安装Git,非常简单,只需要一 ...