BeanPropertyRowMapper使用注意事项
query过程都可以进行数据类型自动转换,而且不仅仅按标准命名,还可以支持下划线分隔后拼接成驼峰式字符
完全轻量级.
BeanPropertyRowMapper/ParameterizedBeanPropertyRowMapper ,如果PO和数据库模型的字段完全对应(字段名字一样或者驼峰式与下划线式对应),如果使用JdbcTemplate则可以使用这个RowMapper作为PO和数据库的映射
Spring 2.5 提供了一个便利的RowMapper实现-----BeanPropertyRowMapper
它可自动将一行数据映射到指定类的实例中 它首先将这个类实例化,然后通过名称匹配的方式,映射到属性中去。
例如:属性名称(vehicleNo)匹配到同名列或带下划线的同名列(VEHICLE_NO)。
如果某个属性不匹配则返回属性值为Null;
//用BeanPropertyRowMapper自动匹配
new BeanPropertyRowMapper(User.class)
SpringJDBC BeanPropertyRowMapper 查询的时候 一般的数据库字段都可以正常映射到 bean!
字段 bean属性
USER_NAME --> userName
USER_ID --> userId
但是碰到一些特殊的(暂不考虑命名是否合理)这就映射不上了!
比如:
ORDER_NUM2 --> OrderNum2 (should be orderNum2)
ORDER_NUM_3 OrderNum3
spring 提供框架的同时还提供了一种规范,包括命名规范,自动转换就会要求你javabean的成员变量命名符合规则,这个确实不太好搞,匹配不成功就变成null。
BeanPropertyRowMapper是根据字段名和实体类中的标准Setter方法进行映射滴。也就是说,我们需要使表中的字段名和实体类的成员变量名称一致。
大概看了下源码,ORDER_NUM2 --> OrderNum2 ORDER_NUM_3--> OrderNum3映射是有问题的。
protected void initialize(Class<T> mappedClass) {
this.mappedClass = mappedClass;
this.mappedFields = new HashMap<String, PropertyDescriptor>();
this.mappedProperties = new HashSet<String>();
PropertyDescriptor[] pds = BeanUtils.getPropertyDescriptors(mappedClass);
for (PropertyDescriptor pd : pds) {
if (pd.getWriteMethod() != null) {
this.mappedFields.put(pd.getName().toLowerCase(), pd);
String underscoredName = underscoreName(pd.getName());
if (!pd.getName().toLowerCase().equals(underscoredName)) {
this.mappedFields.put(underscoredName, pd);
}
this.mappedProperties.add(pd.getName());
}
}
}
/**
* Convert a name in camelCase to an underscored name in lower case.
* Any upper case letters are converted to lower case with a preceding underscore.
* @param name the string containing original name
* @return the converted name
*/
private String underscoreName(String name) {
StringBuilder result = new StringBuilder();
if (name != null && name.length() > 0) {
result.append(name.substring(0, 1).toLowerCase());
for (int i = 1; i < name.length(); i++) {
String s = name.substring(i, i + 1);
if (s.equals(s.toUpperCase())) {
result.append("_");
result.append(s.toLowerCase());
}
else {
result.append(s);
}
}
}
return result.toString();
}
着重看下underscoreName()方法,映射的字段只能映射到camel的javabean属性,所以你的映射是不是应该这样子的:ORDER_NUM2->orderNum2
BeanPropertyRowMapper使用注意事项相关推荐
- C++ OP相关注意事项
C++ OP相关注意事项 Paddle中Op的构建逻辑 1.Paddle中Op的构建逻辑 Paddle中所有的Op都继承自OperatorBase,且所有的Op都是无状态的,每个Op包含的成员变量只有 ...
- Hashing散列注意事项
Hashing散列注意事项 Numba支持内置功能hash(),只需__hash__()在提供的参数上调用成员函数即可 .这使得添加对新类型的哈希支持变得微不足道,这是因为扩展APIoverload_ ...
- android 读取asset下的文件注意事项
注意事项:file:后面是三个斜杠,后面是android_asset,在后面就是html的名字.
- Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)
Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项 参考:https://blog.csdn.net/weixin_40475396/article/detail ...
- 【整理】NSTimer使用及注意事项
一.NSTimer的创建 // 创建一个定时器,但是么有添加到运行循环,我们需要在创建定时器后手动的调用 NSRunLoop 对象的 addTimer:forMode: 方法. + (NSTimer ...
- WIN7源码安装Apache和PHP注意事项
安装注意事项. 你注意下下载PHP,Apache的网站,上面有提示要安装Visual C++库的. Apache2.4.4需要VC10库支持,Microsoft Visual C++ 2010 SP1 ...
- html语言书写注意事项,CSS命名规范参考及书写注意事项
CSS书写顺序 *{ /*显示属性*/ display position float clear cursor - /*盒模型*/ margin padding width height /*排版*/ ...
- 安川g7接线端子图_西门子SIWAREX称重模块安装接线注意事项!
与称重变送器和称重仪表不同,SIWAREX系列称重模块可以直接接收称重传感器输出的mV信号,并与西门子控制系统(包括S7 200/300/1200/ET200M/ ET200S)无缝集成,具有扩展灵活 ...
- 前端 重构时需要注意的事项_驾驶式扫地车的功能特点和使用时需要注意事项...
扫地车 随着经济的发展,人们的生活水平不断提高,对生活环境的要求也越来越高,于是许多工厂.物业.超市.社区.市政单位等开始购买扫地车来进行路面清洁.一是清洗效果好,二是效率高,可以节省人工成本.扫地车 ...
最新文章
- 如何统计各个班级的相关数据(如班级排名、最高分等)呢?
- python企业微信回调_python 微信企业号-回调模式接收微信端客户端发送消息并被动返回消息...
- 隐私计算--联邦学习
- [开源]基于姿态估计的运动计数APP开发(三)
- leetcode16 3-Sum
- 更换S60第三版程序图标
- [转]vs2003,安装程序检测到另一个程序要求计算机重新启动
- javascript 之牛人感悟,必看学习
- 优化模型:钢管订购及运输优化模型
- 得力人脸识别考勤机密码设置_人脸指纹混合识别考勤机得力怎么使用
- Java项目:文具学习用品商城系统(java+SSM+JSP+jQuery+Mysql)
- UVC之MJPEG流
- Adobe Audition 2022 v22.2 U2B macOS 专业的音频工作站
- 小学生计算机校本课程教材,二年级校本课程教材
- 黑发奶奶曾世鑫的养生经
- 机器学习之Matplotlib
- CVPR 2019 ViLBERT: Pretraining Task-Agnostic Visiolinguistic Representations for Vision-and-Language
- java 内存压缩_JVM之指针压缩内存如何设置
- C语言利用uthash.h实现hashmap
- 微信图片怎么添加竖排文字_如何给微信里的图片添加上文字和日期?