আপনি এ এর 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 : নাল পরিবর্তে alচ্ছিক মান জন্য একটি ption চ্ছিক সঙ্গে একত্রিত ।
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এই ক্ষেত্রে একটি ব্যবহার করা অনেক বেশি কার্যকর সরঞ্জাম।