【spring jdbc】jdbcTemplate.queryXxx() 返回值为null


今天使用以下方法用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类中少写了一个userIDsetter()方法,改正后,userId显示了,但是userStatus还是null值

百思不得其解,上网找了一下,找到一篇文章,感觉有点道理~

spring jdbctemplate 实体属性映射值为null:https://blog.csdn.net/iteye_14756/article/details/81800913?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_utm_term-4&spm=1001.2101.3001.4242

文中说这段源码转换时出现问题:主要是字段中含有下划线的问题。虽然我的不是,但隐约觉得有点东西!

/**
 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值。
在这里插入图片描述
解决方法总结:

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

猜你喜欢

转载自blog.csdn.net/qq_45797116/article/details/114379307