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使用注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu 1532(最大流)
- 下一篇: nyoj 82