SQL Query and JDBC: Database से Connection स्थापित हो जाने के बाद हम उस Database में नए Data को Store कर सकते हैं और Database में Stored किसी Required Data को Retrieve कर सकते हैं। हम जब Database पर कोई Query भेजते हैं, तो Database उस Query को Process करता है और Generate होने वाले Result को Return करता है, जिसे Result Set कहते हैं।
Database से Query करने के लिए हमें Database पर SQL Statement भेजने पडते हैं। SQL Statements को Database पर भेजने के लिए हम जो SQL Statements लिखते हैं, उन SQL Statements को Represent करने के लिए JDBC हमें तीन तरह की Classes प्रदान करता है।
हम इन तीन तरह की Classes के Objects Create करके किसी SQL Statement को Database पर Request के रूप में भेज सकते हैं, जिसके Result के रूप में Database Front-End Client Software को Result Set Return करता है। ये तीन तरह की Statement Classes के Objects निम्नानुसार हैं:
The Statement Object
Statement Object Create करने के लिए हमें Connection Object के साथ createStatement() Method को Call करना होता है।
The PreparedStatement Object
PreparedStatement Object Create करने के लिए हमें Connection Object के साथ preparedStatement() Method को Call करना होता है। PreparedStatement Object में Methods का एक ऐसा समूह होता है, जिनको INPUT Parameters के साथ Use करके Queries को Database पर भेजा जा सकता है।
The CallableStatement Object
CallableStatement Object Create करने के लिए हमें Connection Object के साथ prepareCall() Method को Call करना होता है। इस Object में वे Functionalities होती हैं, जिनका प्रयोग किसी Database में स्थित “Stored Procedures” को Call करने के लिए किया जा सकता है। हम CallableStatement Object का प्रयोग करके INPUT व OUTPUT दोनों Parameters को समान रूप से Handle कर सकते हैं।
SQL Query and JDBC: Using The Statement Object
हम Statement Object को Use करके Database पर सामान्य Queries को Process होने के लिए भेज सकते हैं और Database द्वारा Return होने वाले Result Set को Front-End में Use कर सकते हैं।
// File Name : StatementObjectQueryApp.java import java.sql.*; public class StatementObjectQueryApp { public static void main(String args[]) { try { String connectionURL = "jdbc:odbc:AddressDSN"; Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection conDatabase = erManager.getConnection(connectionURL); Statement sqlQuery = conDatabase.createStatement(); sqlQuery.executeQuery("SELECT * FROM Contacts"); } catch(Exception excp) { System.out.println("Error : " + excp); } } }
जब हम इस Program को Run करते हैं, तब हमें Output में कुछ भी प्राप्त नहीं होता है। ऐसा इसलिए होता है, क्योंकि Statement Object की Query Database पर Run तो होती है, लेकिन Database से Return होने वाले Result को Hold करने के लिए हमने कोई Object Create नहीं किया है, जिससे Return होने वाले Result को Output में Display किया जा सके। इस Program में
- हमने Database से Connection स्थापित करने के लिए JDBC-ODBC Bridge Driver को Load किया है।
- getConnection() Method का प्रयोग करके Connection Object को Initialize किया है।
- createStatement() Method का प्रयोग करके Statement Object Create किया है। और अन्त में
- executeQyery() Method का प्रयोग करके Statement Object में Stored Query को Execute किया है।
SQL Query and JDBC: The Statement Object
Statement Object का प्रयोग सामान्य प्रकार की Queries को Database पर Run करने के लिए किया जाता है। इस Object के तीन Methods होते हैं, जिनका प्रयोग Database पर Query को Run करने के लिए किया जा सकता है।
- executeQuery() Method
ये Method एक Simple SELECT Query Execute करता है और Database इस Method के Execute होने पर एक Single ResultSet Object Return करता है।
- executeUpdate() Method
ये Method एक SQL INSERT, UPDATE व DELETE Statement Execute करने में सक्षम होता है
- execute() Method
ये Method एक ऐसा SQL Statement Execute करता है, जिसके कई Results Return हो सकते हैं।
SQL Query and JDBC: The ResultSet Object
ResultSet Object हमें ऐसे Methods Provide करता है, जिनका प्रयोग हम ResultSet Object के साथ करके किसी Table के Data को Access कर पाने में सक्षम होते हैं। हम जब भी Database पर किसी Statement को Execute करते हैं, Database से एक ResultSet Return होता है।
ResultSet Object Database से Return होने वाले Data को एक Temporary Table के रूप में Represent करता है। इसमें एक Cursor होता है, जो Data के Current ROW को Point करता है। जब Database से ResultSet Return होता है, तब Initially ये Cursor First Row से पहले की Position पर Placed होता है।
यानी यदि First Row को 0 माना जाए, तो Cursor पहली Row के Record से पहले यानी -1 पर Placed रहता है। next() Method Cursor को Record की अगली Row पर ले जाता है। हम किसी ResultSet Object से Data को प्राप्त करने के लिए getXXX() Methods को Call कर सकते हैं, जहां XXX Database से Return हो रहे किसी Field का Data Type होता है। अगले Program में हमने पिछले Program को ही Modify करके उसमें ResultSet Object को Use किया है।
// File Name : StatementObjectQueryApp.java import java.sql.*; public class StatementObjectQueryApp { public static void main(String args[]) { ResultSet result; try { String connectionURL = "jdbc:odbc:AddressDSN"; Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection conDatabase = DriverManager.getConnection(connectionURL); Statement sqlQuery = conDatabase.createStatement(); result = sqlQuery.executeQuery("SELECT * FROM Contacts"); System.out.print("SrNo. \tFName \tLName \tAddress \tCity \tState \tPin \tCountry \n" ); System.out.print("-------------------------------------------------------------------\n" ); while(result.next()) { for(int i=1; i<=8; i++) System.out.print(result.getString(i) + "\t" ); System.out.println(); } } catch(Exception excp) { System.out.println("Error : " + excp); } } }
Output
SrNo. | FName | LName | Address | City | State | Pin | Country |
004 | Nand | Nandan | Bali Road | Rani | UP | 122144 | India |
001 | Kuldeep | Mishra | Nilkanth Road | Falna | RAJ | 306116 | India |
002 | Achyut | Yadav | Nilkanth Road | Falna | RAJ | 306116 | India |
003 | Govind | Gopal | Bedal Road | Bali | JPR | 306701 | India |
इस Program में हमने result नाम का एक ResultSet प्रकार का Object Create किया है। फिर Database से Connection बनाने के बाद Database पर एक SQL Query को Execute किया है। जब हम SQL Statement को Execute करते हैं, तब Database उस SQL Query के आधार पर कुछ Records Return करता है, जिसे result नाम के Object में Hold किया गया है। फिर निम्नानुसार एक Nested Loop चलाया गया है:
while(result.next()) { for(int i=1; i<=8; i++) System.out.print(result.getString(i) + "\t" ); System.out.println(); }
while Loop तब तक चलता है जब तक कि result नाम के ResultSet Object में Cursor अन्तिम Record पर नहीं पहुंच जाता है। जैसे ही Cursor ResultSet के अन्तिम Record पर पहुंचता है, while Loop Terminate हो जाता है। ResultSet Object result में स्थित विभिन्न Records के Set में हर अगले Record पर जाने के लिए इस Object के साथ while Loop में next() Method को Call किया गया है। Loop के हर Iteration में Cursor ResultSet के अगले Record पर पहुंच जाता है।
इस while Loop के अन्दर एक for Loop को चलाया गया है। इस Loop में हमने result नाम के ResultSet प्रकार के Object में स्थित विभिन्न Records के विभिन्न Field के Data को Display करने के लिए getString() Method को Call किया है।
इस Method में हम Argument के रूप में जो Number देते हैं, जावा हमें ResultSet के उसी Field का Data Return कर देता है। चूंकि हमने पहले भी कहा है कि ResultSet Object में जो Records Database से Return होकर आते हैं, वे Records एक Table के समान होते हैं और हर Table Records (Rows) का एक समूह होता है तथा हर Record (Row) में Related Data Items के छोटे&छोटे हिस्से होते हैं, जिन्हें Field (Column) कहा जाता है।
while Loop एक बार में ResultSet में एक Record को Point करता है। उस Record में कई Field होते हैं। जावा में हर Field को उसके Index Number से Access किया जाता है और ResultSet के पहले Field को मान 1 से दूसरे Field को मान 2 से व इसी तरह से दसवें Field के Data को मान 10 से Represent किया जाता है। मानलो कि हमें Table के पांचवे Field का Data Return करना हो तो हमें निम्नानुसार Statement लिखना होगा:
result.getString(5);
चूंकि हमें किसी Record के सभी Data Fields को Return करना है साथ ही Screen पर Print भी करना है, इसलिए हमनें इस Statement को System.out.println() Statement में Use किया है, साथ ही इस Statement को एक for Loop में Use किया है और getString() Method में Argument के रूप में Loop के Variable का मान दे दिया है। ऐसा करने पर ResultSet Object के Record के सभी Fields के Data को Screen पर Print किया गया है।
इस Program में हमने ResultSet से Return होने वाले Field के Data को String Format में Return करवाया है, क्योंकि ResultSet के Data को हमें Directly Screen पर Print करना है। लेकिन यदि हमें Table के किसी Field के Data के साथ कोई Calculation करवानी हो तो हम उसे किसी अन्य Data Type के रूप में भी Return करवा सकते हैं।
उदाहरण के लिए मानलो कि हमें सभी Serial Numbers में 1 Add करना है और उसके बाद Serial Number को Print करना है। इस स्थिति में हमें ResultSet के प्रथम Field के Data को Integer Format में Return करवाना होगा और उसमें 1 Add करने के बाद उसे Print करना होगा। इस काम को पूरा करने के लिए हमें while Loop को निम्नानुसार Modify करना होगा:
while(result.next()) { for(int i=1; i<8; i++) { if(i==1) System.out.print((result.getInt(1) + 1) + "\t"); System.out.print(result.getString(i+1) + "\t" ); } System.out.println();
जब हम while Loop को Modify करके Program को Run करेंगे, तब हमें Output निम्नानुसार प्राप्त होगा:
Output
SrNo. | FName | LName | Address | City | State | Pin | Country |
004 | Nand | Nandan | Bali Road | Rani | UP | 122144 | India |
001 | Kuldeep | Mishra | Nilkanth Road | Falna | RAJ | 306116 | India |
002 | Achyut | Yadav | Nilkanth Road | Falna | RAJ | 306116 | India |
003 | Govind | Gopal | Bedal Road | Bali | JPR | 306701 | India |
SQL Query and JDBC: Using PreparedStatement Object
जब हमें ऐसे Application Develop करने होते हैं, जिसमें Run Time में User की Requirement के आधार पर Database से ResultSet Retrieve करना होता है। उदाहरण के लिए हमें केवल उस Record को ही Screen पर Display करना है, जिसका SrNo. User Program के Run Time में Input करता है। इस स्थिति में हम निम्नानुसार SQL Statement लिखते हैं:
SELECT * FROM Contacts WHERE SRNO = ?
Database से इस प्रकार की Query करने के लिए हमें ऐसा Query Statement Create करना होता है, जो Program के Run time में WHERE Clause में उचित Parameter प्राप्त करता है और Required Record ResultSet Object में Return करता है।
SQL Query and JDBC: The PreparedStatement Object
ये Object हमें Parameterized Query Execute करने की सुविधा प्रदान करता है। PreparedStatement Object Create करने के लिए हमें Connection Object के साथ preparedStatement() Method को Call करना होता है। यानी यदि हम पिछले Program में ही Parameterized Parameter की सुविधा प्राप्त करना चाहते] तो हमें SQL Statement Query Object निम्नानुसार Create करना होता:
Statement sqlQuery = conDatabase.preparedStatement(“SELECT * FROM Contacts WHERE SRNO = ?”);
Connection Object का preparedStatement() Method Argument के रूप में एक SQL Statement String लेता है। इस SQL Statement में ऐसा Placeholder भी हो सकता है, जिसे Program के Run Time में दिए गए INPUT द्वारा Replace किया जा सकता है। हमारे इस Statement में “?” एक Placeholder है, जिसके स्थान पर Program के Run Time में Parameter INPUT किया जा सकता है।
SQL Query and JDBC: Passing INPUT Parameters at Runtime
PreparedStatement Object Execute करने से पहले हमें हर “?” Parameter को कोई ना कोई मान Set करना जरूरी होता है। इस काम को setXXX() Method Call करके पूरा किया जाता है, जबकि XXX Parameter का Data Type होता है। अगले GUI Program में Parameter के आधार पर Record प्राप्त करने की Process को समझाया गया है।
// File Name : StatementObjectQueryGUIApp.java import java.sql.*; import java.awt.*; import java.awt.event.*; public class StatementObjectQueryGUIApp extends Frame{ TextField srno, fname, lname, city, state, pin, cntry; TextArea address; Label lblsrno, lblfname, lbllname, lbladdress; Label lblcity, lblstate, lblpin, lblcntry; Button btnNext; // These variables are declared static because they // have to be used in a static method static ResultSet result; static Connection conDatabase; static PreparedStatement sqlQuery; static StatementObjectQueryGUIApp myWindow ; public StatementObjectQueryGUIApp(){ super("The Runtime parameterized query application"); setLayout(null); srno = new TextField(); fname = new TextField(); lname = new TextField(); address = new TextArea(); city = new TextField(); state = new TextField(); pin = new TextField(); cntry = new TextField(); lblsrno = new Label("Serial Number : "); lblfname = new Label("First Name : "); lbllname = new Label("Last Name : "); lbladdress = new Label("Address : "); lblcity = new Label("City : "); lblstate = new Label("State : "); lblpin = new Label("Pincode: "); lblcntry = new Label("Country : "); btnNext = new Button("Query"); lblsrno.setBounds(20, 40, 100, 20); add(lblsrno); srno.setBounds(120, 40, 100, 22); add(srno); lblfname.setBounds(20, 65, 100, 20); add(lblfname); fname.setBounds(120, 65, 250, 22); add(fname); lbllname.setBounds(20, 90, 100, 20); add(lbllname); lname.setBounds(120, 90, 250, 22); add(lname); lbladdress.setBounds(20, 115, 100, 20); add(lbladdress); address.setBounds(120, 115, 250, 70); add(address); lblcity.setBounds(20, 140, 100, 20); add(lblcity); city.setBounds(120, 140, 250, 22); add(city); lblstate.setBounds(20, 165, 100, 20); add(lblstate); state.setBounds(120, 165, 250, 22); add(state); lblpin.setBounds(20, 190, 100, 20); add(lblpin); pin.setBounds(120, 190, 250, 22); add(pin); lblcntry.setBounds(20, 215, 100, 20); add(lblcntry); cntry.setBounds(120, 215, 250, 22); add(cntry); btnNext.setBounds(185, 260, 50, 25); add(btnNext); setVisible(true); } public static void main(String args[]){ myWindow = new StatementObjectQueryGUIApp(); myWindow.setSize(400,300); try { String connectionURL = "jdbc:odbc:AddressDSN"; Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conDatabase = DriverManager.getConnection(connectionURL); sqlQuery = conDatabase.prepareStatement ("SELECT * FROM Contacts WHERE ContactID = ? "); }catch(Exception excp){ System.out.println("Error : Hello" + excp); } } public boolean action(Event evnt, Object ObjCaption){ if(evnt.target instanceof Button) HandleButton(ObjCaption); return true; } public void HandleButton(Object Caption){ if(Caption == "Query"){ try { sqlQuery.setString(1, srno.getText()); result = sqlQuery.executeQuery(); result.next(); }catch(Exception excp){} showRecord(result); } } // The showRecord method displays a record on the Form Window public void showRecord(ResultSet result){ try { srno.setText(result.getString("ContactID")); fname.setText(result.getString(2)); lname.setText(result.getString(3)); address.setText(result.getString(4)); city.setText(result.getString(5)); state.setText(result.getString(6)); pin.setText(result.getString(7)); cntry.setText(result.getString(8)); }catch(Exception excp) {} } }

इस Program में हमने एक Class बनाई है, जिसमें एक Window Develop किया है। इस Window में हमने Database के विभिन्न Fields के Data को Display करने के लिए कुछ Text Fields Create किए हैं और एक Query नाम का Button Create किया है। जब हम Serial Number वाले Field में कोई Serial Number Input करके Query Button पर Click करते हैं, तो उस Serial Number वाले Record के सभी Field Form पर स्थित विभिन्न Text Boxes में Fill हो जाते हैं।
इस Program में हमने StatementObjectQueryGUIApp नाम की एक Class Create की है और इसके Constructor में Window Create किया है। फिर इसी Class में एक main() Method Define किया है और इसमें इस Class का एक Object Create करके Window को Screen पर Display किया है। चूंकि main() Method एक Static Method होता है, इसलिए इस Method में Use करने के लिए हमने निम्नानुसार कुछ Objects को Static प्रकार का Declare किया है:
// These variables are declared static because they // have to be used in a static method static ResultSet result; static Connection conDatabase; static PreparedStatement sqlQuery; static StatementObjectQueryGUIApp myWindow;
इस Program में हमने PreparedStatement प्रकार का Object Create किया है, ताकि Program के Run Time में User जो Serial Number Input करता है, उस Serial Number वाला Record ही Database से Return हो और उस Record के विभिन्न Data Field Form पर स्थित विभिन्न Text Boxes में Fill हो जाएं। User जो Serial Number Input करता है, उसी Serial Number वाले Record को Database से प्राप्त करने के लिए हमने निम्नानुसार Statement Use किया है:
sqlQuery = conDatabase.prepareStatement("SELECT * FROM Contacts WHERE ContactID = ? ");
इस Statement में ContactID के बाद एक Question Mark है, जो Program के Run Time में ContactID Field के लिए Serial Number के मान को srno नाम के Text Field से प्राप्त करता है। जब ये Query Run होता है, तब Database से वही Record Return होता है, जिसका Serial Number srno Text Field में होता है। User जब Serial Number Text Field में कोई ContactID Input करके Query Button को Press करता है, तो Event Handler में निम्न Statement Execute होता है:
sqlQuery.setString(1, srno.getText());
ये Statement sqlQuery Statement के पहले Question Mark के स्थान पर srno Text Field के Text को Place कर देता है। फिर निम्नानुसार अगला Statement Execute होता है और result नाम के ResultSet Object में Database से वह Record आ जाता है, जिसका Serial Number srno नाम के Text Field में होता है। इस तरह से हम हमारी Requirement के अनुसार वांछित Record को जावा के GUI Front-End में Access कर सकते हैं।
इसी तरह से हम Statement Object में Argument के रूप में किसी भी प्रकार की SQL Query को Database पर Run करवा सकते हैं। उदाहरण के लिए मानलो कि हमें Database में कोई नया Record Add करना हो, Database के किसी Record को Delete करना हो या Database के किसी Record को Modify करना हो, तो हम निम्नानुसार इन कामों को पूरा करने वाले SQL Statement को Statement Object में Execute कर सकते हैं:
public void addRecord() { try { sqlQuery.executeUpdate((“INSERT INTO Contact VALUES(“005”, “Manohar”,” ... “”)”); } catch(Exception excp) {} } public void modifyRecord() { try { sqlQuery.executeUpdate(“UPDATE Contact SET ContactID = “005”, FName = “Mohan”,” ... “”); } catch(Exception excp) {} } public void deleteRecord() { try { sqlQuery.executeUpdate(“DELETE Contact WHERE ContactID = “005” ”); } catch(Exception excp) {} }
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook Java in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
Java Programming Language in Hindi | Page: 682 | Format: PDF