ការបង្រៀននេះពន្យល់ពីរបៀបប្រើ JDBC ResultSet ដើម្បីទាញយកទិន្នន័យ។ យើងក៏នឹងសិក្សាផងដែរអំពីចំណុចប្រទាក់ ResultSetMetaData និង DatabaseMetaData ជាមួយនឹងឧទាហរណ៍៖
នៅក្នុងមេរៀន JDBC DriverManager នៃ JDBC tutorial series យើងបានរៀនពីរបៀបប្រើ JDBC DriverManager និងវិធីសាស្រ្តរបស់វា JDBC PreparedStatement នៅក្នុងកម្មវិធី Java។
នៅក្នុងមេរៀននេះ យើងនឹងពិភាក្សាអំពីចំណុចប្រទាក់ដែលនៅសល់នៅក្នុង JDBC ។ យើងបានគ្របដណ្តប់លើចំណុចប្រទាក់ Statement, PreparedStatement និង CallableStatement នៅក្នុងការបង្រៀនពីមុនរបស់យើង។
នៅទីនេះ យើងនឹងសិក្សាអំពី JDBC ResultSet, ResultSetMetaData និង DatabaseMetaData interfaces វិធីសាស្រ្តរបស់ពួកគេ និងរបៀបប្រើវិធីសាស្រ្តក្នុងកម្មវិធី Java។
JDBC ResultSet Interface
ResultSet Interface មាននៅក្នុងកញ្ចប់ java.sql។ វាត្រូវបានប្រើដើម្បីរក្សាទុកទិន្នន័យដែលត្រូវបានត្រឡប់ពីតារាងមូលដ្ឋានទិន្នន័យបន្ទាប់ពីការប្រតិបត្តិសេចក្តីថ្លែងការណ៍ SQL ក្នុងកម្មវិធី Java ។ វត្ថុនៃ ResultSet រក្សាចំណុចទស្សន៍ទ្រនិចនៅទិន្នន័យលទ្ធផល។ តាមលំនាំដើម ទីតាំងទស្សន៍ទ្រនិចនៅពីមុខជួរទីមួយនៃទិន្នន័យលទ្ធផល។
វិធីសាស្ត្របន្ទាប់ () ត្រូវបានប្រើដើម្បីផ្លាស់ទីទស្សន៍ទ្រនិចទៅទីតាំងបន្ទាប់ក្នុងទិសដៅទៅមុខ។ វានឹងត្រឡប់ FALSE ប្រសិនបើមិនមានកំណត់ត្រាទៀតទេ។ វាទាញយកទិន្នន័យដោយហៅវិធីសាស្ត្រ executeQuery() ដោយប្រើវត្ថុសេចក្តីថ្លែងការណ៍ណាមួយ។ វាអាចជា Statement ឬ PreparedStatement ឬ CallableStatement object។ សេចក្តីថ្លែងការណ៍រៀបចំ និងត្រឡប់ឈ្មោះគ្រោងការណ៍នៃតារាងជួរឈរ
លទ្ធផលSetMetaData ឧទាហរណ៍
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៖
ការពន្យល់៖
នៅក្នុងកម្មវិធីខាងលើ យើងបានអនុវត្ត getColumnCount(),getColumnName(), getColumnTypeName(), getTableName() និង getSchemaName() នៅក្នុងចំណុចប្រទាក់ ResultSetMetaData។
DatabaseMetaData
ចំណុចប្រទាក់ DatabaseMetaData ផ្តល់ព័ត៌មានអំពីមូលដ្ឋានទិន្នន័យដូចជា ឈ្មោះមូលដ្ឋានទិន្នន័យ កំណែមូលដ្ឋានទិន្នន័យ ជាដើម។
វិធីសាស្ត្រសំខាន់ៗនៃចំណុចប្រទាក់ DatabaseMetaData៖
ឈ្មោះវិធីសាស្រ្ត | ការពិពណ៌នា27 |
---|---|
String getDriverName() | វានឹងបង្ហាញឈ្មោះរបស់កម្មវិធីបញ្ជា JDBC ដែលយើងកំពុងប្រើនៅក្នុងកម្មវិធី Java របស់យើង |
String getDriverVersion() | វាត្រឡប់លេខកំណែកម្មវិធីបញ្ជា JDBC |
String getUserName() | វាត្រឡប់ឈ្មោះអ្នកប្រើប្រាស់នៃមូលដ្ឋានទិន្នន័យដែលយើងកំពុងប្រើ |
ខ្សែអក្សរ getDatabaseProductName() | វាត្រឡប់ ឈ្មោះរបស់ Database ដែលយើងជាដោយប្រើ |
String getDatabaseProductVersion() | វាត្រឡប់លេខកំណែនៃមូលដ្ឋានទិន្នន័យដែលយើងកំពុងប្រើ |
ResultSet getSchemas() | វាត្រឡប់ឈ្មោះនៃគ្រោងការណ៍ដែលមាននៅក្នុងមូលដ្ឋានទិន្នន័យដែលបានតភ្ជាប់ |
String getStringFunctions() | វាត្រឡប់បញ្ជីមុខងារខ្សែអក្សរដែលមាននៅក្នុងមូលដ្ឋានទិន្នន័យដែលបានតភ្ជាប់ |
String getTimeDateFunctions() | វា ត្រឡប់បញ្ជីមុខងារពេលវេលា និងកាលបរិច្ឆេទដែលមាននៅក្នុងមូលដ្ឋានទិន្នន័យដែលបានតភ្ជាប់ |
String getURL() | វាត្រឡប់ URL សម្រាប់មូលដ្ឋានទិន្នន័យ |
Boolean isReadOnly() | វាត្រឡប់ថាតើមូលដ្ឋានទិន្នន័យស្ថិតនៅក្នុងរបៀបបានតែអានទេ |
Boolean supportsBatchUpdates() | វាត្រឡប់ថាតើ database supports batch updates |
Boolean supportsSavepoints() | វាត្រឡប់ថាតើ Database គាំទ្រ Savepoints |
Boolean supportsStatementPooling() | វាត្រឡប់ថាតើ Database គាំទ្រ Statement Pooling |
Boolean supportsStoredProcedures() | វាត្រឡប់ថាតើមូលដ្ឋានទិន្នន័យគាំទ្រដំណើរការដែលបានរក្សាទុកឬអត់ |
Boolean supportsOuterJoins() | វាត្រឡប់ថាតើមូលដ្ឋានទិន្នន័យគាំទ្រ Outer Join |
នៅទីនេះ យើងបានរាយបញ្ជីវិធីសាស្រ្តសំខាន់ៗមួយចំនួននៃចំណុចប្រទាក់ DatabaseMetaData។ អ្នកអាចយោងទៅគេហទំព័រផ្លូវការរបស់ Oracle ដែលអ្នកអាចមើលឃើញវិធីសាស្រ្តទាំងអស់ដែលមាននៅក្នុងចំណុចប្រទាក់ DatabaseMetaData។
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៖
ការពន្យល់៖
នៅក្នុងកម្មវិធីខាងលើ យើងបានប្រើប្រាស់/អនុវត្ត getDriverName(), getDriverVersion() , getUserName(), getDatabaseProductName(), getDatabaseProductVersion(), getStringFunctions(), getTimeDateFunctions(), getURL(), isReadOnly(), supportsBatchUpdates(), supportsStatementPooling(), supportsSavepoints(), supportsStoredProcedures)() ចំណុចប្រទាក់ DatabaseMetaData ។
ចំណុចដែលត្រូវកត់សម្គាល់៖
- ចំណុចប្រទាក់ JDBC ResultSet ត្រូវបានប្រើដើម្បីរក្សាទុកទិន្នន័យពីមូលដ្ឋានទិន្នន័យ ហើយប្រើវានៅក្នុងកម្មវិធី Java របស់យើង។
- យើងក៏អាចប្រើ ResultSet ដើម្បីធ្វើបច្ចុប្បន្នភាពទិន្នន័យដោយប្រើវិធីសាស្រ្ត updateXXX()។
- ResultSet object ចង្អុលទស្សន៍ទ្រនិចនៅពីមុខជួរទីមួយនៃទិន្នន័យលទ្ធផល។ ដោយប្រើវិធីសាស្ត្របន្ទាប់ () យើងអាចធ្វើម្តងទៀតតាមរយៈ ResultSet។
- យើងមានវិធីសាស្រ្តរុករកនៃ ResultSet ដើម្បីផ្លាស់ទីបន្ថែមទៀតនៅក្នុង ResultSet object
- ResultMetaData ត្រូវបានប្រើដើម្បីទទួលបានព័ត៌មានបន្ថែមអំពីការកំណត់លទ្ធផលដូចជា ឈ្មោះជួរឈរ ចំនួនជួរឈរ ប្រភេទទិន្នន័យនៃជួរឈរ។ល។
- DatabaseMetData ត្រូវបានប្រើដើម្បីទទួលបានព័ត៌មានអំពីមូលដ្ឋានទិន្នន័យដែលយើងបានភ្ជាប់
សំណួរដែលសួរញឹកញាប់
សំណួរ #1) តើការប្រើប្រាស់អ្វីResultSet?
ចម្លើយ៖ ResultSet ត្រូវបានប្រើដើម្បីរក្សាទុក និងទាញយកទិន្នន័យពី DB។ នៅពេលដែលវិធីសាស្ត្រ executeQuery() ត្រូវបានប្រតិបត្តិ វានឹងត្រឡប់ ResultSet object។ យើងអាចប្រើវត្ថុ ResultSet នោះក្នុងកម្មវិធីរបស់យើងដើម្បីអនុវត្តតក្កវិជ្ជា។
សំណួរ #2) តើត្រូវពិនិត្យមើលថាតើ ResultSet ទទេឬអត់?
ចម្លើយ៖ មិនមានវិធីសាស្រ្តដែលបានកំណត់ជាមុនដូចជា length(), size() ដែលអាចប្រើបានដើម្បីពិនិត្យមើល IsResultSet ទទេ។ យើងអាចប្រើវិធីបន្ទាប់ () ដើម្បីរំលឹកឡើងវិញ ហើយប្រសិនបើវាត្រឡប់ True នោះវាមិនទទេទេ ប្រសិនបើវាត្រឡប់ False មានន័យថា ResultSet គឺទទេ។
សំណួរ #3) តើវាអាចទៅរួចទេដែលថា ResultSet អាចជា null?
ចំលើយ៖ ទេ វិធីសាស្ត្រ executeQuery() ត្រឡប់វត្ថុ ResultSet ដែលប្រហែលជាមិនទទេ។
សំណួរ #4) តើអ្វីជាសំណុំលទ្ធផលដែលអាចទិន្នន័យបាន?
ចម្លើយ៖ វត្ថុកំណត់លទ្ធផលដែលអាចទិន្នន័យឡើងវិញបានត្រូវបានប្រើដើម្បីធ្វើបច្ចុប្បន្នភាពទិន្នន័យក្នុងជួរឈរ បញ្ចូលទិន្នន័យក្នុងជួរឈរ និងលុបជួរ។ ដើម្បីបង្កើត ResultSet ជាទិន្នន័យដែលអាចធ្វើបច្ចុប្បន្នភាពបាន យើងត្រូវធ្វើឱ្យប្រភេទរមូរមានលក្ខណៈរសើប ឬមិនច្បាស់ និងប្រភេទ CONCUR ជាការអាប់ដេតបាន។
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE.
សំណួរ #5) តើធ្វើដូចម្តេចដើម្បីទទួលបានឈ្មោះមូលដ្ឋានទិន្នន័យដែលត្រូវបានភ្ជាប់?
ចម្លើយ៖ យើងអាចប្រើ getDatabaseProductName() method of DatabaseMetaData object។
សេចក្តីសន្និដ្ឋាន
នៅក្នុងមេរៀននេះ យើងបានពិភាក្សាអំពីអ្វីដែលជា ចំណុចប្រទាក់ ResultSet, ResultSetMetaData, និង DatabaseMetaData ចំណុចប្រទាក់ និងវិធីសាស្រ្តសំខាន់ៗរបស់ពួកគេដែលប្រើជាទូទៅនៅក្នុងកម្មវិធី JDBC ។ យើងក៏បានឃើញដែរ។របៀបធ្វើបច្ចុប្បន្នភាពទិន្នន័យក្នុង DB ដោយប្រើ ResultSet ។ ResultSetMetadata មានព័ត៌មានអំពី ResultSet ដូចជា Column Name, Column count ជាដើម។
DatabaseMetaData មានព័ត៌មានមូលដ្ឋានទិន្នន័យ។
ចំណុចប្រទាក់សេចក្តីថ្លែងការណ៍
Statement statemnt1 = conn.createStatement(); ResultSet rs1 = statemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”);
ចំណុចប្រទាក់ត្រៀមប្រកាស
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”);
យើងអាច ប្រើវិធីសាស្រ្ត getX() ដើម្បីទទួលបានទិន្នន័យនៃជួរឈរខណៈពេលកំពុងធ្វើម្តងទៀតតាមរយៈលទ្ធផលដែល X – គឺជាប្រភេទទិន្នន័យនៃជួរឈរ។ យើងអាចប្រើឈ្មោះជួរឈរ ឬសន្ទស្សន៍ដើម្បីទទួលបានតម្លៃដោយប្រើវិធីសាស្ត្រ 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); }
យើងក៏អាចនិយាយអំពីលេខលិបិក្រមនៃជួរឈរជំនួសឱ្យឈ្មោះជួរឈរក្នុងវិធីសាស្ត្រ 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
តាមលំនាំដើម យើងអាចធ្វើឡើងវិញនូវ data/values នៅក្នុង ResultSet ដែលបានត្រលប់មកវិញជាលទ្ធផលនៃ SQL statement ដែលបានប្រតិបត្តិក្នុងទិសដៅទៅមុខ។ យើងអាចនិយាយឡើងវិញនូវតម្លៃក្នុងទិសដៅផ្សេងទៀតដោយប្រើ Scrollable ResultSet។ យើងអាចបញ្ជាក់ប្រភេទ និងភាពស្របគ្នានៃ ResultSet ខណៈពេលដែលបង្កើត Statement, PreparedStatement, និង CallableStatement objects។
មាន 3 ប្រភេទនៅក្នុង ResultSet។ ពួកវាគឺ៖
- TYPE_FORWARD_ONLY: វាជាជម្រើសលំនាំដើម ដែលទស្សន៍ទ្រនិចផ្លាស់ទីពីដើមដល់ចប់ ពោលគឺក្នុងទិសដៅទៅមុខ។
- TYPE_SCROLL_INSENSITIVE៖ នៅក្នុងប្រភេទនេះ វានឹងធ្វើឱ្យទស្សន៍ទ្រនិចផ្លាស់ទីក្នុងទិសដៅទៅមុខ និងថយក្រោយ។ ប្រសិនបើយើងធ្វើការផ្លាស់ប្តូរណាមួយនៅក្នុងទិន្នន័យ ខណៈពេលដែលកំពុងធ្វើម្តងទៀតនូវទិន្នន័យដែលបានរក្សាទុកនោះ វានឹងមិនធ្វើបច្ចុប្បន្នភាពនៅក្នុងសំណុំទិន្នន័យនោះទេ ប្រសិនបើអ្នកណាម្នាក់ផ្លាស់ប្តូរទិន្នន័យនៅក្នុង DB។ ដោយសារតែសំណុំទិន្នន័យមានទិន្នន័យពីពេលដែលសំណួរ SQL ត្រឡប់ទិន្នន័យ។
- TYPE_SCROLL_SENSITIVE: វាស្រដៀងទៅនឹង TYPE_SCROLL_INSENSITIVE ភាពខុសគ្នាគឺប្រសិនបើអ្នកណាម្នាក់ធ្វើបច្ចុប្បន្នភាពទិន្នន័យបន្ទាប់ពី SQL Query បានបញ្ជូនទិន្នន័យមកវិញ ខណៈពេលដែលការធ្វើម្តងទៀតវានឹងឆ្លុះបញ្ចាំងពីការផ្លាស់ប្តូរទៅសំណុំទិន្នន័យ។
ResultSet Concurrency
មាន 2 របៀបនៃ Concurrency នៅក្នុង ResultSet។ ពួកវាគឺ៖
- ResultSet.CONCUR_READ_ONLY: វាជាទម្រង់រូបិយប័ណ្ណលំនាំដើម។ យើងអាចអានតែទិន្នន័យក្នុង ResultSet ប៉ុណ្ណោះ។ ការអាប់ដេតមិនអាចអនុវត្តបានទេ។
- ResultSet.CONCUR_UPDATABLE: យើងអាចអាប់ដេតទិន្នន័យនៅក្នុង ResultSet object។
មូលដ្ឋានទិន្នន័យមួយចំនួនមិនគាំទ្ររបៀបស្របគ្នាសម្រាប់ទាំងអស់គ្នាទេ។ ប្រភេទកំណត់លទ្ធផល។ ក្នុងករណីនោះ យើងត្រូវពិនិត្យមើលថាតើពួកវាគាំទ្រប្រភេទដែលចង់បាន និងរបៀបស្របគ្នាឬអត់ ដោយប្រើវិធីសាស្ត្រ supportsResultSetConcurrency()។
Methods in ResultSet Interface
មាន 4 ប្រភេទនៃ ResultSet method។ ពួកវាគឺ៖
- វិធីសាស្ត្ររុករក
- វិធីសាស្ត្រទទួលបាន
- វិធីសាស្ត្រកំណត់
- វិធីសាស្ត្រផ្សេងៗ
ដំបូង យើងនឹងពិភាក្សាអំពីវិធីសាស្ត្ររុករក ហើយបន្ទាប់មកនឹងផ្លាស់ទីបន្ថែមទៀត។
#1) វិធីសាស្ត្ររុករក
វិធីសាស្ត្រនេះត្រូវបានប្រើដើម្បីផ្លាស់ទីទស្សន៍ទ្រនិចជុំវិញសំណុំទិន្នន័យ។
- Boolean absolute(int row): វាត្រូវបានប្រើដើម្បីផ្លាស់ទីទស្សន៍ទ្រនិចទៅជួរដេកដែលបានបញ្ជាក់ដែលត្រូវបានលើកឡើងក្នុងប៉ារ៉ាម៉ែត្រ ហើយត្រឡប់ true ប្រសិនបើប្រតិបត្តិការបានជោគជ័យ ផ្សេងទៀតត្រឡប់មិនពិត។
- ទុកជាមោឃៈafterLast(): វាធ្វើឱ្យទស្សន៍ទ្រនិច ResultSet ផ្លាស់ទីបន្ទាប់ពីជួរចុងក្រោយ។
- Void beforeFirst(): វាធ្វើឱ្យទស្សន៍ទ្រនិច ResultSet ផ្លាស់ទីមុនជួរទីមួយ។
- Boolean first(): វាបង្កើតទស្សន៍ទ្រនិច ResultSet ដើម្បីផ្លាស់ទីទៅជួរទីមួយ។ វាត្រឡប់ True ប្រសិនបើប្រតិបត្តិការជោគជ័យផ្សេង False។
- Boolean last(): វាបង្កើតទស្សន៍ទ្រនិច ResultSet ដើម្បីផ្លាស់ទីទៅជួរចុងក្រោយ។ វាត្រឡប់ True ប្រសិនបើប្រតិបត្តិការជោគជ័យផ្សេង False។
- Boolean next(): វាបង្កើតទស្សន៍ទ្រនិច ResultSet ដើម្បីផ្លាស់ទីទៅជួរបន្ទាប់។ វាត្រឡប់ True ប្រសិនបើមាន records ច្រើន និង False ប្រសិនបើមិនមាន record ទៀតទេ។
- Boolean Previous(): វាធ្វើឱ្យទស្សន៍ទ្រនិច ResultSet ផ្លាស់ទីទៅជួរមុន។ វាត្រឡប់ True ប្រសិនបើប្រតិបត្តិការជោគជ័យផ្សេង False។
- Boolean relative(): វាផ្លាស់ទីទស្សន៍ទ្រនិចទៅចំនួនជួរដេកដែលបានផ្តល់ឱ្យទាំងក្នុងទិសដៅទៅមុខ ឬថយក្រោយ។
- Int getRow(): វាត្រឡប់លេខជួរដេកបច្ចុប្បន្នដែលវត្ថុ ResultSet កំពុងចង្អុលឥឡូវនេះ។
- Void moveToCurrentRow(): វាផ្លាស់ទីទស្សន៍ទ្រនិចត្រឡប់ទៅ ជួរដេកបច្ចុប្បន្ន ប្រសិនបើបច្ចុប្បន្នវាស្ថិតនៅក្នុងជួរបញ្ចូល។
- MoveToInsertRow(): វាផ្លាស់ទីទស្សន៍ទ្រនិចទៅជួរដេកជាក់លាក់ដើម្បីបញ្ចូលជួរដេកទៅក្នុងមូលដ្ឋានទិន្នន័យ។ វាចងចាំទីតាំងទស្សន៍ទ្រនិចបច្ចុប្បន្ន។ ដូច្នេះយើងអាចប្រើវិធី moveToCurrentRow() ដើម្បីផ្លាស់ទីទស្សន៍ទ្រនិចទៅជួរបច្ចុប្បន្នបន្ទាប់ពីការបញ្ចូល។
នៅក្នុងមេរៀននេះកម្មវិធីទាំងអស់ត្រូវបានសរសេរនៅក្នុង Java ។ យើងបានប្រើកំណែ Java 8 និង Oracle DB។
>> អ្នកអាចទាញយកកម្មវិធី Oracle ពីទីនេះ
>>អ្នកអាចទាញយក Java កំណែ 8 ពីទីនេះ
វាមានដំណើរការដំឡើង Java មួយជំហានម្តងៗ។
JDBC 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; 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៖
ទិន្នន័យនៅក្នុងតារាង Employee_details
![](/wp-content/uploads/guides/7033dwpdfa-2.png)
ការពន្យល់៖
នៅក្នុងកម្មវិធីខាងលើ យើងបានអនុវត្ត first(), last(), beforeFirst(), afterLast(), next( ), មុន(), absolute(), relative() និង getRow() method ក្នុង ResultSet. ដើម្បីប្រើវិធីសាស្រ្តទាំងនេះ យើងបានកំណត់តម្លៃ ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE ក្នុងវិធីរៀបចំStatement។
បន្ទាប់ យើងនឹងពិភាក្សាអំពីអ្វីដែលជា Getter Methods នៅក្នុងសំណុំលទ្ធផល៖
#2) Getter Methods
ResultSet បានរក្សាទុកទិន្នន័យតារាងពី Database។ វិធីសាស្ត្រ Getter ត្រូវបានប្រើដើម្បីទទួលបានតម្លៃនៃតារាងក្នុង ResultSet ។ សម្រាប់ការនោះ យើងត្រូវឆ្លងកាត់តម្លៃសន្ទស្សន៍ជួរឈរ ឬឈ្មោះជួរឈរ។
ខាងក្រោមនេះជាវិធីសាស្រ្តទទួលបាននៅក្នុង ResultSet៖
- int getInt (int ColumnIndex): វាត្រូវបានប្រើដើម្បីទទួលបានតម្លៃនៃសន្ទស្សន៍ជួរឈរដែលបានបញ្ជាក់ជាប្រភេទទិន្នន័យ int។
- float getFloat(int ColumnIndex): វាត្រូវបានប្រើដើម្បីទទួល តម្លៃនៃសន្ទស្សន៍ជួរឈរដែលបានបញ្ជាក់ជាប្រភេទទិន្នន័យអណ្តែត។
- java.sql.dategetDate(int ColumnIndex): វាត្រូវបានប្រើដើម្បីទទួលបានតម្លៃនៃសន្ទស្សន៍ជួរឈរដែលបានបញ្ជាក់ជាតម្លៃកាលបរិច្ឆេទ។
- int getInt(String ColumnName): វាត្រូវបានគេប្រើដើម្បីទទួលបាន តម្លៃនៃជួរឈរដែលបានបញ្ជាក់ជាប្រភេទទិន្នន័យ int។
- float getFloat(String ColumnName): វាត្រូវបានប្រើដើម្បីទទួលបានតម្លៃនៃជួរឈរដែលបានបញ្ជាក់ជាប្រភេទទិន្នន័យអណ្តែត។
- Java.sql.date getDate(String ColumnName)៖ វាត្រូវបានប្រើដើម្បីទទួលបានតម្លៃនៃជួរឈរដែលបានបញ្ជាក់ជាតម្លៃកាលបរិច្ឆេទ។
មានវិធីសាស្រ្តទទួល សម្រាប់ប្រភេទទិន្នន័យបឋមទាំងអស់ (Boolean, long, double) និង String ក៏មាននៅក្នុង ResultSet interface ផងដែរ។ យើងអាចទទួលបានប្រភេទទិន្នន័យអារេ និងប្រព័ន្ធគោលពីរពី Database ផងដែរ។ វាក៏មានវិធីសាស្រ្តសម្រាប់នោះ។
#3) Setter/Update Methods
យើងអាចអាប់ដេតតម្លៃនៅក្នុង Database ដោយប្រើវិធីសាស្ត្រ ResultSet Updater។ វាស្រដៀងទៅនឹងវិធីសាស្ត្រ Getter ប៉ុន្តែនៅទីនេះយើងត្រូវឆ្លងកាត់តម្លៃ/ទិន្នន័យសម្រាប់ជួរឈរជាក់លាក់ដើម្បីធ្វើបច្ចុប្បន្នភាពនៅក្នុងមូលដ្ឋានទិន្នន័យ។
ខាងក្រោមនេះគឺជាវិធីសាស្ត្រអាប់ដេតនៅក្នុងសំណុំលទ្ធផល៖ 3
- void updateInt(int ColumnIndex, int Value): វាត្រូវបានប្រើដើម្បីធ្វើបច្ចុប្បន្នភាពតម្លៃនៃសន្ទស្សន៍ជួរឈរដែលបានបញ្ជាក់ជាមួយនឹងតម្លៃ int។
- ចាត់ទុកជាមោឃៈ updateFloat(int ColumnIndex, float f): វាត្រូវបានប្រើដើម្បីធ្វើបច្ចុប្បន្នភាពតម្លៃនៃសន្ទស្សន៍ជួរឈរដែលបានបញ្ជាក់ជាមួយនឹងតម្លៃអណ្តែត។
- void updateDate(int ColumnIndex, Date d): វាត្រូវបានប្រើដើម្បីធ្វើបច្ចុប្បន្នភាពតម្លៃនៃសន្ទស្សន៍ជួរឈរដែលបានបញ្ជាក់ជាមួយតម្លៃកាលបរិច្ឆេទ។
- void updateInt(String ColumnName, int Value): វាត្រូវបានប្រើដើម្បីធ្វើបច្ចុប្បន្នភាពតម្លៃនៃជួរឈរដែលបានបញ្ជាក់ជាមួយនឹងតម្លៃ int ដែលបានផ្តល់ឱ្យ។
- void updateFloat(String ColumnName, float f): វាត្រូវបានប្រើដើម្បីធ្វើបច្ចុប្បន្នភាពតម្លៃនៃជួរឈរដែលបានបញ្ជាក់ជាមួយនឹងតម្លៃអណ្តែតដែលបានផ្តល់ឱ្យ។
- Java.sql.date getDate(String ColumnName): វាត្រូវបានប្រើដើម្បីធ្វើបច្ចុប្បន្នភាពតម្លៃនៃជួរឈរដែលបានបញ្ជាក់ជាមួយនឹងតម្លៃកាលបរិច្ឆេទដែលបានផ្តល់ឱ្យ។
មានវិធីធ្វើបច្ចុប្បន្នភាពសម្រាប់ប្រភេទទិន្នន័យបឋមទាំងអស់ (Boolean, long, double) និង String ផងដែរនៅក្នុងចំណុចប្រទាក់ ResultSet ។
វិធីសាស្រ្តធ្វើបច្ចុប្បន្នភាពគ្រាន់តែធ្វើបច្ចុប្បន្នភាពទិន្នន័យនៅក្នុងវត្ថុ ResultSet ។ តម្លៃនឹងត្រូវបានអាប់ដេតក្នុង DB បន្ទាប់ពីហៅវិធីសាស្ត្រ insertRow ឬ updateRow។
ការអាប់ដេតជួរដេក៖
យើងអាចធ្វើបច្ចុប្បន្នភាពទិន្នន័យជាបន្តបន្ទាប់ដោយហៅវិធីសាស្ត្រ updateX() ឆ្លងកាត់ឈ្មោះជួរឈរ ឬសន្ទស្សន៍ និងតម្លៃដើម្បីធ្វើបច្ចុប្បន្នភាព។ យើងអាចប្រើប្រភេទទិន្នន័យណាមួយជំនួស X ក្នុងវិធី updateX ។ រហូតមកដល់ពេលនេះ យើងបានអាប់ដេតទិន្នន័យនៅក្នុងវត្ថុ ResultSet។ ដើម្បីធ្វើបច្ចុប្បន្នភាពទិន្នន័យក្នុង DB យើងត្រូវហៅវិធីសាស្ត្រ updateRow()។
ការបញ្ចូលជួរដេក៖
យើងត្រូវប្រើ moveToInsertRow() ដើម្បីផ្លាស់ទីទស្សន៍ទ្រនិច ដើម្បីបញ្ចូលជួរថ្មី។ យើងបានគ្របដណ្តប់វារួចហើយនៅក្នុងផ្នែក វិធីសាស្ត្ររុករក។ បន្ទាប់យើងត្រូវហៅវិធីសាស្ត្រ updateX() ដើម្បីបន្ថែមទិន្នន័យទៅជួរដេក។ យើងគួរតែផ្តល់ទិន្នន័យសម្រាប់ជួរឈរទាំងអស់ផ្សេងទៀតដែលវានឹងប្រើតម្លៃលំនាំដើមនៃជាក់លាក់នោះ។ជួរឈរ។
បន្ទាប់ពីធ្វើបច្ចុប្បន្នភាពទិន្នន័យ យើងត្រូវហៅវិធីសាស្ត្រ insertRow()។ បន្ទាប់មកប្រើវិធី moveToCurrentRow() ដើម្បីយកទីតាំងទស្សន៍ទ្រនិចត្រឡប់ទៅជួរដេកដែលយើងនៅមុនពេលយើងចាប់ផ្តើមបញ្ចូលជួរដេកថ្មី។
កំណត់លទ្ធផលឧទាហរណ៍៖
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៖
ការពន្យល់៖
នៅក្នុងកម្មវិធីខាងលើ អ្វីដែលយើងបានធ្វើគឺដំបូង យើងរក្សាទុក ទិន្នន័យនៃតារាង Employee_details នៅក្នុងវត្ថុ ResultSet ដោយប្រើ SELECT query ។ បន្ទាប់មក យើងបង្ហាញទិន្នន័យនៃជួរចុងក្រោយក្នុងតារាងបុគ្គលិក_លម្អិតដោយប្រើវិធីសាស្ត្រចុងក្រោយ () នៃ ResultSet ។ វិធីសាស្ត្រ moveToInsertRow() ធ្វើឱ្យទស្សន៍ទ្រនិចចង្អុលជួរដេកបច្ចុប្បន្ន ឥឡូវនេះ ជួរដេកបច្ចុប្បន្នគឺជាជួរចុងក្រោយ។
updateXXX() វិធីសាស្ត្រដែលប្រើដើម្បីធ្វើបច្ចុប្បន្នភាពតម្លៃទៅជួរដេក ហើយវិធីសាស្ត្រ insertRow() បានបញ្ចូលទិន្នន័យនៅក្នុង ជួរថ្មី។ ដោយប្រើវិធីសាស្រ្ត absolute() យើងបង្កើត cursor ដើម្បីចង្អុលទៅជួរទី 5 ។ វិធីសាស្ត្រ UpdateInt() ត្រូវបានប្រើដើម្បីធ្វើបច្ចុប្បន្នភាព EMPNUM ជាមួយនឹងលេខសម្គាល់ថ្មីរបស់បុគ្គលិកទី 5 នៅក្នុងតារាង។ បន្ទាប់ពីនោះ បានបង្ហាញទិន្នន័យដើម្បីពិនិត្យមើលថាតើ EMPNUM ត្រូវបានធ្វើបច្ចុប្បន្នភាពឬអត់។
បង្កើតទស្សន៍ទ្រនិចដើម្បីចង្អុលជួរចុងក្រោយនៃតារាងដោយប្រើ last() ហើយបង្ហាញវា។ ដើម្បីអនុវត្តតក្កវិជ្ជាខាងលើ យើងត្រូវកំណត់តម្លៃ ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE ក្នុងវិធីសាស្ត្ររៀបចំStatement។
#4) វិធីសាស្ត្រផ្សេងៗ
- void close(): វាត្រូវបានប្រើដើម្បីបិទ ResultSet instance និងដោះលែងធនធានដែលពាក់ព័ន្ធជាមួយ ResultSet instance។
- ResultSetMetaData getMetaData(): វាបង្ហាញលទ្ធផល ResultSetMetaData Instance។ វាមានព័ត៌មានអំពីប្រភេទ និងលក្ខណៈសម្បត្តិនៃជួរឈរនៃលទ្ធផលសំណួរ។ យើងនឹងស្វែងយល់បន្ថែមអំពី ResultSetMetaData នៅក្នុងផ្នែកបន្ទាប់។
ResultSetMetaData
តើទិន្នន័យមេតាគឺជាអ្វី?
ទិន្នន័យមេតា មានន័យថាទិន្នន័យអំពីទិន្នន័យ។ ដោយប្រើចំណុចប្រទាក់នេះ យើងនឹងទទួលបានព័ត៌មានបន្ថែមអំពី ResultSet ។ វាមាននៅក្នុងកញ្ចប់ java.sql ។ រាល់ ResultSet object ត្រូវបានភ្ជាប់ជាមួយវត្ថុ ResultSetMetaData មួយ។
វត្ថុនេះនឹងមានព័ត៌មានលម្អិតនៃលក្ខណៈសម្បត្តិនៃជួរឈរ ដូចជាប្រភេទទិន្នន័យនៃជួរឈរ ឈ្មោះជួរឈរ ចំនួនជួរឈរ ឈ្មោះតារាង ឈ្មោះគ្រោងការណ៍។ល។ យើងអាចទទួលបានវត្ថុ ResultSetMetaData ដោយប្រើវិធីសាស្ត្រ getMetaData() នៃ ResultSet។
វាក្យសម្ព័ន្ធនៃ ResultSetMetaData៖
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”); ResultSetMetaData rsmd = rs.getMetaData();
វិធីសាស្ត្រសំខាន់ៗនៃចំណុចប្រទាក់ ResultSetMetaData៖
ឈ្មោះវិធីសាស្រ្ត | ការពិពណ៌នា |
---|---|
String getColumnName(int column) | វាត្រឡប់ឈ្មោះជួរឈរនៃជួរឈរជាក់លាក់ |
String getColumnTypeName(int column) | វាត្រឡប់ប្រភេទទិន្នន័យនៃ ជួរឈរជាក់លាក់ដែលយើងបានឆ្លងកាត់ជាប៉ារ៉ាម៉ែត្រ |
String getTableName(int column) | វាត្រឡប់ឈ្មោះតារាងនៃជួរឈរ |
String getSchemaName(int column) | វា |