【发布时间】:2015-11-29 20:04:40
【问题描述】:
我正在开发一个使用 JdbcTemplate 查询数据库的 Spring 应用程序,但我对它的工作原理有些怀疑。
所以,在一个服务类中,我有这个执行查询的方法定义:
//JDBC TEMPLATE SELECT EXAMPLE
public List<DBLog> queryAllLogs() {
System.out.println("JDBCExample: queryAllLogs() is called");
final String QUERY_SQL = "SELECT * FROM LOG ORDER BY IDLOG";
List<DBLog> dbLogList = this.jdbcTemplate.query(QUERY_SQL, new RowMapper<DBLog>() {
public DBLog mapRow(ResultSet resulSet, int rowNum) throws SQLException {
System.out.println("Getting log: "+ rowNum + " content: " + resulSet.getString("LOGSTRING"));
DBLog dbLog = new DBLog();
dbLog.setIDLOG(resulSet.getInt("IDLOG"));
dbLog.setLOGSTRING(resulSet.getString("LOGSTRING"));
return dbLog;
}
});
return dbLogList;
}
此方法只执行一个查询,返回由IDLOG 字段值排序的LOG 表中的所有记录。这很容易理解。
阅读官方文档,我发现query() 方法的这个实现需要两个对象:查询字符串和一个RowMapper 对象:
使用准备好的语句进行查询,将每一行映射到一个 Java 对象 通过 RowMapper
所以我认为QUERY_SQL 查询字符串通过query() 方法实现自动转换为PreparedStatment(是对还是我遗漏了什么?)
对我来说绝对不清楚的是,在我看来,在前面的示例中,我将 RowMapper 实现定义为查询方法的第二个参数。
因此,此特定实现包含mapRow(ResultSet resulSet, int rowNum) 方法实现,据我所知,该方法实现是为查询执行返回的ResultSet 对象的每一行调用的。所以这个方法会自动映射DBLog上的特定行,该行会自动添加到返回的List<DBLog> dbLogList列表中。
这是我的推理正确还是我遗漏了什么?
所有这些工作都是谁做的?是这个特定的query() 方法实现(采用这两个特定输入参数的那个)注意调用传递的RowMapper 对象的mapRow() 方法,然后将返回的DBLog 对象添加到列表中?
【问题讨论】:
标签: java spring spring-mvc spring-jdbc jdbctemplate