तुम भी एक का उपयोग कर सकते 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
जावा 8 लैम्ब्डा के साथ शानदार तरीके से काम करता है, जिसके लिए निम्न उदाहरण तैयार किए गए हैं, लेकिन आप इसे प्राप्त करने के लिए एक स्थिर वर्ग का उपयोग आसानी से कर सकते हैं।
जबकि सवाल सरल प्रकारों के बारे में है, ये उदाहरण डोमेन ऑब्जेक्ट्स को निकालने के सामान्य मामले के लिए एक मार्गदर्शक के रूप में काम करते हैं।
सबसे पहले। मान लीजिए कि आपके पास सादगी के लिए दो गुणों वाली एक खाता वस्तु है 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 : शून्य के बजाय वैकल्पिक मूल्यों के लिए एक वैकल्पिक के साथ गठबंधन ।
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
इस मामले में एक बहुत अधिक कुशल उपकरण का उपयोग करना है ।