Query Execution in JDBC: Statement Types and Performance
Query Execution in JDBC: Statement Types and Performance
Query Execution in JDBC
जब हम Java में Database से connect होकर data को access या modify करते हैं, तो उसे JDBC (Java Database Connectivity) के ज़रिए किया जाता है। JDBC basically एक API है जो Java Application और Database के बीच communication bridge का काम करता है।
Query execution का मतलब है — Database को SQL Command भेजना और उसका Result प्राप्त करना। जैसे ही connection establish होता है, JDBC के जरिए SQL queries को execute किया जा सकता है। लेकिन ये queries execute करने के लिए हमें कुछ Statement Objects की जरूरत होती है।
Types of Statements in JDBC
JDBC में Query execute करने के लिए तीन main types के Statement objects होते हैं — Statement, PreparedStatement और CallableStatement। इन तीनों के अपने use cases और performance impacts होते हैं। चलिए इन्हें एक-एक करके समझते हैं।
1. Statement
Statement सबसे basic object है जिसका use simple SQL queries को execute करने के लिए किया जाता है। जब भी आप query को बार-बार नहीं चलाते या parameters dynamic नहीं होते, तब Statement अच्छा option होता है।
Syntax Example:
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM students");
Statement हर बार query को Database server पर भेजकर compile करता है, जिससे performance थोड़ा slow हो सकता है अगर query बार-बार execute करनी हो। इसलिए ये छोटे या rarely used queries के लिए ठीक रहता है।
2. PreparedStatement
PreparedStatement Statement से advanced version है। इसमें SQL query पहले से compiled रहती है, और parameters बाद में bind किए जाते हैं। इसलिए जब query बार-बार execute होती है, तो performance बेहतर मिलता है।
Syntax Example:
PreparedStatement ps = con.prepareStatement("INSERT INTO students VALUES (?, ?, ?)");
ps.setInt(1, 101);
ps.setString(2, "Rahul");
ps.setInt(3, 85);
ps.executeUpdate();
PreparedStatement SQL Injection से भी बचाता है क्योंकि parameters precompiled query के हिस्से नहीं बनते। यानी security और performance दोनों improve होते हैं।
3. CallableStatement
CallableStatement का use तब किया जाता है जब आपको Database में stored procedures को call करना हो। ये complex operations या business logic को Database के अंदर execute करने में मदद करता है।
Syntax Example:
CallableStatement cs = con.prepareCall("{call getStudentDetails(?)}");
cs.setInt(1, 101);
ResultSet rs = cs.executeQuery();
CallableStatement large applications के लिए useful होता है जहाँ performance और reusability दोनों ज़रूरी होते हैं।
Comparison Between Statement, PreparedStatement, and CallableStatement
| Feature | Statement | PreparedStatement | CallableStatement |
|---|---|---|---|
| SQL Compilation | Every execution | Precompiled once | Precompiled stored procedure |
| Performance | Slow | Fast (for repeated execution) | Very fast (optimized) |
| Security | Low (SQL Injection possible) | High (SQL Injection safe) | High |
| Use Case | Simple queries | Dynamic parameterized queries | Stored procedure calls |
| Ease of Use | Simple | Moderate | Complex |
Execution Process in JDBC
अब समझते हैं कि एक SQL Query JDBC के माध्यम से कैसे execute होती है। पूरा process step-by-step नीचे दिया गया है:
- Step 1: सबसे पहले JDBC Driver को load किया जाता है।
- Step 2: फिर Database से Connection establish किया जाता है।
- Step 3: इसके बाद Statement या PreparedStatement object create किया जाता है।
- Step 4: SQL Query execute की जाती है (SELECT, INSERT, UPDATE, DELETE आदि)।
- Step 5: ResultSet object से data fetch किया जाता है।
- Step 6: अंत में connection close कर दिया जाता है।
Example:
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/college","root","password");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM students");
while(rs.next()) {
System.out.println(rs.getInt(1)+" "+rs.getString(2));
}
con.close();
Performance Analysis of Statement Types
अब बात करते हैं performance की। JDBC में performance काफी हद तक इस बात पर निर्भर करता है कि आप कौन-सा statement use कर रहे हैं और query कितनी बार execute हो रही है।
1. Statement Performance
हर execution पर query को database दोबारा compile करता है। इसका मतलब — अगर आप 100 बार एक ही query execute करते हैं, तो 100 बार compile होगा। इससे CPU और time दोनों ज़्यादा लगते हैं।
2. PreparedStatement Performance
PreparedStatement पहली बार compile होता है और उसके बाद cached रहता है। अगली बार वही compiled version reuse होता है। इसलिए repeated queries के लिए ये बहुत fast होता है।
3. CallableStatement Performance
CallableStatement का performance सबसे बेहतर होता है क्योंकि stored procedures पहले से compiled होती हैं और database engine उन्हें optimize करता है। इसका use large-scale applications में बहुत helpful है।
When to Use Which Statement
- Statement: जब query simple हो और rarely execute करनी हो।
- PreparedStatement: जब query बार-बार execute हो या parameters dynamic हों।
- CallableStatement: जब stored procedures या complex operations execute करने हों।
Best Practices for Query Execution
- Always use PreparedStatement for user inputs to prevent SQL Injection।
- Connection को हमेशा close करें ताकि memory leak न हो।
- Batch processing के लिए addBatch() और executeBatch() का use करें।
- Reusable queries के लिए PreparedStatement cache का फायदा उठाएँ।
- Exception handling हमेशा करें — try-with-resources use करें।
Example of Batch Processing
Batch processing से multiple SQL queries को एक साथ execute किया जा सकता है जिससे network calls कम होती हैं और speed बढ़ जाती है।
PreparedStatement ps = con.prepareStatement("INSERT INTO students VALUES (?, ?, ?)");
ps.setInt(1, 101);
ps.setString(2, "Rahul");
ps.setInt(3, 85);
ps.addBatch();
ps.setInt(1, 102);
ps.setString(2, "Sneha");
ps.setInt(3, 90);
ps.addBatch();
ps.executeBatch();
इस तरीके से 100 या 1000 records भी एक साथ insert किए जा सकते हैं, जिससे performance बहुत बढ़ जाता है।
SQL Injection Awareness
SQL Injection एक बहुत common security issue है जिसमें hacker malicious query inject करके database से sensitive data निकाल सकता है। Statement इसके लिए vulnerable होता है, जबकि PreparedStatement पूरी तरह safe होता है।
Unsafe Example (Statement):
String query = "SELECT * FROM users WHERE name='" + userInput + "'";
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
Safe Example (PreparedStatement):
PreparedStatement ps = con.prepareStatement("SELECT * FROM users WHERE name=?");
ps.setString(1, userInput);
ResultSet rs = ps.executeQuery();
Key Points Summary
- JDBC query execution के लिए तीन main statement types होते हैं — Statement, PreparedStatement, CallableStatement।
- Statement simple queries के लिए, PreparedStatement dynamic queries के लिए, और CallableStatement stored procedures के लिए use किया जाता है।
- Performance के लिहाज से PreparedStatement और CallableStatement, Statement से ज्यादा efficient हैं।
- PreparedStatement SQL Injection से भी बचाता है, जिससे security बेहतर रहती है।
- Batch processing और caching features performance को और बढ़ाते हैं।
Exam Oriented Notes
- JDBC का full form — Java Database Connectivity
- JDBC में query execute करने के लिए Statement objects का use होता है।
- Statement हर बार compile होता है, PreparedStatement precompiled रहता है।
- CallableStatement stored procedure call करने के लिए use होता है।
- PreparedStatement SQL Injection से बचाव करता है।
- Batch processing से performance improve होती है।
- Best practice — हमेशा PreparedStatement या CallableStatement का use करें।
- ResultSet का use SELECT query के result को fetch करने के लिए किया जाता है।
- DriverManager का काम database connection establish करना है।
- JDBC में query execution के बाद connection को close करना ज़रूरी होता है।