يشرح هذا البرنامج التعليمي كيفية استخدام JDBC ResultSet لاسترداد البيانات. سنتعرف أيضًا على واجهات ResultSetMetaData و DatabaseMetaData مع أمثلة:
في البرنامج التعليمي JDBC DriverManager من سلسلة البرنامج التعليمي JDBC ، تعلمنا كيفية استخدام JDBC DriverManager وطرقه ، JDBC PreparedStatement في تطبيقات Java.
في هذا البرنامج التعليمي ، سنناقش الواجهات المتبقية في JDBC. لقد قمنا بتغطية واجهات Statement و PreparedStatement و CallableStatement في دروسنا السابقة.
هنا ، سوف نتعرف على واجهات JDBC ResultSet و ResultSetMetaData و DatabaseMetaData وطرقها وكيفية استخدام الأساليب في برنامج Java.
واجهة JDBC ResultSet
واجهة ResultSet موجودة في حزمة java.sql. يتم استخدامه لتخزين البيانات التي يتم إرجاعها من جدول قاعدة البيانات بعد تنفيذ عبارات SQL في برنامج Java. يحتفظ كائن ResultSet بنقطة المؤشر على بيانات النتيجة. في الوضع الافتراضي ، يتم وضع المؤشر قبل الصف الأول من بيانات النتيجة.
يتم استخدام الطريقة التالية () لتحريك المؤشر إلى الموضع التالي في اتجاه أمامي. سيعود FALSE إذا لم يكن هناك المزيد من السجلات. يسترد البيانات عن طريق استدعاء طريقة executeQuery () باستخدام أي من كائنات البيان. قد يكون بيان أو PreparedStatement أو CallableStatement كائن. بيان معد ، ويُرجع اسم مخطط جدول العمود
ResultSetMetaData مثال
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)); } } }
الإخراج:
التفسير:
في البرنامج أعلاه ، لقد قمنا بتنفيذ أساليب getColumnCount () و getColumnName () و getColumnTypeName () و getTableName () و getSchemaName () في واجهة ResultSetMetaData.
DatabaseMetaData
توفر واجهة DatabaseMetaData معلومات حول قاعدة البيانات مثل اسم قاعدة البيانات وإصدار قاعدة البيانات وما إلى ذلك.
طرق مهمة لواجهة DatabaseMetaData:
اسم الأسلوب | الوصف |
---|---|
String getDriverName () | سيعيد اسم برنامج تشغيل JDBC الذي نستخدمه في برنامج Java الخاص بنا |
String getDriverVersion () | تقوم بإرجاع رقم إصدار برنامج تشغيل JDBC |
String getUserName () | تقوم بإرجاع اسم مستخدم قاعدة البيانات الذي نستخدمه |
String getDatabaseProductName () | تقوم بإرجاع اسم قاعدة البيانات الذي نحن عليهباستخدام |
String getDatabaseProductVersion () | تقوم بإرجاع رقم إصدار قاعدة البيانات الذي نستخدمه |
ResultSet getSchemas () | يقوم بإرجاع أسماء المخططات المتوفرة في قاعدة البيانات المتصلة |
String getStringFunctions () | يقوم بإرجاع قائمة وظائف السلسلة المتوفرة في قاعدة البيانات المتصلة |
سلسلة getTimeDateFunctions () | انها إرجاع قائمة وظائف الوقت والتاريخ المتوفرة في قاعدة البيانات المتصلة |
String getURL () | تقوم بإرجاع عنوان URL لقاعدة البيانات |
Boolean isReadOnly () | يقوم بإرجاع ما إذا كانت قاعدة البيانات في وضع القراءة فقط |
Boolean supportBatchUpdates () | تقوم بإرجاع ما إذا كانت قاعدة البيانات تدعم التحديثات المجمعة |
Boolean supportSavepoints () | تقوم بإرجاع ما إذا كانت قاعدة البيانات تدعم نقاط الحفظ |
دعم منطقيStatementPooling () | تُرجع ما إذا كانت قاعدة البيانات تدعم تجميع البيانات |
دعم منطقي 5> | تقوم بإرجاع ما إذا كانت قاعدة البيانات تدعم الانضمام الخارجي |
هنا ، قمنا بإدراج بعض الطرق المهمة لواجهة 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()); } }
الإخراج:
الشرح:
في البرنامج أعلاه ، استخدمنا / نفذنا getDriverName () ، getDriverVersion () ، getUserName () ، getDatabaseProductName () ، getDatabaseProductVersion () ، getStringFunctions () ، getTimeDateFunctions () ، getURL () ، isReadOnly () ، supportBatchUpdates () ، supportStatementPooling () ، supportSavepoints () ، supportStoredProced () واجهة DatabaseMetaData.
النقاط التي يجب ملاحظتها:
- تُستخدم واجهة JDBC ResultSet لتخزين البيانات من قاعدة البيانات واستخدامها في برنامج Java الخاص بنا.
- يمكننا أيضًا استخدام ResultSet لتحديث البيانات باستخدام طرق updateXXX ().
- يشير كائن ResultSet إلى المؤشر قبل الصف الأول من بيانات النتيجة. باستخدام طريقة next () ، يمكننا التكرار من خلال ResultSet.
- لدينا طرق ملاحية لـ ResultSet للتحرك أكثر في كائن ResultSet
- يتم استخدام ResultMetaData للحصول على مزيد من المعلومات حول ResultSet مثل اسم العمود ، عدد الأعمدة ، نوع بيانات العمود ، إلخ.
- يتم استخدام DatabaseMetData للحصول على معلومات حول قاعدة البيانات التي قمنا بتوصيلها
الأسئلة المتداولة
س # 1) ما فائدةResultSet؟
الإجابة: يتم استخدام ResultSet لتخزين واسترداد البيانات من قاعدة البيانات. عند تنفيذ أسلوب executeQuery () ، فإنه سيعيد كائن ResultSet. يمكننا استخدام كائن ResultSet هذا في برنامجنا لتنفيذ المنطق.
Q # 2) كيف تتحقق مما إذا كانت ResultSet فارغة أم لا؟
الإجابة: لا توجد طرق محددة مسبقًا مثل length () ، size () متاحة للتحقق من IsResultSet Empty. يمكننا استخدام طريقة next () للتكرار وإذا أعادت True ، فهي ليست فارغة ، وإذا أعادت False تعني أن ResultSet فارغة.
Q # 3) هل من الممكن أن تكون ResultSet قد يكون فارغًا؟
الإجابة: لا ، طريقة executeQuery () ترجع كائن ResultSet الذي قد لا يكون فارغًا.
Q # 4) ما هو ResultSet القابل للتحديث؟
الإجابة: يتم استخدام كائن ResultSet القابل للتحديث لتحديث البيانات في العمود وإدراج البيانات في الأعمدة وحذف الصفوف. لجعل ResultSet واحدة قابلة للتحديث ، نحتاج إلى جعل نوع التمرير حساسًا أو غير حساس ونوع CONCUR قابل للتحديث.
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE.
Q # 5) كيفية الحصول على اسم قاعدة البيانات التي تم توصيلها؟
الإجابة: يمكننا استخدام طريقة getDatabaseProductName () لكائن DatabaseMetaData.
الاستنتاج
في هذا البرنامج التعليمي ، ناقشنا ما هي واجهات ResultSet و ResultSetMetaData و DatabaseMetaData وطرقها الهامة المستخدمة بشكل شائع في برامج JDBC. لقد رأينا أيضاكيفية تحديث البيانات في قاعدة البيانات باستخدام ResultSet. تحتوي ResultSetMetadata على معلومات حول ResultSet مثل اسم العمود وعدد العمود وما إلى ذلك.
تحتوي DatabaseMetaData على معلومات قاعدة البيانات.
& lt؛
واجهة البيان
Statement statemnt1 = conn.createStatement(); ResultSet rs1 = statemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”);
واجهة PreparedStatement
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”);
يمكننا استخدم طريقة getX () للحصول على بيانات الأعمدة أثناء التكرار خلال النتائج حيث X - هو نوع بيانات العمود. يمكننا استخدام Column Names أو Index للحصول على القيم باستخدام طرق 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); }
أنواع النتائج> 8>
بشكل افتراضي ، يمكننا تكرار البيانات / القيم في ResultSet والتي عادت كمخرجات من عبارة SQL المنفذة في الاتجاه الأمامي. يمكننا تكرار القيم في اتجاهات أخرى باستخدام Scrollable ResultSet. يمكننا تحديد نوع وتزامن ResultSet أثناء إنشاء كائنات Statement و PreparedStatement و CallableStatement.
هناك 3 أنواع في ResultSet. هم:
- TYPE_FORWARD_ONLY: إنه الخيار الافتراضي ، حيث يتحرك المؤشر من البداية إلى النهاية ، أي في الاتجاه الأمامي. 4> TYPE_SCROLL_INSENSITIVE: في هذا النوع ، سيجعل المؤشر يتحرك في كلا الاتجاهين للأمام والخلف. إذا أجرينا أي تغييرات على البيانات أثناء تكرار البيانات المخزنة ، فلن يتم تحديثها في مجموعة البيانات إذا قام أي شخص بتغيير البيانات في قاعدة البيانات. لأن مجموعة البيانات تحتوي على البيانات من وقت إرجاع استعلام SQLالبيانات.
- TYPE_SCROLL_SENSITIVE: وهو مشابه لـ TYPE_SCROLL_INSENSITIVE ، والفرق هو إذا قام أي شخص بتحديث البيانات بعد أن قام استعلام SQL بإرجاع البيانات ، بينما سيعكس التكرار التغييرات على مجموعة البيانات.
نتيجة تعيين التزامن
هناك وضعان للتزامن في ResultSet. هم:
- ResultSet.CONCUR_READ_ONLY: إنه وضع التزامن الافتراضي. يمكننا فقط قراءة البيانات الموجودة في ResultSet. التحديث غير قابل للتطبيق.
- ResultSet.CONCUR_UPDATABLE: يمكننا تحديث البيانات في كائن ResultSet.
لا تدعم بعض قواعد البيانات وضع التزامن للجميع أنواع النتائج. في هذه الحالة ، نحتاج إلى التحقق مما إذا كانت تدعم النوع المطلوب ووضع التزامن باستخدام طريقة supportResultSetConcurrency (). هي:
- أساليب التنقل
- طرق الحصول على
- طرق الإعداد
- طرق متنوعة
أولاً ، سنناقش طرق التنقل ثم سننتقل إلى أبعد من ذلك.
# 1) طرق التنقل
تُستخدم هذه الطريقة لتحريك المؤشر حول مجموعة البيانات.
- مطلق منطقي (صف int): يتم استخدامه لتحريك المؤشر إلى الصف المحدد المذكور في المعلمة وإرجاع القيمة الصحيحة إذا كانت العملية ناجحة ، وإلا يتم إرجاع خطأ.
- باطلafterLast (): يجعل مؤشر ResultSet يتحرك بعد الصف الأخير.
- Void beforeFirst (): يجعل مؤشر ResultSet يتحرك قبل الصف الأول.
- منطقي أولاً (): يجعل مؤشر ResultSet للانتقال إلى الصف الأول. تقوم بإرجاع True إذا كانت العملية ناجحة وإلا False.
- Boolean last (): يجعل مؤشر ResultSet للانتقال إلى الصف الأخير. تقوم بإرجاع True إذا كانت العملية ناجحة وإلا False.
- Boolean next (): يجعل مؤشر ResultSet للانتقال إلى الصف التالي. تقوم بإرجاع True إذا كان هناك المزيد من السجلات و False إذا لم يكن هناك المزيد من السجلات.
- Boolean previous (): يجعل مؤشر ResultSet للانتقال إلى الصف السابق. يتم إرجاع صحيح إذا كانت العملية ناجحة وإلا خطأ.
- نسبي منطقي (): يحرك المؤشر إلى عدد معين من الصفوف إما في الاتجاه الأمامي أو الخلفي.
- Int getRow (): يقوم بإرجاع رقم الصف الحالي الذي يشير إليه كائن ResultSet الآن.
- Void moveToCurrentRow (): إنه يحرك المؤشر مرة أخرى إلى الصف الحالي إذا كان حاليًا في إدراج الصف.
- Void moveToInsertRow (): إنه ينقل المؤشر إلى الصف المحدد لإدراج الصف في قاعدة البيانات. يتذكر موقع المؤشر الحالي. لذلك يمكننا استخدام طريقة moveToCurrentRow () لتحريك المؤشر إلى الصف الحالي بعد الإدراج.
في هذا البرنامج التعليمي ،جميع البرامج مكتوبة بلغة جافا. لقد استخدمنا إصدار Java 8 و Oracle DB.
& gt؛ & gt؛ يمكنك تنزيل برنامج Oracle من هنا
& gt؛ & gt؛ يمكنك تنزيل إصدار 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(); } } }
الإخراج:
البيانات في جدول تفاصيل الموظف
الشرح:
في البرنامج أعلاه قمنا بتنفيذ الأول () ، الأخير () ، beforeFirst () ، afterLast () ، التالي ( ) والطرق السابقة () والمطلقة () والنسبية () و getRow () في ResultSet. لاستخدام هذه الطرق ، قمنا بتعيين ResultSet.TYPE_SCROLL_SENSITIVE ، ResultSet.CONCUR_UPDATABLE في طريقة PreparStatement.
بعد ذلك ، سنناقش ما هي طرق Getter في ResultSet:
# 2) أساليب Getter
قامت ResultSet بتخزين بيانات الجدول من قاعدة البيانات. تُستخدم طرق Getter للحصول على قيم الجدول في ResultSet. لذلك ، نحتاج إلى تمرير قيمة فهرس العمود أو اسم العمود.
فيما يلي طرق getter في ResultSet:
- int getInt (int ColumnIndex): يتم استخدامه للحصول على قيمة فهرس العمود المحدد كنوع بيانات int.
- تعويم getFloat (int ColumnIndex): يتم استخدامه للحصول على قيمة فهرس العمود المحدد كنوع بيانات عائم.
- java.sql.dategetDate (int ColumnIndex): يتم استخدامه للحصول على قيمة فهرس العمود المحدد كقيمة تاريخ.
- int getInt (String ColumnName): يتم استخدامه للحصول على قيمة العمود المحدد كنوع بيانات int.
- تعويم getFloat (String ColumnName): يتم استخدامه للحصول على قيمة العمود المحدد كنوع بيانات عائم.
- Java.sql.date getDate (String ColumnName): يتم استخدامه للحصول على قيمة العمود المحدد كقيمة تاريخ.
هناك طرق getter لجميع أنواع البيانات البدائية (منطقية ، طويلة ، مزدوجة) وسلسلة أيضًا في واجهة ResultSet. يمكننا الحصول على مصفوفة ونوع ثنائي من البيانات أيضًا من قاعدة البيانات. كما أن لديها طرق لذلك.
# 3) طرق الواضع / التحديث
يمكننا تحديث القيمة في قاعدة البيانات باستخدام طرق ResultSet Updater. إنه مشابه لطرق Getter ، لكننا هنا نحتاج إلى تمرير القيم / البيانات لعمود معين لتحديثه في قاعدة البيانات.
فيما يلي طرق التحديث في ResultSet:
- void updateInt (int ColumnIndex، int Value): يتم استخدامه لتحديث قيمة فهرس العمود المحدد بقيمة int.
- void 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): يتم استخدامه لتحديث قيمة العمود المحدد بقيمة التاريخ المحددة.
توجد طرق محدث لجميع أنواع البيانات الأولية (منطقية ، طويلة ، مزدوجة) وسلسلة أيضًا في واجهة ResultSet.
تقوم طرق Updater فقط بتحديث البيانات الموجودة في كائن ResultSet. سيتم تحديث القيم في قاعدة البيانات بعد استدعاء أسلوب insertRow أو updateRow.
تحديث صف:
يمكننا تحديث البيانات في صف عن طريق استدعاء طرق updateX () ، وتمرير اسم العمود أو الفهرس والقيم المراد تحديثها. يمكننا استخدام أي نوع بيانات بدلاً من X في طريقة updateX. حتى الآن ، قمنا بتحديث البيانات في كائن ResultSet. لتحديث البيانات في قاعدة البيانات ، علينا استدعاء طريقة 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(); } } }
الإخراج:
الشرح:
في البرنامج أعلاه ، ما قمنا به هو أولاً ، قمنا بتخزين بيانات الجدول Employee_details في كائن ResultSet باستخدام استعلام SELECT. بعد ذلك ، قمنا بعرض بيانات الصف الأخير في جدول الموظف_التفاصيل باستخدام طريقة () الأخيرة لمجموعة النتائج. طريقة moveToInsertRow () تجعل المؤشر يشير إلى الصف الحالي ، والآن يكون الصف الحالي هو الصف الأخير.
طرق updateXXX () المستخدمة لتحديث القيم إلى الصف وأدرجت طريقة insertRow () البيانات في صف جديد. باستخدام طريقة () المطلقة ، قمنا بعمل المؤشر للإشارة إلى الصف الخامس. تم استخدام طريقة UpdateInt () لتحديث EMPNUM بمعرف جديد للموظف الخامس في الجدول. بعد ذلك ، عرض البيانات للتحقق مما إذا كان EMPNUM محدثًا أم لا.
جعل المؤشر يشير إلى الصف الأخير من الجدول باستخدام last () وعرضه. لتنفيذ المنطق أعلاه ، نحتاج إلى تعيين قيم ResultSet.TYPE_SCROLL_INSENSITIVE و ResultSet.CONCUR_UPDATABLE في طريقة PreparStatement.
# 4) Miscellaneous Methods
- إغلاق باطل (): يتم استخدامه لإغلاق مثيل ResultSet وتحرير ملفالموارد المرتبطة بمثيل ResultSet.
- ResultSetMetaData getMetaData (): تقوم بإرجاع مثيل ResultSetMetaData. يحتوي على معلومات حول نوع وخصائص أعمدة ناتج الاستعلام. سنتعلم المزيد عن ResultSetMetaData في القسم التالي.
ResultSetMetaData
ما هي البيانات الوصفية؟
البيانات الوصفية تعني بيانات حول البيانات. باستخدام هذه الواجهة ، سوف نحصل على مزيد من المعلومات حول ResultSet. وهي متوفرة في حزمة java.sql. يرتبط كل كائن ResultSet بكائن ResultSetMetaData واحد.
سيحتوي هذا الكائن على تفاصيل خصائص الأعمدة مثل نوع بيانات العمود ، واسم العمود ، وعدد الأعمدة ، واسم الجدول ، واسم المخطط ، وما إلى ذلك ، يمكننا الحصول على كائن ResultSetMetaData باستخدام طريقة getMetaData () من ResultSet.
بناء جملة ResultSetMetaData:
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”); ResultSetMetaData rsmd = rs.getMetaData();
طرق مهمة لواجهة ResultSetMetaData:
اسم الأسلوب | الوصف |
---|---|
سلسلة getColumnName (العمود int) | يقوم بإرجاع اسم العمود الخاص بالعمود المحدد |
String getColumnTypeName (العمود int) | يقوم بإرجاع نوع بيانات عمود معين مررناه كمعامل |
String getTableName (العمود int) | يقوم بإرجاع اسم الجدول للعمود |
سلسلة getSchemaName (عمود int) | ذلك |