今天使用以下方法用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值

【Spring JDBC】jdbcTemplate.queryXxx() 返回值为null_spring jdbc


于是返回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值。

【Spring JDBC】jdbcTemplate.queryXxx() 返回值为null_数据库_02


解决方法总结:

  1. bean类中没有setter方法
  2. bean类中的字段与数据库中表的字段没有对应