Ayrıca a ResultSetExtractor
yerine a da kullanabilirsiniz RowMapper
. İkisi de birbiri kadar kolaydır, tek fark sizin aramanızdır 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
Birden fazla satır var bütün davaları veya iade hiçbir satır işleyebileceği yararı vardır.
GÜNCELLEME : Birkaç yıl geçti ve paylaşacak birkaç numaram var. JdbcTemplate
Aşağıdaki örneklerin tasarlandığı java 8 lambdas ile mükemmel çalışır, ancak aynı şeyi elde etmek için statik bir sınıfı kolayca kullanabilirsiniz.
Soru basit türlerle ilgili olsa da, bu örnekler, etki alanı nesnelerini ayıklamanın yaygın durumu için bir kılavuz görevi görür.
İlki. Basit olması için iki özelliğe sahip bir hesap nesneniz olduğunu varsayalım Account(Long id, String name)
. RowMapper
Bu etki alanı nesnesi için büyük olasılıkla bir sahip olmak isteyeceksiniz .
private static final RowMapper<Account> MAPPER_ACCOUNT =
(rs, i) -> new Account(rs.getLong("ID"),
rs.getString("NAME"));
Artık bu eşleştiriciyi Account
, bir sorgudan ( jt
bir JdbcTemplate
örnektir) etki alanı nesnelerini eşlemek için doğrudan bir yöntem içinde kullanabilirsiniz .
public List<Account> getAccounts() {
return jt.query(SELECT_ACCOUNT, MAPPER_ACCOUNT);
}
Harika, ama şimdi asıl sorunumuzu istiyoruz RowMapper
ve haritalamayı bizim için gerçekleştirmek için orijinal çözümümü tekrar kullanarak kullanıyoruz .
public Account getAccount(long id) {
return jt.query(
SELECT_ACCOUNT,
rs -> rs.next() ? MAPPER_ACCOUNT.mapRow(rs, 1) : null,
id);
}
Harika, ama bu tekrarlamak isteyebileceğiniz ve isteyeceğiniz bir kalıptır. Böylece ResultSetExtractor
, görev için yeni bir tane oluşturmak üzere genel bir fabrika yöntemi oluşturabilirsiniz .
public static <T> ResultSetExtractor singletonExtractor(
RowMapper<? extends T> mapper) {
return rs -> rs.next() ? mapper.mapRow(rs, 1) : null;
}
ResultSetExtractor
Şimdi oluşturmak önemsiz hale gelir.
private static final ResultSetExtractor<Account> EXTRACTOR_ACCOUNT =
singletonExtractor(MAPPER_ACCOUNT);
public Account getAccount(long id) {
return jt.query(SELECT_ACCOUNT, EXTRACTOR_ACCOUNT, id);
}
Umarım bu, etki alanınızı daha basit hale getirmek için parçaları güçlü bir şekilde kolayca birleştirebileceğinizi göstermeye yardımcı olur.
GÜNCELLEME 2 : Boş yerine isteğe bağlı değerler için İsteğe Bağlı ile birleştirin .
public static <T> ResultSetExtractor<Optional<T>> singletonOptionalExtractor(
RowMapper<? extends T> mapper) {
return rs -> rs.next() ? Optional.of(mapper.mapRow(rs, 1)) : Optional.empty();
}
Şimdi kullanıldığında aşağıdakilere sahip olabilir:
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()
gereksiz yere çağrılmasıdır.ResultSetExtractor
Bu durumda a kullanmak çok daha verimli bir araçtır.