mybatis会自动把字段名中的下划线转为驼峰命名法?
![](http://image.highersoft.net/underscore_camel.jpg?imageView2/2/w/800)
![](http://image.highersoft.net/converTcamel.jpg?imageView2/2/w/800)
![](http://image.highersoft.net/getCamelPropertName.jpg?imageView2/2/w/800)
![](http://image.highersoft.net/getPropertyName.jpg?imageView2/2/w/800)
![](http://image.highersoft.net/converTcamel.jpg?imageView2/2/w/800)
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设置下就可以了,这里就不说了,下面说下是怎么实现的
如果我们设置了,useCamelCaseMapping=ture,那么mybatis就把_给干掉了,看到这里我也很疑惑,还以为是坑爹呢,
我们接着往下看,buildProperty
其实是从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设置下就可以了,这里就不说了,下面说下是怎么实现的
如果我们设置了,useCamelCaseMapping=ture,那么mybatis就把_给干掉了,看到这里我也很疑惑,还以为是坑爹呢,
我们接着往下看,buildProperty
其实是从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异常:nested exception is org.apache.ibatis.builder.BuilderException
- MyBatis Generator为一张表自动生成了两个实体类
- mybatis+Oracle 批量插入数据,有数据做更新操作
- Mybatis的类型转换
- mybatis 引入java 常量
- MyBatis自动生成工具去掉注释的配置
- Mybatis新增save结束后自动返回主键id
- MyBatis自动获取主键,MyBatis使用Oracle返回主键,Oracle获取主键
- mybatis插件 mybatis插件-------从dao快速定位到mapper的sql语句
- 解决idea创建ssm项目找不到mybatis的mapper的xml文件问题
- idea集成 MyBatis Generator 插件,自动生成dao,model,sql map文件
- mybatis逆向工程生成mapper报错
- MyBatis Generator使用教程(代码自动生成器)
- Mybatis之执行insert、update和delete操作时自动提交
- mybatis之DAO层自动实现接口
- IDEA mybatis-generator 逆向工程
- SSM框架——使用MyBatis Generator自动创建代码
- Mybatis自动生成Xml文件,针对字段类型为text等会默认产生XXXXWithBlobs的方法问题
- Mybatis关联查询之一对多和多对一XML配置详解
- 【Redis】SpringBoot+MyBatis集成Redis二级缓存
- Java中核心注解的作用及其使用,了解Spring容器装载的过程和机制,自定义注解来实现自动配置项目依赖环境,包括mybatis、Dubbo、log4j、RabbitMQ、redis相关等自动配置
- 基于自动配置jar包和SpringBoot以及注解一分钟快速搭建企业项目开发环境,主要包含DataBase、mybatis、Dubbo、log4j、RabbitMQ、redis及相关客户端配置等等
- MyBatis之代理开发模式
- MyBatis-Plus SpringBlade 生成代码时 啥内容都没有 只有目录