您也可以使用ResultSetExtractor而不是RowMapper。两者彼此一样简单,唯一的区别是您致电ResultSet.next()。
public String test() {
    String sql = "select ID_NMB_SRZ from codb_owner.TR_LTM_SLS_RTN "
                 + " where id_str_rt = '999' and ID_NMB_SRZ = '60230009999999'";
    return jdbc.query(sql, new ResultSetExtractor<String>() {
        @Override
        public String extractData(ResultSet rs) throws SQLException,
                                                       DataAccessException {
            return rs.next() ? rs.getString("ID_NMB_SRZ") : null;
        }
    });
}
在ResultSetExtractor有额外的好处,你可以处理那里有一排以上所有情况下,或者没有返回的行。
更新:几年后,我有一些技巧要分享。JdbcTemplate与以下示例设计的Java 8 lambda完美配合使用,但是您可以轻松地使用静态类来实现相同功能。
虽然问题是关于简单类型的,但这些示例可作为提取域对象的常见情况的指南。
首先。为了简单起见,我们假设您有一个带有两个属性的account对象Account(Long id, String name)。您可能希望RowMapper为此域对象添加一个。
private static final RowMapper<Account> MAPPER_ACCOUNT =
        (rs, i) -> new Account(rs.getLong("ID"),
                               rs.getString("NAME"));
现在,您可以在方法中直接使用此映射器来映射Account来自查询(jt是JdbcTemplate实例)的域对象。
public List<Account> getAccounts() {
    return jt.query(SELECT_ACCOUNT, MAPPER_ACCOUNT);
}
太好了,但是现在我们想要解决原始问题,并且使用原始解决方案重RowMapper用来为我们执行映射。
public Account getAccount(long id) {
    return jt.query(
            SELECT_ACCOUNT,
            rs -> rs.next() ? MAPPER_ACCOUNT.mapRow(rs, 1) : null,
            id);
}
很好,但这是您可能并且希望重复的模式。因此,您可以创建通用工厂方法来ResultSetExtractor为任务创建新的方法。
public static <T> ResultSetExtractor singletonExtractor(
        RowMapper<? extends T> mapper) {
    return rs -> rs.next() ? mapper.mapRow(rs, 1) : null;
}
创建ResultSetExtractor现在变得微不足道了。
private static final ResultSetExtractor<Account> EXTRACTOR_ACCOUNT =
        singletonExtractor(MAPPER_ACCOUNT);
public Account getAccount(long id) {
    return jt.query(SELECT_ACCOUNT, EXTRACTOR_ACCOUNT, id);
}
我希望这有助于表明您现在可以很轻松地以强大的方式组合部件,以使您的域变得更简单。
更新2:与Optional组合以获得可选值,而不是null。
public static <T> ResultSetExtractor<Optional<T>> singletonOptionalExtractor(
        RowMapper<? extends T> mapper) {
    return rs -> rs.next() ? Optional.of(mapper.mapRow(rs, 1)) : Optional.empty();
}
现在使用时可能具有以下内容:
private static final ResultSetExtractor<Optional<Double>> EXTRACTOR_DISCOUNT =
        singletonOptionalExtractor(MAPPER_DISCOUNT);
public double getDiscount(long accountId) {
    return jt.query(SELECT_DISCOUNT, EXTRACTOR_DISCOUNT, accountId)
            .orElse(0.0);
}
               
              
ResultSet.next()将不必要地被调用。ResultSetExtractor在这种情况下,使用a 是更有效的工具。