你也可以使用一個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
有可以處理那裏有多個行或沒有行返回的所有情況下的額外好處。
UPDATE:幾年後,我有幾個技巧可以分享。 JdbcTemplate
與java 8 lambda類似地工作,下面的例子是爲你設計的,但你可以很容易地使用靜態類來實現。
雖然問題是關於簡單類型,但這些示例可用作提取域對象的常見情況的指導。
首先。假設您有一個賬戶對象,其中包含兩個屬性以簡化操作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 =
nullableExtractor(MAPPER_ACCOUNT);
public Account getAccount(long id) {
return jt.query(SELECT_ACCOUNT, EXTRACTOR_ACCOUNT, id);
}
我希望這有助於證明你現在可以很容易地在一個強大的方式來讓您的站點更簡單的結合部位。
UPDATE 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 =
nullableOptionalExtractor(MAPPER_DISCOUNT);
public double getDiscount(long accountId) {
return jt.query(SELECT_DISCOUNT, EXTRACTOR_DISCOUNT, accountId)
.orElse(0.0);
}
謝謝@Rakesh,這個解決方案工作。更乾淨。 – Byron
如下所述,這裏唯一的缺點是,如果返回類型是一個複雜類型,那麼您將構建多個對象並實例化一個列表,並且'ResultSet.next()'將被不必要地調用。在這種情況下使用'ResultSetExtractor'是一個更加高效的工具。 –
匿名類定義中缺少括號 - 新的RowMapper **()** –