【Spring JDBC】jdbcTemplate.queryXxx() 返回值为null
原创
©著作权归作者所有:来自51CTO博客作者阿呆小记的原创作品,请联系作者获取转载授权,否则将追究法律责任
今天使用以下方法用jdbcTemplate.queryXxx()
从数据库中查询数据时,返回的对象、集合中,有部分数据显示为null
,很是疑惑,为什么有的是空值,有的不是,而且为什么会有空值的出现?
// 查询返回用户对象
@Override
public User selectObject(String id) {
// sql 语句
String sql = "select * from t_user where userId=?";
User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), id);
return user;
}
// 查询信息返回集合
@Override
public List<User> findAll() {
// sql语句
String sql = "select * from t_user";
List<User> list = jdbcTemplate.query(sql,new BeanPropertyRowMapper<User>(User.class));
return list;
}
如下图所示为正确的结果,但是一开始的时候圈出的部分均是null值
。
于是返回toString()
的地方查看,发现在User类中少写了一个userID
的setter()方法
,改正后,userId
显示了,但是userStatus
还是null值
。
百思不得其解,上网找了一下,找到一篇文章,感觉有点道理~
spring jdbctemplate 实体属性映射值为null
文中说这段源码转换时出现问题:主要是字段中含有下划线的问题。虽然我的不是,但隐约觉得有点东西!
/**
1. Convert a name in camelCase to an underscored name in lower case.
2. Any upper case letters are converted to lower case with a preceding underscore.
3. @param name the string containing original name
4. @return the converted name
*/
private String underscoreName(String name) {
StringBuffer result = new StringBuffer();
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();
}
之后查了些资料后,发现在做这种类似数据库实体类的映射的时候,实体类的属性名必须和数据库中的字段名一致!于是我将数据库的字段名与User类中的实体类属性名全部换成一致的,最后解决了null值。
解决方法总结:
- bean类中没有setter方法
- bean类中的字段与数据库中表的字段没有对应