[Spring jdbc] jdbcTemplate.queryXxx()戻り値はnullです


今日、次のメソッドjdbcTemplate.queryXxx()を使用してデータベースからデータをクエリすると、返されたオブジェクトとコレクションの一部がとして表示されnull、非常に困惑しています。null値があるのはなぜですか、そうでないのはなぜですか。また、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值

戸惑いました。オンラインで検索して記事を見つけました。少しリーズナブルな感じです〜

春の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