今日、次のメソッド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值
。
戸惑いました。オンラインで検索して記事を見つけました。少しリーズナブルな感じです〜
この記事では、このソースコードの変換中に問題が発生したと述べています。主な問題は、フィールドのアンダースコアでした。私はそうではありませんが、ぼんやりと何かを感じます!
/**
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クラスのフィールドは、データベースのテーブルのフィールドに対応していません