如何在Spring JDBC ResultSetExtractor中检查ResultSet的空白?

时间:2016-05-25 12:18:43

标签: java spring jdbc java-8

似乎ResultSet清空的标准检查在Spring的JDBC ResultSetExtractor中不起作用。我按照以下方式使用它:

    return jdbcTemplate.query(sql, ps -> {
        ps.setLong(1, fooParam1);
        ps.setLong(2, fooParam2);
    }, rs -> {
        return rs.getLong(1);
    });

那么在这种模式中检查ResultSet空虚的正确方法是什么?

1 个答案:

答案 0 :(得分:5)

关于接口的角色似乎有些混乱,我看到一些教程做错了。接口RowMapperRowCallbackHandler负责提供值,分别为。每排产生副作用。

因此,他们不负责调用next(),因为一旦next()返回false,框架将继续前进到下一行并且不会调用回调ResultSet当前进到第一行时,List为空。在后一种情况下,query(… RowMapper<T>)将返回空RowMapper而不调用ResultSetquery(… RowCallbackHandler)将无效。

相反,ResultSetExtractor负责处理整个 next(),其中包括适当地调用extractData。所以你的问题是前提(“...... ResultSet的每次调用给了我新的一行。”)是错误的。所有JDBC操作的标准行为是在第一行之前返回next(),以便第一个false调用将当前行指针移动到第一行或返回ResultSet return jdbcTemplate.query(sql, ps -> { ps.setLong(1, fooParam1); ps.setLong(2, fooParam2); }, rs -> rs.next()? rs.getLong(1): null); 为空。因此,如果您最多想要一行,那么您的查询应该看起来像

MySQL

编辑:此解决方案经过测试,可在标准PostgresqlJdbcTemplate实例/ Andremoniy /上正常运行。

EDIT-2:此解决方案绝对正确且可在任何地方正常运行。但应该注意 public <T> T query(String sql, PreparedStatementSetter pss, ResultSetExtractor<T> rse)类中有两种不同的方法:

  1. 0 - 在此示例中使用它,确实总是为rs.getRows()返回public void query(String sql, PreparedStatementSetter pss, RowCallbackHandler rch)。提供的解决方案对于这种情况是正确的。

  2. jdbcTemplate.query(sql, ps -> { ps.setLong(1, fooParam1); ps.setLong(2, fooParam2); }, rs -> { System.out.println(rs.getRow()); });,它有另一种类型的第三个参数,类似代码:

    rs.getRow()

  3. 将以不同的方式工作:processRow将返回处理行的数量,如果不存在行,则永远不会调用{{1}}方法(第二种方法导致我的混淆)。 / Andremoniy /