BeanPropertyRowMapper使用注意事项
2015-11-25 11:22
417 查看
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/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
相关文章推荐
- iOS---性能优化
- 几行代码,让你的 APP 变得花俏—Android Design Support Library 代码实验
- Android开发&Android studio中的jni
- App的4个组件。(2015.11.30)
- 理解Android系统的进程间通信原理(一)----RPC中的代理模式
- 移动开发-UI控件:手机app开发图片资源网址
- Java课程设计笔记-Android系统创建阻塞式对话框
- OS X El Capitan 10.11 Cocoapods报错解决方案
- Android系统性能调优工具介绍
- Android中常见的热门标签的流式布局的实现
- android studio总结
- iOS 优化APP内存
- Android 利用ViewPager实现图片可以左右循环滑动效果附代码下载
- Android 5.0 系统中来电过程中屏幕会休眠的问题
- android studio中直接运行java程序
- Codeforces Round #333 (Div. 2) B. Approximating a Constant Range st 二分
- Android 学习的好文章(以后有好的文章将不断更新链接)
- Android 5.0 Material Design酷炫风格的开源项目集合
- 10 条提升 Android 性能的建议
- js的call和apply的应用说明