gpt4 book ai didi

java - 如何在 Spring JDBC ResultSetExtractor 中检查 ResultSet 是否为空?

转载 作者:行者123 更新时间:2023-12-01 07:51:08 24 4
gpt4 key购买 nike

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

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

那么正确的检查方法是什么ResultSet就这样的空虚?

最佳答案

对于接口(interface)的角色似乎有些困惑,我看到一些教程做错了。接口(interface)RowMapperRowCallbackHandler分别负责提供值(value)。每行都会产生副作用。

因此,他们不负责调用next()因为框架将负责前进到下一行而不是调用回调,一次 next()返回false即使前进到第一行也可能发生这种情况,在这种情况下 ResultSet是空的。在后一种情况下, query(… RowMapper<T>) 将返回一个空 List不调用RowMapper query(… RowCallbackHandler) 只会什么都不做。

相比之下, ResultSetExtractor 负责处理整个 ResultSet ,其中包括调用 next()适本地。所以你的问题的前提(“......每次调用 extractData 都会给我新的行。”)是错误的。所有 JDBC 操作的标准行为是返回 ResultSet在第一行之前,因此第一个 next()调用会将当前行指针移动到第一行或返回 false如果ResultSet是空的。因此,如果您最多期望一行,那么您的查询应该类似于

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

编辑:此解决方案经过测试并在标准 MySQL 上正常工作。和Postgresql实例/Andremoniy/.

EDIT-2:这个解决方案绝对正确,并且在任何地方都可以正常工作。但应该注意JdbcTemplate中有两种不同的方法。类:

  1. public <T> T query(String sql, PreparedStatementSetter pss, ResultSetExtractor<T> rse) - 本例中使用它并返回 0对于 rs.getRows()确实,总是如此。提供的解决方案对于这种情况是正确的。

  2. public void query(String sql, PreparedStatementSetter pss, RowCallbackHandler rch)它有另一种类型的第三个参数,以及类似的代码:

    jdbcTemplate.query(sql, ps -> {
    ps.setLong(1, fooParam1);
    ps.setLong(2, fooParam2);
    }, rs -> {
    System.out.println(rs.getRow());
    });

工作方式不同: rs.getRow()将返回处理行数,如果不存在行,则 processRow方法将永远不会被调用(第二种方法让我感到困惑)。/Andremoniy/

关于java - 如何在 Spring JDBC ResultSetExtractor 中检查 ResultSet 是否为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37436900/

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