दिलचस्प पोस्ट
डेल्फी अनुप्रयोग में उपयोग करने के लिए कौन से एम्बेडेड डेटाबेस? रेल: आश्रित =>: वीएस नष्ट करें: आश्रित =>: delete_all टास्क के बीच अंतर क्या है। स्टार्ट / रुच और एसिंक / इंतजार? सीएसएस छवि आकार, कैसे भरने के लिए, खिंचाव नहीं? मैं HttpServletReponses आउटपुट स्ट्रीम कैसे पढ़ सकता हूं? स्वाइप बाएं जबकि UITableViewCell में कस्टम संपादन दृश्य। उद्देश्य-सी या स्विफ्ट एंड्रॉइड एमुलेटर स्टोर SQLite डेटाबेस कहाँ है? एंड्रॉइड त्रुटि: डिवाइस पर * .apk इंस्टॉल करने में विफल *: समयबाह्य आईफोन: एनीमेशन के साथ टैब कैसे स्विच करें? आईई 6 पीएनजी पारदर्शिता PostgreSQL में कई-से-कई रिश्तों को कैसे कार्यान्वित करें? onClick मोबाइल (टच) पर काम नहीं कर रहा है एचटीएमएल कैनवास पर एक गोल आयत कैसे खींचना है? क्यों Path.Combine फ़ाइल नामों को ठीक से जोड़ता है जो पथ के साथ शुरू होता है। डायरेक्ट्री सेपरेटर चियर? पायथन में किसी फ़ोल्डर की सामग्री को कैसे हटाएं?

इन खंडों को पैरामीटर करने के लिए जेडीबीसी का उपयोग करने का सबसे अच्छा तरीका क्या है?

कहो कि मेरे पास प्रपत्र का एक प्रश्न है

SELECT * FROM MYTABLE WHERE MYCOL in (?) 

और मैं इसमें तर्कों को पैरामीराइज करना चाहता हूं।

जावा में जेडीबीसी के साथ ऐसा करने का एक सीधा तरीका है, एक तरह से जो एसक्यूएल खुद को संशोधित किए बिना कई डेटाबेस पर काम कर सकता है?

निकटतम प्रश्न मैंने पाया है सी # के साथ क्या करना था , मैं सोच रहा हूँ कि जावा / जेडीबीसी के लिए कुछ अलग है

वेब के समाधान से एकत्रित समाधान "इन खंडों को पैरामीटर करने के लिए जेडीबीसी का उपयोग करने का सबसे अच्छा तरीका क्या है?"

वास्तव में जेडीबीसी में ऐसा करने का कोई सीधा तरीका नहीं है कुछ जेडीबीसी ड्राइवरों को PreparedStatement#setArray() में IN PreparedStatement#setArray() का समर्थन लगता है। मुझे केवल यकीन नहीं है कि कौन सी चीजें हैं।

आप सिर्फ String#join() और Collections#nCopies() साथ एक सहायक पद्धति का उपयोग कर सकते हैं जिसमें IN क्लॉज के लिए प्लेसहोल्डर और तैयार किए गए अन्य मानों को तैयार किए गए सभी मानों को सेट किए गए लूप में PreparedStatement#setObject() किए गए सेट के साथ सेट करें PreparedStatement#setObject()

 public static String preparePlaceHolders(int length) { return String.join(",", Collections.nCopies(length, "?")); } public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException { for (int i = 0; i < values.length; i++) { preparedStatement.setObject(i + 1, values[i]); } } 

यहां बताया गया है कि आप इसका उपयोग कैसे कर सकते हैं:

 private static final String SQL_FIND = "SELECT id, name, value FROM entity WHERE id IN (%s)"; public List<Entity> find(Set<Long> ids) throws SQLException { List<Entity> entities = new ArrayList<Entity>(); String sql = String.format(SQL_FIND, preparePlaceHolders(ids.size())); try ( Connection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement(sql); ) { setValues(statement, ids.toArray()); try (ResultSet resultSet = statement.executeQuery()) { while (resultSet.next()) { entities.add(map(resultSet)); } } } return entities; } private static Entity map(ResultSet resultSet) throws SQLException { Enitity entity = new Entity(); entity.setId(resultSet.getLong("id")); entity.setName(resultSet.getString("name")); entity.setValue(resultSet.getInt("value")); return entity; } 

ध्यान दें कि कुछ डेटाबेस में इन खंडों में मूल्यों के स्वीकार्य मात्रा की सीमा है। उदाहरण के लिए ओरेकल की 1000 आइटम पर यह सीमा है।

चूंकि किसी बड़े इन खंड (100 से अधिक) के मामले में कोई जवाब नहीं देता है, इसलिए मैं इस समस्या का समाधान करूँगा जो जेडीबीसी के लिए अच्छी तरह काम करता है। संक्षेप में मैं इन को एक टीएनपी टेबल पर INNER JOIN साथ INNER JOIN हूं।

मैं क्या करता हूं जो मैं एक बैच आईडी तालिका बनाता हूं और आरडीबीएमएस के आधार पर यह एक टीएमपी टेबल या मेमोरी टेबल में बना सकता हूं।

तालिका में दो स्तंभ हैं। आईएन क्लॉज से आईडी के साथ एक कॉलम और एक बैच आईडी वाला दूसरा कॉलम जिसे मैं उड़ने पर उत्पन्न करता हूं।

 SELECT * FROM MYTABLE M INNER JOIN IDTABLE T ON T.MYCOL = M.MYCOL WHERE T.BATCH = ? 

चयन करने से पहले आप अपने आईड्स को किसी दिए गए बैच आईडी के साथ तालिका में दबाएं। फिर आप केवल अपनी मूल क्वेरी में अपनी आईडी तालिका से INER JOIN मिलान वाले खंड में प्रतिस्थापित करते हैं WHERE बैच_आईडी आपके वर्तमान बैच के बराबर है। आपके बैच के लिए प्रविष्टियों को हटाने के बाद

ऐसा करने का मानक तरीका है (यदि आप स्प्रिंग जेडीबीसी का प्रयोग कर रहे हैं तो) org.springframework.jdbc.core.nameparam.NamedParameterJdbcTemplate वर्ग का उपयोग करना है।

इस वर्ग का उपयोग करना, आपके एसक्यूएल पैरामीटर के रूप में एक सूची को परिभाषित करना और नामांकित पैरामीटर को बदलने के लिए NamedParameterJdbcTemplate का उपयोग करना संभव है। उदाहरण के लिए:

 public List<MyObject> getDatabaseObjects(List<String> params) { NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); String sql = "select * from my_table where my_col in (:params)"; List<MyObject> result = jdbcTemplate.query(sql, Collections.singletonMap("params", params), myRowMapper); return result; } 

मैं इस के साथ एसक्यूएल स्ट्रिंग का निर्माण करके हल किया ? जैसा कि मेरे पास देखने के लिए मान हैं

 SELECT * FROM MYTABLE WHERE MYCOL in (?,?,?,?) 

पहले मैंने एक सरणी प्रकार के लिए खोज की, जो मैं बयान में पारित कर सकता हूं, लेकिन सभी जेडीबीसी सरणी प्रकार विक्रेता विशिष्ट हैं। तो मैं कई के साथ रहे ?

मुझे docs.spring (19.7.3) से उत्तर मिला।

एसक्यूएल मानक एक अभिव्यक्ति के आधार पर पंक्तियों का चयन करने की अनुमति देता है जिसमें मूल्यों की एक चर सूची शामिल है। एक ठेठ उदाहरण T_ACTOR से * चुनें, जहां आईडी (1, 2, 3) होगा। यह चर सूची जेडीबीसी मानक द्वारा तैयार किए गए बयान के लिए सीधे समर्थित नहीं है; आप प्लेसहोल्डर्स की एक चर संख्या घोषित नहीं कर सकते। तैयार किए गए प्लेसहोल्डर्स की वांछित संख्या के साथ आपको कई भिन्नताएं की आवश्यकता होती है, या आपको एक बार पता चल जाएगा कि कितने प्लेसहोल्डर्स की आवश्यकता होती है, इसलिए आपको एसक्यूएल स्ट्रिंग उत्पन्न करना आवश्यक है। NamedParameterJdbcTemplate और JdbcTemplate में प्रदत्त नामित पैरामीटर समर्थन बाद के दृष्टिकोण को लेता है। मूल्यों को एक जावा के रूप में दर्ज करें। आदिम। आदिम वस्तुओं की सूची यह सूची कथन निष्पादन के दौरान आवश्यक प्लेसहोल्डर को सम्मिलित करने के लिए और मूल्यों में पास करने के लिए उपयोग की जाएगी।

आशा है इससे आपको सहायता मिलेगी।

एएएफएआईके, पैरामीटर के रूप में संग्रह को संभालने के लिए जेडीबीसी में कोई मानक समर्थन नहीं है। यह बहुत अच्छा होगा यदि आप एक सूची में बस पास कर सकते हैं और इसका विस्तार किया जाएगा।

स्प्रिंग की जेडीबीसी एक्सेस पैरामीटर्स के रूप में संग्रह को पारित करने का समर्थन करती है। आप यह कैसे सुरक्षित रूप से इस कोडिंग पर प्रेरणा के लिए किया जाता है पर गौर कर सकते हैं

जेडीबीसी पैरामीटर के रूप में स्वत: विस्तार करने वाले संग्रह देखें

(लेख पहले सीतनिद्रा में होना चर्चा करता है, फिर JDBC पर चर्चा करता है।)

मेरा परीक्षण देखें और यह सफलता, यह कहा जाता है कि सूची आकार की संभावित सीमा है सूची l = arrays.asList (नया पूर्णांक [] (12496,12497,12498,1249 9}); मानचित्र परम = संग्रह। सिंग्लिटनमैप ("माल", एल);

  NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(getJdbcTemplate().getDataSource()); String sql = "SELECT bg.goodsid FROM beiker_goods bg WHERE bg.goodsid in(:goodsid)"; List<Long> list = namedParameterJdbcTemplate.queryForList(sql, param2, Long.class); 

अलग-अलग वैकल्पिक दृष्टिकोण हैं जो हम उपयोग कर सकते हैं।

  1. एकल प्रश्न निष्पादित करें – धीमा और अनुशंसित नहीं
  2. संग्रहित प्रक्रिया का उपयोग करना – डेटाबेस विशिष्ट
  3. तैयार की गई स्थिरता प्रश्न को गतिशील रूप से बनाना – कैशिंग के अच्छे प्रदर्शन और ढीले फायदे और पुन: संचय की आवश्यकताएं
  4. तैयार किए गए स्थान की क्वेरी में नल का उपयोग करना – मुझे लगता है कि इष्टतम प्रदर्शन के साथ यह एक अच्छा तरीका है

यहां इनके बारे में अधिक विवरण देखें

सोर्मुला यह सरल बनाता है ( उदाहरण 4 देखें):

 ArrayList<Integer> partNumbers = new ArrayList<Integer>(); partNumbers.add(999); partNumbers.add(777); partNumbers.add(1234); // set up Database database = new Database(getConnection()); Table<Inventory> inventoryTable = database.getTable(Inventory.class); // select operation for list "...WHERE PARTNUMBER IN (?, ?, ?)..." for (Inventory inventory: inventoryTable. selectAllWhere("partNumberIn", partNumbers)) { System.out.println(inventory.getPartNumber()); } 

एक तरह से मैं सोच सकता हूँ कि java.sql.PreparedStatement और जूरी हेराफेरी का एक बिट का उपयोग करना है

तैयार स्थितिबद्धता तैयार है STmt = conn.prepareStatement ("से चयन करें * से MYCOL में (?)");

… और फिर …

तैयार STmt.setString (1, [अपने स्ट्रैड पैराम्स]);

http://java.sun.com/docs/books/tutorial/jdbc/basics/prepared.html