【发布时间】:2012-12-20 13:31:46
【问题描述】:
离春天还有几天。将 Spring-JDBC 集成到我的 Web 应用程序中。我成功地在我的数据库上执行了 CRUD 操作,对样板代码减少印象深刻。但是我没有使用NamedParameterJDBCTemplate 中提供的query*() 方法。互联网上的大多数示例都提供了RowMapper 或ResultSetExtractor 的用法。虽然这两种用途都很好,但它迫使我创建必须实现这些接口的类。我必须为我为数据库加载的每种类型的数据创建 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());
但是,如果我只想从我的数据库中检索两个/三个值,我不能使用上述模式,因为它会生成一个 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 的一个实例。请为我提供这些情况的解决方案。
【问题讨论】:
标签: java spring spring-jdbc