春まであと数日。Spring-JDBC を Web アプリケーションに統合します。DB で CRUD 操作を正常に実行でき、ボイラープレート コードの削減に感銘を受けました。しかし、query*()
で提供されているメソッドを使用できませんNamedParameterJDBCTemplate
。RowMapper
インターネット上のほとんどの例では、またはの使用法が示されていますResultSetExtractor
。どちらの使用法も問題ありませんが、これらのインターフェイスを実装する必要があるクラスを作成する必要があります。DBにロードするすべてのタイプのデータに対してBeanを作成する必要があります(または、間違っている可能性があります)。
次のようなものを使用したコードセクションで問題が発生します。
String query="select username, password from usertable where username=?"
ps=conn.prepareStatement(query);
ps.setString(username);
rs=ps.executeQuery();
if(rs.next()){
String username=rs.getString("username");
String password=rs.getString("password")
//Performs operation on them
}
これらの値はどの Bean にも保存されず、直接使用されるため、このような状況で jdbcTemplate を統合することはできません。Bean に存在するプロパティの一部のみをデータベースから抽出しているときに、別の状況が発生します。例:
public class MangaBean{
private String author;
private String title;
private String isbn;
private String releaseDate;
private String rating;
//getters and setters
}
マッパー:
public class MangaBeanMapper implements RowMapper<MangaBean>{
@Override
public MangaBean mapRow(ResultSet rs, int arg1) throws SQLException {
MangaBean mb=new MangaBean();
mb.setAuthor(rs.getString("author"));
mb.setTitle(rs.getString("title"));
mb.setIsbn(rs.getString("isbn"));
mb.setReleaseDate(rs.getString("releaseDate"));
mb.setRating(rs.getString("rating"));
return mb;
}
}
上記の配置は、次のようにうまく動作します。
String query="select * from manga_data where isbn=:isbn"
Map<String, String> paramMap=new HashMap<String, String>();
paramMap.put("isbn", someBean.getIsbn());
return template.query(query, paramMap, new MangaBeanMapper());
ただし、データベースから 2 つまたは 3 つの値のみを取得したい場合、上記のパターンはBadSqlGrammarException: releaseDate does not exist in ResultSet
. 例 :
String query="select title, author where isbn=:isbn"
Map<String, String> paramMap=new HashMap<String, String>();
paramMap.put("isbn", someBean.getIsbn());
return template.query(query, paramMap, new MangaBeanMapper());
テンプレートは のインスタンスですNamedParameterJDBCTemplate
。これらの状況の解決策を教えてください。