我正在使用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;
}
此方法只执行一个查询,该查询返回LOG
表中由IDLOG
字段值排序的所有记录。这很容易理解。
阅读官方文档,我发现query()
方法的这种实现需要2个对象:查询字符串和RowMapper
对象以及:
使用预准备语句进行查询,将每一行映射到Java对象 通过RowMapper
所以我认为QUERY_SQL
查询字符串会被PreparedStatment
方法实现自动转换为query()
(是正确还是我遗漏了什么?)
对我来说绝对不清楚的是,在我看来,在上一个示例中,我将RowMapper
实现定义为查询方法的第二个参数。
因此,这个特定的实现包含mapRow(ResultSet resulSet, int rowNum)
方法实现,根据我所理解的,为查询执行返回的ResultSet
对象的每一行调用。因此,此方法会自动映射DBLog
上的特定行,该行将自动添加到返回的List<DBLog> dbLogList
列表中。
我的推理是正确还是我错过了什么?
谁做了这一切?是这个特定的query()
方法实现(采用这两个特定输入参数的方法),需要注意调用传递的mapRow()
对象的RowMapper
方法,然后添加返回的{{ 1}}对象到列表?
答案 0 :(得分:1)
你的推理完全正确。
首先,看看this table in the documentation。它列出了Spring JDBC自动执行的所有操作以及您将要执行的操作。基本上,使用Spring JDBC时需要做的就是:
JDBCTemplate.query(String, RowMapper)
遵循相同的模式。首先,给它一个要执行的SQL语句:这是第一个参数(上面列表的第2点)。其次,你给它一个对象,负责将每个结果转换成你的域对象(上面列表的第4点)。
此对象称为RowMapper
,因为它将映射数据库的行(由ResultSet
对象表示)到您的域对象中。
这是使用Spring JDBC而不是原始JDBC的主要优势之一:它将所有常见和重复任务分解为其核心。是的,它将使用引擎盖下的PreparedStatement
,这将被执行并且ResultSet
将被循环。在此循环的每次迭代中(由Spring JDBC生成),将调用RowMapper
。其结果将由Spring JDBC聚合到List
,最后返回。