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

时间:2015-11-29 20:04:41

标签: java spring spring-mvc spring-jdbc jdbctemplate

我正在使用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}}对象到列表?

1 个答案:

答案 0 :(得分:1)

你的推理完全正确。

首先,看看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,最后返回。