gpt4 book ai didi

java - Spring JdbcTemplate 的 query() 方法的实现到底是如何工作的?

转载 作者:行者123 更新时间:2023-11-30 07:45:38 25 4
gpt4 key购买 nike

我正在开发一个使用 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对象并且:

Query using a prepared statement, mapping each row to a Java object via a RowMapper

所以我认为QUERY_SQL查询字符串会自动转换为 PreparedStatment通过query()方法实现(这是正确的还是我遗漏了什么?)

对我来说绝对不清楚的是,在我看来,在前面的示例中,我定义了 RowMapper实现作为查询方法的第二个参数。

所以这个特定的实现包含 mapRow(ResultSet resulSet, int rowNum)据我所知,为 ResultSet 的每一行调用该方法实现查询执行返回的对象。所以这个方法会自动映射DBLog上的特定行。它将自动添加到返回的 List<DBLog> dbLogList 中列表。

我的推理正确还是我遗漏了什么?

所有这些工作是谁做的?是这个具体的query()注意调用 mapRow() 的方法实现(采用这 2 个特定输入参数的方法)通过的方法RowMapper对象,然后添加返回的 DBLog反对该名单?

最佳答案

你的推理完全正确。

首先,看一下this table in the documentation 。它列出了 Spring JDBC 自动执行的所有操作以及您需要执行的操作。基本上,使用 Spring JDBC 时您需要做的就是:

  • 设置 JDBC 连接
  • 指定要执行的SQL语句
  • 如果有参数,请提供参数值
  • 对于每个结果,将结果转换为对象

JDBCTemplate.query(String, RowMapper)遵循相同的模式。首先,给它一个要执行的 SQL 语句:这是第一个参数(上面列表中的第 2 点)。其次,您给它一个对象,该对象将负责将每个结果转换为您的域对象(上面列表的第 4 点)。

此对象称为 RowMapper,因为它将由 ResultSet 对象表示的数据库行映射到域对象中。

这是使用 Spring JDBC 相对于原始 JDBC 的主要优势之一:它将所有常见和重复的任务分解到其核心中。是的,它将在底层使用一个 PreparedStatement,它将被执行并且 ResultSet 将被循环。在此循环的每次迭代中(由 Spring JDBC 进行),您的 RowMapper 将被调用。其结果将被 Spring JDBC 聚合成List并最终返回。

关于java - Spring JdbcTemplate 的 query() 方法的实现到底是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33987429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com