दिलचस्प पोस्ट
मैं जेएस को आवेदन रूट के बारे में कैसे जान सकता हूं? एंड्रॉइड पर रंग समझना (छह अक्षर) मैं SQL सर्वर में एक ही बोली से कैसे बचूं? अस्पष्ट पारदर्शी पृष्ठभूमि प्रभाव बनाएँ क्या आप सी ++ में पॉइंटर्स के लिए शून्य या 0 (शून्य) का उपयोग करते हैं? Matplotlib और प्लॉट रंग स्केल का उपयोग करके अपना रंगमेट बनाएं वसंत में एक क्वार्ट्ज नौकरी में बीन संदर्भ इंजेक्ट? आप यह कैसे बता सकते हैं कि लेआउट कब तैयार किया गया है? टैबकॉन्ट्रॉल से टैबपेज को कैसे छिपाएंगे एकाधिक क्रियाएं मिलीं जो वेब एपीआई में अनुरोध से मेल खाती हैं PDO का उपयोग कर सहायक फ़ंक्शन डालें / अपडेट करें अपरिवर्तनीय से क्या मतलब है? सीएसएस स्क्रॉलबार शैली क्रॉस ब्राउज़र एक "मिश्रित" वेक्टर (पत्रों के साथ संख्या) आदेश दें ImageView चौड़ाई और ऊँचाई प्रोग्रामेटिक रूप से सेट करें?

मैं जेडीबीसी के साथ प्रयास-के-संसाधनों का उपयोग कैसे करूं?

जेडीबीसी के साथ डेटाबेस से उपयोगकर्ता प्राप्त करने के लिए मेरे पास एक तरीका है:

public List<User> getUser(int userId) { String sql = "SELECT id, name FROM users WHERE id = ?"; List<User> users = new ArrayList<User>(); try { Connection con = DriverManager.getConnection(myConnectionURL); PreparedStatement ps = con.prepareStatement(sql); ps.setInt(1, userId); ResultSet rs = ps.executeQuery(); while(rs.next()) { users.add(new User(rs.getInt("id"), rs.getString("name"))); } rs.close(); ps.close(); con.close(); } catch (SQLException e) { e.printStackTrace(); } return users; } 

इस कोड को सुधारने के लिए मुझे जावा 7 का प्रयोग कैसे करना चाहिए?

मैंने नीचे दिए गए कोड के साथ कोशिश की है, लेकिन यह कई try का उपयोग करता है, और पठनीयता में सुधार नहीं करता है क्या मुझे दूसरे तरीकों से try-with-resources उपयोग करना चाहिए?

 public List<User> getUser(int userId) { String sql = "SELECT id, name FROM users WHERE id = ?"; List<User> users = new ArrayList<>(); try { try (Connection con = DriverManager.getConnection(myConnectionURL); PreparedStatement ps = con.prepareStatement(sql);) { ps.setInt(1, userId); try (ResultSet rs = ps.executeQuery();) { while(rs.next()) { users.add(new User(rs.getInt("id"), rs.getString("name"))); } } } } catch (SQLException e) { e.printStackTrace(); } return users; } 

वेब के समाधान से एकत्रित समाधान "मैं जेडीबीसी के साथ प्रयास-के-संसाधनों का उपयोग कैसे करूं?"

मुझे पता है कि यह बहुत पहले उत्तर दिया गया था लेकिन एक अतिरिक्त दृष्टिकोण का सुझाव देना चाहता हूं जो नेस्टेड प्रयास-संसाधनों के साथ डबल ब्लॉक

 public List<User> getUser(int userId) { try (Connection con = DriverManager.getConnection(myConnectionURL); PreparedStatement ps = createPreparedStatement(con, userId); ResultSet rs = ps.executeQuery()) { // process the resultset here, all resources will be cleaned up } catch (SQLException e) { e.printStackTrace(); } } private PreparedStatement createPreparedStatement(Connection con, int userId) throws SQLException { String sql = "SELECT id, username FROM users WHERE id = ?"; PreparedStatement ps = con.prepareStatement(sql); ps.setInt(1, userId); return ps; } 

आपके उदाहरण में बाह्य प्रयास की कोई आवश्यकता नहीं है, इसलिए आप कम से कम 3 से 2 तक नीचे जा सकते हैं, और आपको भी बंद करने की आवश्यकता नहीं है ; संसाधन सूची के अंत में दो बार प्रयासों का उपयोग करने का लाभ यह है कि आपके सभी कोड सामने मौजूद हैं, इसलिए आपको अलग विधि का उल्लेख नहीं करना है:

 public List<User> getUser(int userId) { String sql = "SELECT id, username FROM users WHERE id = ?"; List<User> users = new ArrayList<>(); try (Connection con = DriverManager.getConnection(myConnectionURL); PreparedStatement ps = con.prepareStatement(sql)) { ps.setInt(1, userId); try (ResultSet rs = ps.executeQuery()) { while(rs.next()) { users.add(new User(rs.getInt("id"), rs.getString("name"))); } } } catch (SQLException e) { e.printStackTrace(); } return users; } 

अतिरिक्त आवरण वर्ग बनाने के बारे में क्या?

 package com.naveen.research.sql; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public abstract class PreparedStatementWrapper implements AutoCloseable { protected PreparedStatement stat; public PreparedStatementWrapper(Connection con, String query, Object ... params) throws SQLException { this.stat = con.prepareStatement(query); this.prepareStatement(params); } protected abstract void prepareStatement(Object ... params) throws SQLException; public ResultSet executeQuery() throws SQLException { return this.stat.executeQuery(); } public int executeUpdate() throws SQLException { return this.stat.executeUpdate(); } @Override public void close() { try { this.stat.close(); } catch (SQLException e) { e.printStackTrace(); } } } 

फिर कॉलिंग क्लास में आप prepareStatement पद्धति को लागू कर सकते हैं:



     कोशिश (कनेक्शन con = DriverManager.getConnection (JDBC_URL, prop);
                         तैयार किए गए स्टेटडैपरड्राफर स्टेट = नया तैयार किए गए स्टेटमेंटवेपर (कॉन, क्वेरी, न्यू ऑब्जेक्ट [] {123L, "टेस्ट"}) {
                             @Override
                             संरक्षित शून्य तैयारस्थापन (वस्तु ... पैरामीटर) SQLException फेंकता {
                                 stat.setLong (1, लांग.क्लास.कास्ट (पैरामीटर [0]));
                                 stat.setString (2, स्ट्रिंग.वल्यूउफ़ (पाराम [1]));
                             }
                         };
                         परिणामसेट rs = stat.executeQuery ();
                         ) {
                             जबकि (rs.next ()) 
                                 System.out.println (स्ट्रिंग। प्रारूप ("% s,% s", rsgetstring (2), rsgetstring (1)));
                 } पकड़ (एसक्लेक्सेप्शन ई) {
                     e.printStackTrace ();
                 }

बाहरी प्रयास में सब कुछ फिट करने के लिए यहां लम्ब्दास और जेडीके 8 प्रदायक का उपयोग करने का एक संक्षिप्त तरीका है:

  try (Connection con = DriverManager.getConnection(JDBC_URL, prop); PreparedStatement stmt = ((Supplier<PreparedStatement>)() -> { try { PreparedStatement s = con.prepareStatement( "SELECT userid, name, features FROM users WHERE userid = ?"); s.setInt(1, userid); return s; } catch (SQLException e) { throw new RuntimeException(e); } }).get(); ResultSet resultSet = stmt.executeQuery()) { }