mybatis会自动把字段名中的下划线转为驼峰命名法?
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
之前用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
之前用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会自动把字段名中的下划线转为驼峰命名法?的更多相关文章
- js中字符串下划线转为驼峰
function camelCase(string){ // Support: IE9-11+ return string.replace( /-([a-z])/g, function( all, l ...
- 解决ASP.NET MVC返回的JsonResult 中 日期类型数据格式问题,和返回的属性名称转为“驼峰命名法”和循环引用问题
DateTime类型数据格式问题 问题 在使用ASP.NET MVC 在写项目的时候发现,返回给前端的JSON数据,日期类型是 Date(121454578784541) 的格式,需要前端来转换一下才 ...
- MyBatis Generator 下划线转驼峰命名
MyBatis Generator配置文件--指定生成实体类使用实际的表列名作为实体类的属性名 table标签下的设置属性useActualColumnNames用于指定生成实体类时是否使用实际的列名 ...
- Python3中关于下划线变量和命名的总结
变量 #!-*-coding:utf-8-*- #__author__ = 'ecaoyng' # # 变量 #_xxx,单下划线开头的变量,标明是一个受保护(protected)的变量,原则上不允许 ...
- mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)字符串拼接cancat实战例子
mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)mysql字符串拼接cancat实战例子: mysql update set 多个字段相加,如果是数字相加可以直接用+号(注:hund ...
- ABAP开发环境终于支持以驼峰命名法自动格式化ABAP变量名了
Jerry进入SAP成都研究院前,一直是用C/C++开发,所以刚接触ABAP,对于她在某些语法环境下大小写敏感,某些环境下不敏感的特性很不适应.那时候Jerry深深地怀念之前在C/C++编程时遵循的驼 ...
- C语言中变量名及函数名的命名规则与驼峰命名法
一.C语言变量名的命名规则:(可以字母,数字,下划线混合使用) 1. 只能以字母或下划线开始:2. 不能以数字开始:3. 一般小写:4. 关键字不允许用(eg:int float=2//error ...
- mybatis 下划线转驼峰配置
一直以来,在sqlmap文件中,对于数据库中的下划线字段转驼峰,我们都是通过resultmap来做的,如下: <resultMap id="ISTableStatistics" ...
- Mybatis 结果映射下划线转驼峰
mybatis 结果映射下划线转驼峰 Spring Boot 配置: #下划线转驼峰 mybatis.configuration.map-underscore-to-camel-case=true m ...
随机推荐
- nginx 部署php项目 404
服务器重启了一下 然后访问程序报错404的情况 文件存在位置没有问题 niginx配置根目录没有问题 最后检查到端口的时候发现php-fpm的9000端口未打开 service php-fpm res ...
- C++中的参数类型
C++中的参数类型 数组 数组是相同类型数据的集合.引入数组就不需要在程序中定义大量的变量,大大减少程序中变量的数量,使程序精炼,而且数组含义清楚,使用方便,明确地反映了数据间的联系.许多好的算法都与 ...
- Docker最全教程——从理论到实战(十二)
前言 Ubuntu是一个以桌面应用为主的开源GNU/Linux操作系统,应用很广.本篇主要讲述Ubuntu下使用SSH远程登录并安装Docker,并且提供了Docker安装的两种方式,希望对大家有所帮 ...
- [MongoDB] 使用PHP在MongoDB中搜索的实现
条件操作符用于比较两个表达式并从mongoDB集合中获取数据.MongoDB中条件操作符有:(>) 大于 - $gt(<) 小于 - $lt(>=) 大于等于 - $gte(< ...
- Controller-->View传值的几种方法
Controller --- > View 传值的方法 ViewBag ViewData TempData 向普通View页面传一个Model对象 向强类型页面传传一个Model对象 用一个Vi ...
- import 与 from...import
- H5与native 普及
H5与native 普及: H5是基于web,native基于客户端native是使用原生系统内核的,相当于直接在系统上操作.,是我们传统意义上的软件,更加稳定.但是H5的APP先得调用系统的浏览器内 ...
- ubuntu18 + caffe+cpu+anaconda3
本记录只暂时只记录一些错误. 编译错误,opencv3.2与anaconda3下的libtiff不兼容,冲突. 问题查找(查找所有的TIFF库与编译错误提示匹配/usr/lib/x86_64-linu ...
- 利用Cadence PCB SI分析特性阻抗变化因素
1.概要 在进行PCB SI的设计时,理解特性阻抗是非常重要的.这次,我们对特性阻抗进行基础说明之外,还说明Allegro的阻抗计算原理以及各参数和阻抗的关系. 2.什么是特性阻抗? 2.1 传送线路 ...
- 代码反向生成数据库注释更新sql
原理 通过反射实体所在程序集,得到枚举值列表,再通过sql获取数据库表结构,两者拼接成sql. 规范 实体枚举字段最好也加上Description特性,方便多次更新: 代码 实体定义 public p ...