当前位置: 首页 > 知识库问答 >
问题:

Spring JdbcTemplate的query()方法的这个实现是如何工作的?

曹昊焱
2023-03-14

我正在开发一个使用JdbcTemboard查询数据库的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()方法的这个实现包含两个对象:查询字符串和行映射器对象,并且:

使用准备好的语句进行查询,通过行映射器将每一行映射到Java对象

因此,我认为通过QUERY()方法实现,查询字符串会自动转换为preparedstation(这是正确的还是我遗漏了什么?)

我完全不清楚的是,在前面的示例中,我将行映射器定义为查询方法的第二个参数。

因此,这个特定的实现包含mapRow(ResultSet ResultSet,int rowNum)方法实现,据我所知,它是为查询执行返回的ResultSet对象的每一行调用的。因此,此方法将自动映射数据库日志上的特定行,该行将自动添加到返回的列表中

是我的推理正确还是我错过了什么?

这些工作都是谁做的?是这个特定的方法实现(接受这两个特定输入参数的方法)负责调用传递的行映射器对象的方法,然后将返回的DBLog对象添加到列表中吗?

共有1个答案

郜昊苍
2023-03-14

你的推理完全正确。

首先,查看文档中的此表。它列出了Spring JDBC自动执行的所有操作以及剩下的操作。基本上,使用Spring JDBC时需要做的就是:

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

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

此对象称为行映射器,因为它将数据库的行映射到域对象中,这些行由结果集对象表示。

这是使用Spring JDBC而不是原始JDBC的主要优势之一:它将所有常见和重复的任务分解到其核心中。是的,它将在引擎盖下使用一个准备好的语句,该语句将被执行,结果集将被循环。在这个循环的每次迭代中(由Spring JDBC完成),都会调用您的行映射器。Spring JDBC将其结果聚合到一个列表中,并最终返回。

 类似资料:
  • 这是来自SQLZOO.NET的问题

  • 我试图了解mysql查询在GROUP BY和不使用GROUP BY的情况下是如何工作的。 假设我有一个FILM_ACTORS表,其中每个ACTOR_ID都有一个相应的film_id。于是同一个演员参演了N部不同的电影。 我想选出参与20部电影的演员: 这个查询起作用,并返回参与20部电影的actor_id。但如果我只是: 为什么该查询仅在我将其等于film_actor表(5463)的大小时才返回值

  • Kotlin定义了自己的类: 该类的实例是通过中定义的内联函数构造的: null 我认为在编译之前必须进行某种代码预处理。 请随意用一个更贴切的标题编辑这个问题。

  • 我正在阅读《实用恶意软件分析》一书,其中出现了以下示例代码: 作者接着说: 返回的COM对象将存储在堆栈中IDA Pro标记为ppv的变量中,如图所示。 我的问题是,这是为什么?既然我们做了一个mov eax,[esp 24h ppv],这难道不是将[esp 24h ppv]内部的数据移动到eax并覆盖返回值,而不是将返回值存储在变量中吗?我认为在Intel格式中,mov操作数1、操作数2总是将第

  • 这是一个使用合并排序的程序,从1到1000对1000个数字的列表进行排序。它显示原始列表,然后调用递归方法对其进行排序,然后显示。 代码中我不明白的是这两行: 合并排序(数字,低,中);//在方法中,它会说“这里” 合并排序(数字,中间1,高); 我是java的初学者,这与我所学的一切背道而驰,因为我无法理解如何在方法中调用方法。除非它是一个我怀疑的对象。有人能解释一下这两行代码的作用吗?

  • 我在一本书《做二进制搜索》中看到了这个方法,但无论我怎么尝试,我都无法理解它是如何工作的。有人能确切地向我解释一下它是如何工作的吗? 这本书的解释无助于: 这个想法是在我们靠近目标元素时跳跃并减慢速度。变量k和b包含数组中的位置和跳跃长度。如果数组包含元素x,搜索后x的位置将在变量k中。该算法的时间复杂度为O(log n),这是因为对每个跳转长度而言,同时循环中的代码最多执行两次。 我不明白的是k