Ipinapaliwanag ng tutorial na ito kung paano gamitin ang JDBC ResultSet para kunin ang data. Malalaman din natin ang tungkol sa mga interface ng ResultSetMetaData at DatabaseMetaData na may mga halimbawa:
Sa JDBC DriverManager tutorial ng JDBC tutorial series , natutunan namin kung paano gamitin ang JDBC DriverManager at mga pamamaraan nito, JDBC PreparedStatement sa mga Java application.
Sa tutorial na ito, tatalakayin natin ang mga natitirang interface sa JDBC. Sinakop namin ang mga interface ng Statement, PreparedStatement, at CallableStatement sa aming mga nakaraang tutorial.
Dito, malalaman natin ang tungkol sa mga interface ng JDBC ResultSet, ResultSetMetaData, at DatabaseMetaData, ang kanilang mga pamamaraan at kung paano gamitin ang mga pamamaraan sa Java program.
JDBC ResultSet Interface
Ang ResultSet Interface ay nasa java.sql package. Ito ay ginagamit upang mag-imbak ng data na ibinalik mula sa talahanayan ng database pagkatapos ng pagpapatupad ng mga SQL statement sa Java Program. Ang object ng ResultSet ay nagpapanatili ng cursor point sa data ng resulta. Sa default, pumuwesto ang cursor bago ang unang row ng data ng resulta.
Ginagamit ang next() na paraan upang ilipat ang cursor sa susunod na posisyon sa direksyong pasulong. Magbabalik ito ng FALSE kung wala nang mga record. Kinukuha nito ang data sa pamamagitan ng pagtawag sa executeQuery() na pamamaraan gamit ang alinman sa mga object ng pahayag. Maaaring ito ay Statement o PreparedStatement o CallableStatement object. Inihanda na Pahayag, atibinabalik ang pangalan ng schema ng talahanayan ng column
ResultSetMetaData Halimbawa
package com.STH.JDBC; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; public class ResultSetMetaData_Example { public static void main(String[] args) throws ClassNotFoundException, SQLException { // TODO Auto-generated method stub String QUERY= " select * from employee_details"; Class.forName("oracle.jdbc.driver.OracleDriver"); try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE")) { Statement statemnt1 = conn.createStatement(); ResultSet rs1 =null; rs1 = statemnt1.executeQuery(QUERY); ResultSetMetaData rsmd = rs1.getMetaData(); System.out.println(" We are using ResultSetMetaData "); System.out.println("No: of Columns: "+ rsmd.getColumnCount()); System.out.println("ColumnName of Column 1: "+ rsmd.getColumnName(1)); System.out.println("Data Type of Column 2: " + rsmd.getColumnTypeName(2)); System.out.println("Table Name of the Column 1: " + rsmd.getTableName(1)); System.out.println("Schema Name of the Column 1: " + rsmd.getSchemaName(1)); } } }
OUTPUT:
Paliwanag:
Sa programa sa itaas, ipinatupad namin ang getColumnCount(),getColumnName(), getColumnTypeName(), getTableName() at getSchemaName() na mga pamamaraan sa ResultSetMetaData interface.
DatabaseMetaData
Ang DatabaseMetaData interface ay nagbibigay ng impormasyon tungkol sa Database tulad ng DatabaseName, bersyon ng Database, at iba pa.
Mahahalagang paraan ng interface ng DatabaseMetaData:
Pangalan ng Paraan | Paglalarawan |
---|---|
String getDriverName() | Ibabalik nito ang pangalan ng JDBC driver na ginagamit namin sa aming Java program |
String getDriverVersion() | Ibinabalik nito ang numero ng bersyon ng driver ng JDBC |
String getUserName() | Ibinabalik nito ang username ng Database na ginagamit namin |
String getDatabaseProductName() | Ibinabalik nito ang pangalan ng Database kung saan tayogamit ang |
String getDatabaseProductVersion() | Ibinabalik nito ang numero ng bersyon ng Database na ginagamit namin |
ResultSet getSchemas() | Ibinabalik nito ang mga pangalan ng mga schema na available sa konektadong Database |
String getStringFunctions() | Ibinabalik nito ang listahan ng mga string function na available sa konektadong Database |
String getTimeDateFunctions() | Ito ibinabalik ang listahan ng mga function ng oras at petsa na available sa konektadong Database |
String getURL() | Ibinabalik nito ang URL para sa Database |
Boolean isReadOnly() | Ibinabalik nito kung ang database ay nasa read-only na mode |
Boolean supportsBatchUpdates() | Ito ay nagbabalik kung sinusuportahan ng database ang batch update |
Boolean supportsSavepoints() | Ibinabalik kung sinusuportahan ng Database ang Savepoints |
Boolean supportsStatementPooling() | Ibinabalik kung sinusuportahan ng Database ang Statement Pooling |
Boolean supportsStoredProcedures() | Ibinabalik nito kung sinusuportahan ng Database ang Stored procedures |
Boolean supportsOuterJoins() | Ito ay nagbabalik kung sinusuportahan ng database ang Outer Join |
Dito, naglista kami ng ilang mahahalagang paraan ng interface ng DatabaseMetaData. Maaari kang sumangguni saopisyal na site ng Oracle kung saan makikita mo ang lahat ng paraan na available sa interface ng DatabaseMetaData.
Halimbawa ng DatabaseMetaData:
package com.STH.JDBC; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; public class DatabaseMetaData_Example { public static void main(String[] args) throws ClassNotFoundException, SQLException { // TODO Auto-generated method stub Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE"); DatabaseMetaData dbmd = conn.getMetaData(); System.out.println("Using DatabaseMetaData"); System.out.println("Driver Name: " + dbmd.getDriverName()); System.out.println("Driver Version: "+ dbmd.getDriverVersion()); System.out.println("UserName of the Database: " + dbmd.getUserName()); System.out.println("Database Product Name:" + dbmd.getDatabaseProductName()); System.out.println("Database Product Version: " + dbmd.getDatabaseProductVersion()); System.out.println("List of String Functions in the Database: " + dbmd.getStringFunctions()); System.out.println("List of Time & Date functions in the Database: " + dbmd.getTimeDateFunctions()); System.out.println("URL of the Database: " + dbmd.getURL()); System.out.println("Database is read - only? " +dbmd.isReadOnly()); System.out.println("Support Batch Updates? " + dbmd.supportsBatchUpdates()); System.out.println("Support savepoints? " + dbmd.supportsSavepoints()); System.out.println("Support Statement Pooling? "+ dbmd.supportsStatementPooling()); System.out.println("Support Stored Procedures? " + dbmd.supportsStoredProcedures()); System.out.println("Support Outer Join? "+ dbmd.supportsOuterJoins()); } }
OUTPUT:
Paliwanag:
Sa programa sa itaas, ginamit/ ipinatupad namin ang getDriverName(), getDriverVersion() , getUserName(), getDatabaseProductName(), getDatabaseProductVersion(), getStringFunctions(), getTimeDateFunctions(), getURL(), isReadOnly(), supportsBatchUpdates(), supportsStatementPooling(), supportsSavepoints(), supportsStoredProcedures() and supportsOuts() mga paraan DatabaseMetaData Interface.
Mga dapat tandaan:
- Ang interface ng JDBC ResultSet ay ginagamit upang iimbak ang data mula sa database at gamitin ito sa aming Java Program.
- Maaari rin naming gamitin ang ResultSet upang i-update ang data gamit ang mga pamamaraan ng updateXXX().
- Itinuturo ng object ng ResultSet ang cursor bago ang unang hilera ng data ng resulta. Gamit ang susunod na() na pamamaraan, maaari tayong umulit sa pamamagitan ng ResultSet.
- Mayroon kaming mga paraan ng pag-navigate ng ResultSet upang higit pang lumipat sa object ng ResultSet
- Ginagamit ang ResultMetaData upang makakuha ng higit pang impormasyon tungkol sa ResultSet tulad ng pangalan ng column, bilang ng mga column, ang datatype ng column, atbp.
- Ginagamit ang DatabaseMetData upang makuha ang impormasyon tungkol sa database na aming ikinonekta
Mga Madalas Itanong
Q #1) Ano ang gamit ngResultSet?
Sagot: Ang ResultSet ay ginagamit upang iimbak at kunin ang data mula sa DB. Kapag ang executeQuery() na pamamaraan ay naisakatuparan, ibabalik nito ang ResultSet object. Magagamit namin ang object na ResultSet na iyon sa aming program para maisagawa ang logic.
Q #2) Paano tingnan kung walang laman ang ResultSet o wala?
Sagot: Walang mga paunang natukoy na pamamaraan tulad ng length(), size() na magagamit upang suriin ang IsResultSet Empty. Maaari naming gamitin ang susunod na() na paraan upang umulit at kung ito ay nagbabalik ng True, kung gayon ito ay walang laman, kung ito ay nagbalik ng False ay nangangahulugan na ang ResultSet ay walang laman.
Q #3) Posible bang ang ResultSet maaaring null?
Sagot: Hindi, ibinabalik ng executeQuery() method ang ResultSet object na maaaring hindi kailanman null.
Q #4) Ano ang naa-update na ResultSet?
Sagot: Ginagamit ang isang naa-update na object ng ResultSet upang i-update ang data sa column, magpasok ng data sa mga column at magtanggal ng mga row. Upang gawin ang ResultSet bilang isang naa-update, kailangan nating gawing sensitibo o hindi sensitibo ang uri ng scroll at ang uri ng CONCUR bilang naa-update.
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE.
Q #5) Paano makukuha ang pangalan ng Database na nakakonekta?
Sagot: Maaari naming gamitin ang getDatabaseProductName() method ng DatabaseMetaData object.
Konklusyon
Sa tutorial na ito, tinalakay namin kung ano ang ang mga interface ng ResultSet, ResultSetMetaData, at DatabaseMetaData at ang mahahalagang pamamaraan ng mga ito na karaniwang ginagamit sa mga programa ng JDBC. Nakita na rin naminkung paano i-update ang data sa DB gamit ang ResultSet. Ang ResultSetMetadata ay naglalaman ng impormasyon tungkol sa ResultSet gaya ng Pangalan ng Column, Column count, at iba pa.
Ang DatabaseMetaData ay naglalaman ng impormasyon ng Database.
Statement Interface
Statement statemnt1 = conn.createStatement(); ResultSet rs1 = statemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”);
PreparedStatement Interface
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”);
Maaari naming gumamit ng getX() na paraan upang makuha ang data ng mga column habang umuulit sa mga resulta kung saan X – ang datatype ng column. Maaari naming gamitin ang alinman sa Mga Pangalan ng Column o Index para makuha ang mga value gamit ang mga getX() na pamamaraan.
while(rs1.next()) { int empNum = rs1.getInt("empNum"); String lastName = rs1.getString("lastName"); String firstName = rs1.getString("firstName"); String email = rs1.getString("email"); String deptNum = rs1.getString("deptNum"); String salary = rs1.getString("salary"); System.out.println(empNum + "," +lastName+ "," +firstName+ "," +email +","+deptNum +"," +salary); }
Maaari rin naming banggitin ang index number ng Column sa halip na Column Name sa mga getX() na pamamaraan.
while(rs1.next()) { int empNum = rs1.getInt(1); String lastName = rs1.getString(2); String firstName = rs1.getString(3); String email = rs1.getString(4); String deptNum = rs1.getString(5); String salary = rs1.getString(6); System.out.println(empNum + "," +lastName+ "," +firstName+ "," +email +","+deptNum +"," +salary); }
Mga Uri ng ResultSet
Sa default, maaari nating ulitin ang data/mga halaga sa ResultSet na ibinalik bilang isang output ng naisagawang SQL statement sa direksyong pasulong. Maaari naming ulitin ang mga halaga sa ibang direksyon gamit ang Scrollable ResultSet. Maaari naming tukuyin ang uri at concurrency ng ResultSet habang gumagawa ng mga bagay na Statement, PreparedStatement, at CallableStatement.
May 3 uri sa ResultSet. Ang mga ito ay:
- TYPE_FORWARD_ONLY: Ito ang default na opsyon, kung saan gumagalaw ang cursor mula simula hanggang dulo ibig sabihin, sa pasulong na direksyon.
- TYPE_SCROLL_INSENSITIVE: Sa ganitong uri, gagawin nitong gumagalaw ang cursor sa parehong pasulong at paatras na direksyon. Kung gumawa kami ng anumang mga pagbabago sa data habang inuulit ang nakaimbak na data, hindi ito mag-a-update sa dataset kung may magbabago sa data sa DB. Dahil ang dataset ay may data mula sa oras na ibinalik ng SQL query angData.
- TYPE_SCROLL_SENSITIVE: Ito ay katulad ng TYPE_SCROLL_INSENSITIVE, ang pagkakaiba ay kung sinuman ang mag-a-update ng data pagkatapos ibalik ng SQL Query ang data, habang inuulit ito ay magpapakita ng mga pagbabago sa dataset.
ResultSet Concurrency
May 2 mode ng Concurrency sa ResultSet. Ang mga ito ay:
- ResultSet.CONCUR_READ_ONLY: Ito ang default na concurrency mode. Mababasa lang natin ang data sa ResultSet. Hindi naaangkop ang pag-update.
- ResultSet.CONCUR_UPDATABLE: Maaari naming i-update ang data sa object ng ResultSet.
Hindi sinusuportahan ng ilang database ang concurrency mode para sa lahat Mga uri ng ResultaSet. Sa sitwasyong iyon, kailangan naming suriin kung sinusuportahan ng mga ito ang aming gustong uri at concurrency mode gamit ang supportsResultSetConcurrency() na paraan.
Mga Paraan Sa ResultSet Interface
May 4 na kategorya ng mga pamamaraan ng ResultSet. Ang mga ito ay:
- Mga Paraan ng Pag-navigate
- Mga Paraan ng Getter
- Mga Paraan ng Setter
- Mga Sari-saring Paraan
Una, tatalakayin natin ang Mga Paraan ng Pag-navigate at pagkatapos ay lalayo pa.
#1) Mga Paraan ng Pag-navigate
Ginagamit ang paraang ito upang ilipat ang cursor sa paligid ng dataset.
- Boolean absolute(int row): Ginagamit ito upang ilipat ang cursor sa tinukoy na row na binanggit sa parameter at ibalik ang true kung matagumpay ang operasyon kung hindi ibalik ang false.
- Walang bisaafterLast(): Ginagawa nitong ilipat ang ResultSet cursor pagkatapos ng huling row.
- Void beforeFirst(): Ginagawa nitong ilipat ang ResultSet cursor bago ang unang row.
- Boolean first(): Ginagawa nitong ilipat ang ResultSet cursor sa unang row. Nagbabalik ito ng True kung matagumpay ang operasyon kung hindi False.
- Boolean last(): Ginagawa nitong ilipat ang ResultSet cursor sa huling row. Nagbabalik ito ng True kung matagumpay ang operasyon kung hindi False.
- Boolean next(): Ginagawa nitong lumipat ang ResultSet cursor sa susunod na row. Nagbabalik ito ng True kung marami pang record at False kung wala nang record.
- Boolean previous(): Ginagawa nitong ilipat ang ResultSet cursor sa nakaraang row. Nagbabalik ito ng True kung matagumpay ang operasyon kung hindi False.
- Boolean relative(): Inililipat nito ang cursor sa ibinigay na bilang ng mga row alinman sa pasulong o paatras na direksyon.
- Int getRow(): Ibinabalik nito ang kasalukuyang numero ng row na itinuturo ngayon ng ResultSet object.
- Void moveToCurrentRow(): Inilipat nito ang cursor pabalik sa kasalukuyang row kung ito ay kasalukuyang nasa insert row.
- Void moveToInsertRow(): Inililipat nito ang cursor sa partikular na row upang ipasok ang row sa Database. Naaalala nito ang kasalukuyang lokasyon ng cursor. Para magamit natin ang moveToCurrentRow() method para ilipat ang cursor sa kasalukuyang row pagkatapos ng insertion.
Sa tutorial na ito,lahat ng mga programa ay nakasulat sa Java. Gumamit kami ng bersyon ng Java 8 at Oracle DB.
>>Maaari mong i-download ang software ng Oracle mula dito
>>Maaari mong i-download ang bersyon 8 ng Java mula dito
Mayroong hakbang-hakbang na proseso ng pag-install ng Java.
JDBC ResultSet Halimbawang Programa:(Gumagamit ng mga paraan ng Nabigasyonal)
package com.STH.JDBC; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class ResultSet_Example { public static void main(String[] args) throws ClassNotFoundException { // TODO Auto-generated method stub //Select query String select_query = "select * from employee_details"; Class.forName("oracle.jdbc.driver.OracleDriver"); //Connecting to Oracle DB try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:X E")) { //Creating DatabaseMetaData object DatabaseMetaData dbmd = conn.getMetaData(); //Checking whether the driver supports scroll sensitive type and concur updatable boolean isSupportResultSetType = dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Creating prepared Statement PreparedStatement pstatemnt1 = conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet. CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(); //Moving the cursor to point first row rs.first(); System.out.println("FIRST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point last row rs.last(); System.out.println("LAST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point before first row rs.beforeFirst(); System.out.println("Cursor is pointing at before the first row. Use next() to move in forward direction"); //Moving the cursor to point first row using next() rs.next(); System.out.println("FIRST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point after last row rs.afterLast(); System.out.println("Cursor is pointing at after the last row. Use previous() to move in backward direction"); //Moving the cursor to point last row using previous() rs.previous(); System.out.println("LAST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point third row rs.absolute(3); System.out.println("Cursor is pointing at 3rd row"); System.out.println("THIRD ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point previous row of third row rs.relative(-1); System.out.println("Cursor is pointing to the 1 row previous to the 3rd row"); System.out.println("Second ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point 4th row after the 2nd row rs.relative(4); System.out.println("Cursor is pointing to the 4th row after the 2nd row"); System.out.println("SIXTH ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point current row System.out.println(" Current Row = " + rs.getRow()); } } catch (SQLException e) { e.printStackTrace(); } } }
OUTPUT:
Data sa Employee_details table
Paliwanag:
Sa programa sa itaas ipinatupad namin ang first(), last(), beforeFirst(), afterLast(), next( ), dati(), absolute(), relative() at getRow() na mga pamamaraan sa ResultSet. Upang magamit ang mga pamamaraang ito, itinakda namin ang mga value ng ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE sa paraan ng prepareStatement.
Susunod, tatalakayin natin kung ano ang Mga Paraan ng Getter sa ResultSet:
#2) Getter Methods
ResultSet ay nag-imbak ng data ng talahanayan mula sa Database. Ang mga pamamaraan ng getter ay ginagamit upang makuha ang mga halaga ng talahanayan sa ResultSet. Para diyan, kailangan nating ipasa ang alinman sa column Index value o Column Name.
Ang mga sumusunod ay ang getter method sa ResultSet:
- int getInt (int ColumnIndex): Ito ay ginagamit upang makuha ang halaga ng tinukoy na column Index bilang isang int na uri ng data.
- float getFloat(int ColumnIndex): Ito ay ginagamit upang makakuha ng ang halaga ng tinukoy na Index ng column bilang isang float na uri ng data.
- java.sql.dategetDate(int ColumnIndex): Ito ay ginagamit upang makuha ang halaga ng tinukoy na column Index bilang isang halaga ng petsa.
- int getInt(String ColumnName): Ginagamit ito upang makuha ang halaga ng tinukoy na column bilang isang int na uri ng data.
- float getFloat(String ColumnName): Ginagamit ito upang makuha ang value ng tinukoy na column bilang isang float na uri ng data.
- Java.sql.date getDate(String ColumnName): Ito ay ginagamit upang makuha ang halaga ng tinukoy na column bilang isang value ng petsa.
May mga getter method para sa lahat ng primitive na uri ng data (Boolean, long, double) at String din sa ResultSet interface. Makakakuha din tayo ng array at binary na uri ng data mula sa Database. Mayroon din itong mga pamamaraan para diyan.
#3) Mga Paraan ng Setter/Updater
Maaari naming i-update ang halaga sa Database gamit ang mga pamamaraan ng ResultSet Updater. Ito ay katulad ng mga pamamaraan ng Getter, ngunit dito kailangan nating ipasa ang mga halaga/ data para sa partikular na column upang ma-update sa Database.
Ang mga sumusunod ay ang mga pamamaraan ng updater sa ResultSet:
- void updateInt(int ColumnIndex, int Value): Ito ay ginagamit upang i-update ang value ng tinukoy na column Index na may int value.
- void updateFloat(int ColumnIndex, float f): Ginagamit ito para i-update ang value ng tinukoy na column Index na may float value.
- void updateDate(int ColumnIndex, Date d): Ito ay ginagamit upang i-update ang halaga ng tinukoy na Index ng columnna may value ng petsa.
- void updateInt(String ColumnName, int Value): Ginagamit ito upang i-update ang value ng tinukoy na column na may ibinigay na int value.
- void updateFloat(String ColumnName, float f): Ginagamit ito para i-update ang value ng tinukoy na column na may ibinigay na float value.
- Java.sql.date getDate(String ColumnName): Ginagamit ito upang i-update ang halaga ng tinukoy na column na may ibinigay na halaga ng petsa.
May mga paraan ng Updater para sa lahat ng primitive na uri ng data (Boolean, long, double) at String din sa interface ng ResultSet.
I-update lang ng mga pamamaraan ng Updater ang data sa object ng ResultSet. Ia-update ang mga value sa DB pagkatapos tawagan ang insertRow o updateRow na paraan.
Pag-update ng Row:
Maaari naming i-update ang data nang sunud-sunod sa pamamagitan ng pagtawag sa mga pamamaraan ng updateX() , pagpasa sa pangalan ng column o index, at mga value na ia-update. Maaari naming gamitin ang anumang uri ng data bilang kapalit ng X sa paraan ng updateX. Hanggang ngayon, na-update namin ang data sa object ng ResultSet. Para i-update ang data sa DB, kailangan nating tawagan ang updateRow() method.
Paglalagay ng Row:
Kailangan nating gamitin ang moveToInsertRow() para ilipat ang cursor para magpasok ng bagong row. Natalakay na namin ito sa seksyong Mga paraan ng pag-navigate. Susunod, kailangan naming tawagan ang updateX() na paraan upang idagdag ang data sa row. Dapat kaming magbigay ng data para sa lahat ng mga column kung hindi man gagamitin nito ang default na halaga ng partikular na iyoncolumn.
Pagkatapos i-update ang data, kailangan naming tawagan ang insertRow() method. Pagkatapos ay gamitin ang moveToCurrentRow() na paraan, upang ibalik ang posisyon ng cursor sa row na kinaroroonan namin bago kami nagsimulang magpasok ng bagong row.
Halimbawa ng ResultSet:
package com.STH.JDBC; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class ResultSet_Example1 { public static void main(String[] args) throws ClassNotFoundException { // TODO Auto-generated method stub String select_query = "select empnum,lastName,firstName from employee_details"; String insert_query = "insert into employee_details values(?,?,?,?,?,?)"; Class.forName("oracle.jdbc.driver.OracleDriver"); //Connecting to Oracle DB try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE")) { //Creating DatabaseMetaData object DatabaseMetaData dbmd = conn.getMetaData(); //Checking whether the driver supports scroll insensitive type and concur updatable boolean isSupportResultSetType = dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Creating prepared Statement PreparedStatement pstatemnt1 = conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(select_query); //Moving the cursor to point last row of the table rs.last(); System.out.println("LAST ROW: Before inserting new Employee"); System.out.println("LAST ROW: EMPNUM = " + rs.getInt(1)); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); // Setting the values to insert in the EMPLOYEE_DETAILS Table //Moving the cursor to point insert a row to table rs.moveToInsertRow(); //Update EMPNUM value rs.updateInt(1, 1017); //Update LAST NAME value rs.updateString(2, "Bond"); //Update FIRST NAME value rs.updateString(3, "James"); //Insert a new row rs.insertRow(); //Moving the cursor to point 5th row rs.absolute(5); System.out.println("Befor Updating EMPNUM of the 5th ROW"); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); System.out.println(" Updating EMP id of the 5th EMPLOYEE"); //Updating EMPNUM of 5th row rs.updateInt(1,3005); rs.updateRow(); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point last row rs.last(); System.out.println("LAST ROW: EMPNUM = " + rs.getInt(1)); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); } } catch (SQLException e) { e.printStackTrace(); } } }
OUTPUT:
Paliwanag:
Sa programa sa itaas kung ano ang ginawa namin ay una, inimbak namin ang data ng Employee_details table sa ResultSet object gamit ang SELECT query. Pagkatapos, ipinakita namin ang data ng huling hilera sa talahanayan ng employee_details gamit ang huling() na paraan ng ResultSet. Ang moveToInsertRow() method ay ginagawang ituro ng cursor ang kasalukuyang row, ngayon ang kasalukuyang row ay ang huling row.
updateXXX()paraan na ginamit upang i-update ang mga value sa row at insertRow() method ay nagpasok ng data sa isang bagong hilera. Gamit ang absolute() na pamamaraan, ginawa namin ang cursor para tumuro sa ika-5 hilera. Ang pamamaraan ng UpdateInt() ay ginamit upang i-update ang EMPNUM gamit ang isang bagong id ng ika-5 empleyado sa talahanayan. Pagkatapos nito, ipinakita ang data upang suriin kung ang EMPNUM ay na-update o hindi.
Ginawa ang cursor upang ituro ang huling row ng talahanayan gamit ang last() at ipinakita ito. Upang maisagawa ang logic sa itaas, kailangan nating itakda ang ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE na mga halaga sa paraan ng prepareStatement.
#4) Mga Sari-saring Paraan
- void close(): Ito ay ginagamit upang isara ang ResultSet instance at palayain angmga mapagkukunang nauugnay sa instance ng ResultSet.
- ResultSetMetaData getMetaData(): Ibinabalik nito ang ResultSetMetaData Instance. Mayroon itong impormasyon tungkol sa uri at pag-aari ng mga column ng output ng query. Malalaman natin ang higit pa tungkol sa ResultSetMetaData sa susunod na seksyon.
ResultSetMetaData
Ano ang Metadata?
Metadata nangangahulugang data tungkol sa datos. Gamit ang interface na ito, makakakuha kami ng higit pang impormasyon tungkol sa ResultSet. Ito ay magagamit sa java.sql package. Ang bawat ResultSet object ay nauugnay sa isang ResultSetMetaData object.
Ang object na ito ay magkakaroon ng mga detalye ng mga katangian ng mga column tulad ng datatype ng column, pangalan ng column, bilang ng mga column, pangalan ng talahanayan, pangalan ng schema, atbp., Makukuha natin ang ResultSetMetaData object gamit ang getMetaData() method ng ResultSet.
Syntax ng ResultSetMetaData:
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”); ResultSetMetaData rsmd = rs.getMetaData();
Mahahalagang paraan ng interface ng ResultSetMetaData:
Pangalan ng Paraan | Paglalarawan |
---|---|
String getColumnName(int column) | Ibinabalik nito ang pangalan ng column ng partikular na column |
String getColumnTypeName(int column) | Ibinabalik nito ang datatype ng partikular na column na naipasa namin bilang parameter |
String getTableName(int column) | Ibinabalik nito ang pangalan ng table ng column |
String getSchemaName(int column) | Ito |