の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ラムダでうまく機能しますが、静的クラスを使用して同じことを非常に簡単に行うことができます。
問題は単純な型についてですが、これらの例はドメインオブジェクトを抽出する一般的なケースのガイドとして役立ちます。
最初に。簡単にするために、2つのプロパティを持つアカウントオブジェクトがあるとします。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);
}
これにより、非常に簡単に強力な方法でパーツを組み合わせて、ドメインを単純化できることを示していただければ幸いです。
UPDATE 2:オプションと組み合わせる 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 を使用する方がはるかに効率的なツールです。