खोज…
टिप्पणियों
एक PreparedStatement
गया कथन निष्पादित होने से पहले बयान की घोषणा करता है, और मापदंडों के लिए प्लेसहोल्डर के लिए अनुमति देता है। यह कथन को सर्वर पर एक बार तैयार (और अनुकूलित) करने की अनुमति देता है, और फिर मापदंडों के विभिन्न सेटों के साथ पुन: उपयोग किया जाता है।
पैरामीटर प्लेसहोल्डर्स का अतिरिक्त लाभ यह है कि यह SQL इंजेक्शन से सुरक्षा प्रदान करता है। यह या तो पैरामीटर मानों को अलग से भेजकर प्राप्त किया जाता है, या क्योंकि ड्राइवर मानों को सही ढंग से आवश्यकतानुसार बच जाता है।
तैयारी के लिए मापदंडों की स्थापना
क्वेरी स्ट्रिंग में प्लेसहोल्डर्स को set*
विधियों का उपयोग करके सेट करने की आवश्यकता है:
String sql = "SELECT * FROM EMP WHERE JOB = ? AND SAL > ?";
//Create statement to make your operations
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, "MANAGER"); // String value
statement.setInt(2, 2850); // int value
विशेष स्थितियां
पूर्ण मान सेट करना:
एक शून्य मान सेट करना उदाहरण के लिए setInt
और setLong
विधियों का उपयोग करके पूरा नहीं किया जा सकता है, क्योंकि ये ऑब्जेक्ट्स ( Integer
और Long
) के बजाय आदिम प्रकार ( int
और long
) का उपयोग करते हैं, और NullPointerException
को फेंकने का कारण होगा:
void setFloat(int parameterIndex, float x)
void setInt(int parameterIndex, int x)
void setLong(int parameterIndex, long x)
setNull
का उपयोग करके इन मामलों को संभाला जा सकता है।
setNull(int parameterIndex, int sqlType)
यह टाइप किया गया है, इसलिए दूसरा पैरामीटर प्रदान करना होगा, java.sql.Types देखें
//setting a NULL for an integer value
statement.setNull(2, java.sql.Types.INTEGER);
LOBs सेट करना
LOB को विशेष वस्तुओं का उपयोग करने की आवश्यकता होती है।
Clob longContent = connection.createClob();
Writer longContentWriter = longContent.setCharacterStream(1); // position: beginning
longContentWriter.write("This will be the content of the CLOB");
pstmt = connection.prepareStatement("INSERT INTO CLOB_TABLE(CLOB_VALUE) VALUES (?)");
pstmt.setClob(1, longContent);
set*
विधियों पर अपवाद
SQLException
- यदिparameterIndex
SQL स्टेटमेंट में एक पैरामीटर मार्कर के अनुरूप नहीं है; यदि डेटाबेस एक्सेस एरर आता है या यह विधि एक बंद सेPreparedStatement
SQLFeatureNotSupportedException
- अगर sqlType एक हैARRAY
,BLOB
,CLOB
,DATALINK
,JAVA_OBJECT
,NCHAR
,NCLOB
,NVARCHAR
,LONGNVARCHAR
,REF
,ROWID
,SQLXML
याSTRUCT
डेटा प्रकार और JDBC ड्राइवर इस डेटा प्रकार का समर्थन नहीं करता
एक तैयार कथन का मूल उपयोग
यह उदाहरण दिखाता है कि मापदंडों के साथ एक सम्मिलित कथन के साथ एक तैयार कथन कैसे बनाया जाए, उन मापदंडों पर मान सेट करें और फिर कथन को निष्पादित करें।
Connection connection = ... // connection created earlier
try (PreparedStatement insert = connection.prepareStatement(
"insert into orders(id, customerid, totalvalue, comment) values (?, ?, ?, ?)")) {
//NOTE: Position indexes start at 1, not 0
insert.setInt(1, 1);
insert.setInt(2, 7934747);
insert.setBigDecimal(3, new BigDecimal("100.95"));
insert.setString(4, "quick delivery requested");
insert.executeUpdate();
}
इंसर्ट स्टेटमेंट में प्रश्न चिह्न ( ?
) पैरामीटर प्लेसहोल्डर हैं। वे स्थितीय पैरामीटर हैं जिन्हें बाद में संदर्भित किया जाता है (1-आधारित इंडेक्स का उपयोग करके) उन मापदंडों पर मान सेट करने के लिए setXXX
तरीकों का उपयोग करते हुए।
कोशिश-के-संसाधनों का उपयोग यह सुनिश्चित करता है कि कथन बंद है और उस कथन के लिए उपयोग में आने वाले किसी भी संसाधन को जारी किया जाता है।