Tutorial ini menerangkan cara menggunakan JDBC ResultSet untuk mendapatkan semula data. Kami juga akan mempelajari tentang antara muka ResultSetMetaData dan DatabaseMetaData dengan contoh:
Dalam tutorial JDBC DriverManager siri tutorial JDBC , kami mempelajari cara menggunakan JDBC DriverManager dan kaedahnya, JDBC PreparedStatement dalam aplikasi Java.
Dalam tutorial ini, kita akan membincangkan baki antara muka dalam JDBC. Kami telah merangkumi antara muka Statement, PreparedStatement dan CallableStatement dalam tutorial kami yang terdahulu.
Di sini, kami akan mempelajari tentang antara muka JDBC ResultSet, ResultSetMetaData dan DatabaseMetaData, kaedah mereka dan cara menggunakan kaedah dalam program Java.
Antara Muka ResultSet JDBC
Antara Muka ResultSet terdapat dalam pakej java.sql. Ia digunakan untuk menyimpan data yang dikembalikan daripada jadual pangkalan data selepas pelaksanaan pernyataan SQL dalam Program Java. Objek ResultSet mengekalkan titik kursor pada data hasil. Secara lalai, kursor diletakkan sebelum baris pertama data hasil.
Kaedah next() digunakan untuk mengalihkan kursor ke kedudukan seterusnya dalam arah hadapan. Ia akan mengembalikan FALSE jika tiada lagi rekod. Ia mendapatkan semula data dengan memanggil kaedah executeQuery() menggunakan mana-mana objek pernyataan. Ia mungkin objek Statement atau PreparedStatement atau CallableStatement. PreparedStatement, danmengembalikan nama skema jadual lajur
ResultSetMetaData Contoh
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:
Penjelasan:
Dalam atur cara di atas, kami telah melaksanakan kaedah getColumnCount(),getColumnName(), getColumnTypeName(), getTableName() dan getSchemaName() dalam antara muka ResultSetMetaData.
DatabaseMetaData
Antara muka DatabaseMetaData memberikan maklumat tentang Pangkalan Data seperti Nama Pangkalan Data, versi Pangkalan Data dan sebagainya.
Kaedah penting antara muka DatabaseMetaData:
Nama Kaedah | Penerangan |
---|---|
String getDriverName() | Ia akan mengembalikan nama pemacu JDBC yang kami gunakan dalam program Java kami |
String getDriverVersion() | Ia mengembalikan nombor versi pemacu JDBC |
String getUserName() | Ia mengembalikan nama pengguna Pangkalan Data yang kami gunakan |
String getDatabaseProductName() | Ia mengembalikan nama Pangkalan Data yang kami adamenggunakan |
String getDatabaseProductVersion() | Ia mengembalikan nombor versi Pangkalan Data yang kami gunakan |
ResultSet getSchemas() | Ia mengembalikan nama skema yang tersedia dalam Pangkalan Data yang disambungkan |
String getStringFunctions() | Ia mengembalikan senarai fungsi rentetan yang tersedia dalam Pangkalan Data yang disambungkan |
String getTimeDateFunctions() | Ia mengembalikan senarai fungsi masa dan tarikh yang tersedia dalam Pangkalan Data yang disambungkan |
String getURL() | Ia mengembalikan URL untuk Pangkalan Data |
Boolean isReadOnly() | Ia mengembalikan sama ada pangkalan data berada dalam mod baca sahaja |
Boolean supportsBatchUpdates() | Ia mengembalikan sama ada pangkalan data menyokong kemas kini kelompok |
Boolean supportsSavepoints() | Ia mengembalikan sama ada Pangkalan Data menyokong Savepoints |
Boolean supportsStatementPooling() | Ia mengembalikan sama ada Pangkalan Data menyokong Statement Pooling |
Boolean supportsStoredProcedures() | Ia mengembalikan sama ada Pangkalan Data menyokong prosedur Tersimpan |
Boolean menyokongOuterJoins() | Ia mengembalikan sama ada pangkalan data menyokong Outer Join |
Di sini, kami menyenaraikan beberapa kaedah penting antara muka Pangkalan DataMetaData. Anda boleh merujuk kepadatapak rasmi Oracle di mana anda boleh melihat semua kaedah yang tersedia dalam antara muka DatabaseMetaData.
Contoh Pangkalan DataMetaData:
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:
Penjelasan:
Dalam program di atas, kami telah menggunakan/melaksanakan getDriverName(), getDriverVersion() . Antara Muka Pangkalan DataMetaData.
Perkara yang perlu diambil perhatian:
- Antara muka JDBC ResultSet digunakan untuk menyimpan data daripada pangkalan data dan menggunakannya dalam Program Java kami.
- Kami juga boleh menggunakan ResultSet untuk mengemas kini data menggunakan kaedah updateXXX().
- Objek ResultSet menghalakan kursor sebelum baris pertama data hasil. Dengan menggunakan kaedah next(), kita boleh lelaran melalui ResultSet.
- Kami mempunyai kaedah navigasi ResultSet untuk bergerak lebih jauh dalam objek ResultSet
- ResultMetaData digunakan untuk mendapatkan maklumat lanjut tentang ResultSet seperti nama lajur, bilangan lajur, jenis data lajur, dsb.
- DatabaseMetData digunakan untuk mendapatkan maklumat tentang pangkalan data yang telah kami sambungkan
Soalan Lazim
S #1) Apakah kegunaanResultSet?
Jawapan: ResultSet digunakan untuk menyimpan dan mendapatkan semula data daripada DB. Apabila kaedah executeQuery() telah dilaksanakan, ia akan mengembalikan objek ResultSet. Kami boleh menggunakan objek ResultSet itu dalam program kami untuk melaksanakan logik.
S #2) Bagaimana untuk menyemak sama ada ResultSet kosong atau tidak?
Jawapan: Tiada kaedah yang dipratentukan seperti length(), size() tersedia untuk menyemak IsResultSet Empty. Kita boleh menggunakan kaedah next() untuk lelaran dan jika ia mengembalikan True, maka ia tidak kosong, jika ia mengembalikan False bermakna ResultSet kosong.
S #3) Adakah mungkin ResultSet mungkin batal?
Jawapan: Tidak, kaedah executeQuery() mengembalikan objek ResultSet yang mungkin tidak pernah menjadi batal.
S #4) Apakah itu ResultSet boleh dikemas kini?
Jawapan: Objek ResultSet boleh dikemas kini digunakan untuk mengemas kini data dalam lajur, memasukkan data dalam lajur dan memadam baris. Untuk menjadikan ResultSet sebagai yang boleh dikemas kini, kita perlu menjadikan jenis tatal sebagai sensitif atau tidak sensitif dan jenis CONCUR sebagai boleh dikemas kini.
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE.
S #5) Bagaimana untuk mendapatkan nama Pangkalan Data yang telah disambungkan?
Jawapan: Kita boleh menggunakan kaedah getDatabaseProductName() objek DatabaseMetaData.
Kesimpulan
Dalam tutorial ini, kita telah membincangkan perkara yang antara muka ResultSet, ResultSetMetaData dan DatabaseMetaData serta kaedah pentingnya yang biasa digunakan dalam program JDBC. Kami juga telah melihatbagaimana untuk mengemas kini data dalam DB menggunakan ResultSet. ResultSetMetadata mengandungi maklumat tentang ResultSet seperti Nama Lajur, kiraan Lajur dan sebagainya.
DatabaseMetaData mengandungi maklumat Pangkalan Data.
Antara Muka Penyata
Statement statemnt1 = conn.createStatement(); ResultSet rs1 = statemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”);
Antara Muka PreparedStatement
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”);
Kita boleh gunakan kaedah getX() untuk mendapatkan data lajur sambil mengulangi hasil dengan X – ialah jenis data lajur. Kita boleh menggunakan sama ada Nama Lajur atau Indeks untuk mendapatkan nilai menggunakan kaedah getX().
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); }
Kami juga boleh menyebut nombor indeks Lajur dan bukannya Nama Lajur dalam kaedah getX().
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); }
ResultSet Types
Secara lalai, kita boleh mengulang data/nilai dalam ResultSet yang telah dikembalikan sebagai output pernyataan SQL yang dilaksanakan dalam arah hadapan. Kita boleh mengulangi nilai ke arah lain menggunakan Scrollable ResultSet. Kami boleh menentukan jenis dan konkurensi ResultSet semasa membuat objek Statement, PreparedStatement dan CallableStatement.
Terdapat 3 jenis dalam ResultSet. Ia adalah:
- TYPE_FORWARD_ONLY: Ia ialah pilihan lalai, di mana kursor bergerak dari mula ke akhir iaitu ke arah hadapan.
- TYPE_SCROLL_INSENSITIVE: Dalam jenis ini, ia akan membuatkan kursor bergerak dalam kedua-dua arah ke hadapan dan ke belakang. Jika kami membuat sebarang perubahan dalam data semasa mengulangi data yang disimpan, ia tidak akan mengemas kini dalam set data jika sesiapa menukar data dalam DB. Kerana set data mempunyai data dari masa pertanyaan SQL mengembalikannyaData.
- TYPE_SCROLL_SENSITIVE: Ia adalah serupa dengan TYPE_SCROLL_INSENSITIVE, perbezaannya adalah jika sesiapa mengemas kini data selepas SQL Query telah mengembalikan data, sambil mengulanginya akan mencerminkan perubahan pada set data.
ResultSet Concurrency
Terdapat 2 mod Concurrency dalam ResultSet. Ia adalah:
- ResultSet.CONCUR_READ_ONLY: Ia ialah mod konkurensi lalai. Kami hanya boleh membaca data dalam ResultSet. Kemas kini tidak berkenaan.
- ResultSet.CONCUR_UPDATABLE: Kami boleh mengemas kini data dalam objek ResultSet.
Sesetengah pangkalan data tidak menyokong mod konkurensi untuk semua Jenis ResultSet. Dalam kes itu, kita perlu menyemak sama ada mereka menyokong jenis yang diingini dan mod konkurensi menggunakan kaedah supportsResultSetConcurrency().
Kaedah Dalam Antara Muka ResultSet
Terdapat 4 kategori kaedah ResultSet. Ia adalah:
- Kaedah Navigasi
- Kaedah Getter
- Kaedah Penetap
- Kaedah Pelbagai
Mula-mula, kita akan membincangkan Kaedah Navigasi dan kemudian akan bergerak lebih jauh.
#1) Kaedah Navigasi
Kaedah ini digunakan untuk menggerakkan kursor di sekitar set data.
- Boolean absolute(int row): Ia digunakan untuk mengalihkan kursor ke baris yang ditentukan yang disebut dalam parameter dan mengembalikan benar jika operasi berjaya jika tidak mengembalikan palsu.
- BatalafterLast(): Ia menjadikan kursor ResultSet bergerak selepas baris terakhir.
- Void beforeFirst(): Ia menjadikan kursor ResultSet bergerak sebelum baris pertama.
- Boolean first(): Ia menjadikan kursor ResultSet beralih ke baris pertama. Ia mengembalikan True jika operasi berjaya atau False.
- Boolean last(): Ia menjadikan kursor ResultSet beralih ke baris terakhir. Ia mengembalikan True jika operasi berjaya atau False.
- Boolean next(): Ia menjadikan kursor ResultSet beralih ke baris seterusnya. Ia mengembalikan True jika terdapat lebih banyak rekod dan False jika tiada lagi rekod.
- Boolean previous(): Ia menjadikan kursor ResultSet beralih ke baris sebelumnya. Ia mengembalikan True jika operasi berjaya atau False.
- Boolean relative(): Ia menggerakkan kursor ke bilangan baris yang diberikan sama ada dalam arah ke hadapan atau ke belakang.
- Int getRow(): Ia mengembalikan nombor baris semasa yang ditunjukkan oleh objek ResultSet sekarang.
- Void moveToCurrentRow(): Ia menggerakkan kursor kembali ke baris semasa jika ia berada dalam baris sisip pada masa ini.
- Void moveToInsertRow(): Ia menggerakkan kursor ke baris tertentu untuk memasukkan baris ke dalam Pangkalan Data. Ia mengingati lokasi kursor semasa. Jadi kita boleh menggunakan kaedah moveToCurrentRow() untuk mengalihkan kursor ke baris semasa selepas sisipan.
Dalam tutorial ini,semua program ditulis dalam Java. Kami telah menggunakan versi Java 8 dan Oracle DB.
>>Anda boleh memuat turun perisian Oracle dari sini
>>Anda boleh memuat turun Java versi 8 dari sini
Ia mempunyai proses pemasangan Java langkah demi langkah.
JDBC ResultSet Contoh Program:(Menggunakan kaedah Navigasi)
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 dalam jadual Employee_details
Penjelasan:
Dalam program di atas kami telah melaksanakan yang pertama(), terakhir(), sebelumFirst(), selepasLast(), seterusnya( ), kaedah sebelumnya(), absolute(), relative() dan getRow() dalam ResultSet. Untuk menggunakan kaedah ini, kami menetapkan nilai ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE dalam kaedah prepareStatement.
Seterusnya, kami akan membincangkan apakah Kaedah Getter dalam ResultSet:
#2) Kaedah Getter
ResultSet telah menyimpan data jadual daripada Pangkalan Data. Kaedah Getter digunakan untuk mendapatkan nilai jadual dalam ResultSet. Untuk itu, kita perlu lulus sama ada nilai Indeks lajur atau Nama Lajur.
Berikut ialah kaedah getter dalam ResultSet:
- int getInt (int ColumnIndex): Ia digunakan untuk mendapatkan nilai Indeks lajur yang ditentukan sebagai jenis data int.
- float getFloat(int ColumnIndex): Ia digunakan untuk mendapatkan nilai Indeks lajur yang ditentukan sebagai jenis data terapung.
- java.sql.dategetDate(int ColumnIndex): Ia digunakan untuk mendapatkan nilai Indeks lajur yang ditentukan sebagai nilai tarikh.
- int getInt(String ColumnName): Ia digunakan untuk mendapatkan nilai lajur yang ditentukan sebagai jenis data int.
- float getFloat(String ColumnName): Ia digunakan untuk mendapatkan nilai lajur yang ditentukan sebagai jenis data terapung.
- Java.sql.date getDate(String ColumnName): Ia digunakan untuk mendapatkan nilai lajur yang ditentukan sebagai nilai tarikh.
Terdapat kaedah getter untuk semua jenis data primitif (Boolean, long, double) dan String juga dalam antara muka ResultSet. Kita boleh mendapatkan tatasusunan dan jenis data binari juga daripada Pangkalan Data. Ia juga mempunyai kaedah untuk itu.
#3) Kaedah Setter/Updater
Kami boleh mengemas kini nilai dalam Pangkalan Data menggunakan kaedah ResultSet Updater. Ia serupa dengan kaedah Getter, tetapi di sini kita perlu menghantar nilai/ data untuk lajur tertentu untuk dikemas kini dalam Pangkalan Data.
Berikut ialah kaedah pengemas kini dalam ResultSet:
- void updateInt(int ColumnIndex, int Value): Ia digunakan untuk mengemas kini nilai lajur Indeks yang ditentukan dengan nilai int.
- kosong updateFloat(int ColumnIndex, float f): Ia digunakan untuk mengemas kini nilai Indeks lajur yang ditentukan dengan nilai float.
- void updateDate(int ColumnIndex, Date d): Ia digunakan untuk mengemas kini nilai Indeks lajur yang ditentukandengan nilai tarikh.
- void updateInt(String ColumnName, int Value): Ia digunakan untuk mengemas kini nilai lajur yang ditentukan dengan nilai int yang diberikan.
- void updateFloat(String ColumnName, float f): Ia digunakan untuk mengemas kini nilai lajur yang ditentukan dengan nilai float yang diberikan.
- Java.sql.date getDate(String ColumnName): Ia digunakan untuk mengemas kini nilai lajur yang ditentukan dengan nilai tarikh yang diberikan.
Terdapat kaedah Updater untuk semua jenis data primitif (Boolean, long, double) dan String juga dalam antara muka ResultSet.
Kaedah pengemas kini hanya mengemas kini data dalam objek ResultSet. Nilai akan dikemas kini dalam DB selepas memanggil kaedah insertRow atau updateRow.
Mengemas kini Baris:
Kami boleh mengemas kini data dalam satu baris dengan memanggil kaedah updateX() , menghantar nama lajur atau indeks dan nilai untuk dikemas kini. Kami boleh menggunakan sebarang jenis data sebagai ganti X dalam kaedah updateX. Sehingga kini, kami telah mengemas kini data dalam objek ResultSet. Untuk mengemas kini data dalam DB, kita perlu memanggil kaedah updateRow().
Memasukkan Baris:
Kita perlu menggunakan moveToInsertRow() untuk menggerakkan kursor untuk memasukkan baris baharu. Kami telah membincangkan perkara ini dalam bahagian Kaedah navigasi. Seterusnya, kita perlu memanggil kaedah updateX() untuk menambah data pada baris. Kita harus menyediakan data untuk semua lajur, jika tidak, ia akan menggunakan nilai lalai bagi lajur tersebutlajur.
Selepas mengemas kini data, kita perlu memanggil kaedah insertRow(). Kemudian gunakan kaedah moveToCurrentRow(), untuk mengembalikan kedudukan kursor ke baris yang kita berada sebelum kita mula memasukkan baris baharu.
Contoh 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:
Penjelasan:
Dalam atur cara di atas apa yang telah kami lakukan ialah pertama, kami menyimpan data jadual Employee_details dalam objek ResultSet menggunakan pertanyaan SELECT. Kemudian, kami memaparkan data baris terakhir dalam jadual employee_details menggunakan kaedah last() ResultSet. kaedah moveToInsertRow() menjadikan kursor menghalakan baris semasa, kini baris semasa ialah baris terakhir.
kaedah kemas kiniXXX() yang digunakan untuk mengemas kini nilai ke baris dan kaedah insertRow() telah memasukkan data dalam baris baru. Menggunakan kaedah absolute(), kami membuat kursor untuk menunjuk ke baris ke-5. Kaedah UpdateInt() telah digunakan untuk mengemas kini EMPNUM dengan id baharu pekerja ke-5 dalam jadual. Selepas itu, memaparkan data untuk menyemak sama ada EMPNUM dikemas kini atau tidak.
Buat kursor untuk menghalakan baris terakhir jadual menggunakan last() dan memaparkannya. Untuk melaksanakan logik di atas, kita perlu menetapkan nilai ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE dalam kaedah prepareStatement.
#4) Kaedah Pelbagai
- void close(): Ia digunakan untuk menutup contoh ResultSet dan membebaskansumber yang dikaitkan dengan contoh ResultSet.
- ResultSetMetaData getMetaData(): Ia mengembalikan Contoh ResultSetMetaData. Ia mempunyai maklumat tentang jenis dan sifat lajur keluaran pertanyaan. Kami akan mengetahui lebih lanjut tentang ResultSetMetaData dalam bahagian seterusnya.
ResultSetMetaData
Apakah Metadata?
Metadata bermaksud data tentang data. Menggunakan antara muka ini, kami akan mendapat lebih banyak maklumat tentang ResultSet. Ia tersedia dalam pakej java.sql. Setiap objek ResultSet dikaitkan dengan satu objek ResultSetMetaData.
Objek ini akan mempunyai butiran sifat lajur seperti jenis data lajur, nama lajur, bilangan lajur, nama jadual, nama skema, dsb., Kita boleh mendapatkan objek ResultSetMetaData menggunakan kaedah getMetaData() ResultSet.
Sintaks ResultSetMetaData:
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”); ResultSetMetaData rsmd = rs.getMetaData();
Kaedah penting antara muka ResultSetMetaData:
Nama Kaedah | Penerangan |
---|---|
String getColumnName(int column) | Ia mengembalikan nama lajur lajur tertentu |
String getColumnTypeName(int column) | Ia mengembalikan jenis data bagi lajur tertentu yang telah kami lalukan sebagai parameter |
String getTableName(int column) | Ia mengembalikan nama jadual lajur |
String getSchemaName(int column) | Ia |