این آموزش نحوه استفاده از JDBC ResultSet را برای بازیابی داده ها توضیح می دهد. همچنین با مثال هایی در مورد رابط ResultSetMetaData و DatabaseMetaData خواهیم آموخت:
در آموزش JDBC DriverManager از سری آموزش JDBC ، نحوه استفاده از JDBC را یاد گرفتیم. DriverManager و روش های آن، JDBC PreparedStatement در برنامه های جاوا.
در این آموزش، رابط های باقی مانده در JDBC را مورد بحث قرار می دهیم. ما رابط های Statement، PreparedStatement و CallableStatement را در آموزش های قبلی خود پوشش داده ایم.
در اینجا، با رابط های JDBC ResultSet، ResultSetMetaData و DatabaseMetaData، روش های آنها و نحوه استفاده از روش ها در برنامه جاوا آشنا می شویم.
JDBC ResultSet Interface
ResultSet Interface در بسته java.sql موجود است. برای ذخیره داده هایی که پس از اجرای دستورات SQL در برنامه جاوا از جدول پایگاه داده بازگردانده می شوند استفاده می شود. شی ResultSet نقطه مکان نما را در داده های نتیجه حفظ می کند. در حالت پیشفرض، مکاننما قبل از ردیف اول دادههای نتیجه قرار میگیرد.
روش next() برای حرکت مکاننما به موقعیت بعدی در جهت جلو استفاده میشود. اگر رکورد دیگری وجود نداشته باشد، FALSE برمی گردد. داده ها را با فراخوانی متد ()executeQuery با استفاده از هر یک از اشیاء عبارت بازیابی می کند. ممکن است عبارت Statement یا 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)); } } }
OUTPUT:
توضیح:
در برنامه فوق، ما متدهای getColumnCount()،getColumnName()، getColumnTypeName()، getTableName() و getSchemaName() را در واسط ResultSetMetaData پیاده سازی کرده ایم.
DatabaseMetaData
Interface DatabaseMetaData اطلاعاتی را در مورد پایگاه داده می دهد. DatabaseName، نسخه پایگاه داده، و غیره.
روش های مهم رابط DatabaseMetaData:
نام روش | شرح | |
---|---|---|
String getDriverName() | نام درایور JDBC را که ما در برنامه جاوا از آن استفاده می کنیم برمی گرداند | ()نام کاربری پایگاه داده ای را که ما استفاده می کنیم برمی گرداند |
رشته getDatabaseProductName() | برمی گرداند نام پایگاه داده ای که ما هستیمبا استفاده از | |
String getDatabaseProductVersion() | شماره نسخه پایگاه داده مورد استفاده ما را برمی گرداند | |
ResultSet getSchemas() | نام طرحواره های موجود در پایگاه داده متصل را برمی گرداند | |
String getStringFunctions() | لیست توابع رشته ای موجود در پایگاه داده متصل را برمی گرداند | |
String getTimeDateFunctions() | It لیستی از توابع زمان و تاریخ موجود در پایگاه داده متصل را برمی گرداند | |
String getURL() | URL را برای پایگاه داده برمی گرداند | |
Boolean isReadOnly() | این نشان می دهد که آیا پایگاه داده در حالت فقط خواندنی است یا نه | |
Boolean supportsBatchUpdates() | این نشان می دهد که آیا پایگاه داده از به روز رسانی های دسته ای پشتیبانی می کند یا خیر | |
Boolean supportsSavepoints() | برمیگرداند که آیا پایگاه داده از Savepoints پشتیبانی میکند یا نه | |
Boolean supportsStatementPooling() | برمیگرداند که آیا پایگاه داده از ادغام بیانیه پشتیبانی میکند یا خیر | این نشان می دهد که آیا پایگاه داده از 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 () ، indSstatementPooling () ، حمایت رابط DatabaseMetaData.
نکات قابل توجه:
- واسط JDBC ResultSet برای ذخیره داده ها از پایگاه داده و استفاده از آن در برنامه جاوا استفاده می شود.
- ما همچنین میتوانیم از ResultSet برای بهروزرسانی دادهها با استفاده از متدهای updateXXX() استفاده کنیم.
- شی ResultSet نشانگر را قبل از ردیف اول دادههای نتیجه نشان میدهد. با استفاده از متد ()next، میتوانیم از طریق ResultSet تکرار کنیم.
- ما روشهای ناوبری ResultSet برای حرکت بیشتر در شی ResultSet داریم
- ResultMetaData برای دریافت اطلاعات بیشتر در مورد ResultSet استفاده میشود. نام ستون، تعداد ستونها، نوع داده ستون، و غیره.
- DatabaseMetData برای دریافت اطلاعات در مورد پایگاه داده ای که به آن متصل کرده ایم استفاده می شود
سوالات متداول
Q #1) چه کاربردی داردResultSet؟
پاسخ: ResultSet برای ذخیره و بازیابی داده ها از DB استفاده می شود. زمانی که متد ()executeQuery اجرا شد، شی ResultSet را برمی گرداند. ما می توانیم از آن شی ResultSet در برنامه خود برای اجرای منطق استفاده کنیم.
Q #2) چگونه بررسی کنیم که ResultSet خالی است یا خیر؟
پاسخ: هیچ روش از پیش تعریف شده ای مانند length()، size() برای بررسی IsResultSet Empty وجود ندارد. ما میتوانیم از متد next() برای تکرار استفاده کنیم و اگر True را برگرداند، خالی نیست، اگر False را برگرداند به این معنی است که ResultSet خالی است.
Q #3) آیا ممکن است ResultSet باشد. ممکن است null باشد؟
پاسخ: خیر، متد executeQuery() شی ResultSet را برمی گرداند که ممکن است هرگز تهی نباشد.
Q #4) ResultSet قابل به روز رسانی چیست؟
پاسخ: یک شی ResultSet قابل به روز رسانی برای به روز رسانی داده ها در ستون، درج داده ها در ستون ها و حذف ردیف ها استفاده می شود. برای اینکه ResultSet را بهعنوان یک ResultSet بهروزرسانی کنیم، باید نوع اسکرول را حساس یا غیر حساس و نوع CONCUR را بهعنوان قابل بهروزرسانی درآوریم.
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE.
Q #5) چگونه میتوان نام پایگاه داده متصل شده را دریافت کرد؟
پاسخ: ما میتوانیم از متد getDatabaseProductName() شیء DatabaseMetaData استفاده کنیم.
نتیجهگیری
در این آموزش، ما در مورد چیزهایی صحبت کردهایم. رابط های ResultSet، ResultSetMetaData و DatabaseMetaData و روش های مهم آنها که معمولا در برنامه های JDBC استفاده می شود. ما هم دیده ایمنحوه به روز رسانی داده ها در DB با استفاده از ResultSet. ResultSetMetadata حاوی اطلاعاتی درباره ResultSet مانند نام ستون، تعداد ستون و غیره است.
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() میتوانیم از نامهای ستون یا Index استفاده کنیم.
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); }
همچنین میتوانیم به جای Column Name در متدهای 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
به طور پیش فرض، می توانیم داده ها/مقادیر را در ResultSet که به عنوان خروجی از دستور SQL اجرا شده در جهت جلو بازگردانده شده اند، تکرار کنیم. میتوانیم با استفاده از Scrollable ResultSet مقادیر را در جهتهای دیگر تکرار کنیم. ما می توانیم نوع و همزمانی ResultSet را هنگام ایجاد اشیاء Statement، PreparedStatement و CallableStatement مشخص کنیم.
3 نوع در ResultSet وجود دارد. آنها عبارتند از:
- TYPE_FORWARD_ONLY: این گزینه پیش فرض است، جایی که مکان نما از ابتدا تا انتها حرکت می کند، یعنی در جهت جلو.
- . 4>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 بهروزرسانی کنیم.
بعضی پایگاههای داده از حالت همزمانی برای همه پشتیبانی نمیکنند. انواع ResultSet. در آن صورت، باید بررسی کنیم که آیا آنها از نوع و حالت همزمانی مورد نظر ما با استفاده از متد supportsResultSetConcurrency() پشتیبانی میکنند یا خیر.
روشها در ResultSet Interface
4 دسته از متدهای ResultSet وجود دارد. آنها عبارتند از:
- روشهای ناوبری
- روشهای دریافت کننده
- روشهای تنظیم
- روشهای متفرقه
ابتدا روشهای ناوبری را مورد بحث قرار میدهیم و سپس به جلوتر میرویم.
#1) روشهای ناوبری
این روش برای حرکت مکاننما در اطراف مجموعه داده استفاده میشود.
- Boolean absolute(int row): برای انتقال مکان نما به ردیف مشخصی که در پارامتر ذکر شده است استفاده می شود و در صورت موفقیت آمیز بودن عملیات، مقدار true را برمی گرداند.
- باطلafterLast(): باعث می شود مکان نما ResultSet بعد از آخرین ردیف حرکت کند.
- Void beforeFirst(): باعث می شود مکان نما ResultSet قبل از ردیف اول حرکت کند.
- Boolean first(): باعث می شود مکان نما ResultSet به ردیف اول حرکت کند. در صورت موفقیت آمیز بودن عملیات، مقدار True را برمی گرداند و در غیر این صورت False.
- Boolean last(): باعث می شود مکان نما ResultSet به ردیف آخر حرکت کند. در صورت موفقیت آمیز بودن عملیات، مقدار True را برمی گرداند و در غیر این صورت نادرست است.
- بولی بعدی(): باعث می شود مکان نما ResultSet به ردیف بعدی منتقل شود. اگر رکوردهای بیشتری وجود داشته باشد True و اگر رکورد دیگری وجود نداشته باشد، False را برمی گرداند.
- Boolean previous(): باعث می شود مکان نما ResultSet به ردیف قبلی منتقل شود. در صورت موفقیت آمیز بودن عملیات، مقدار True را برمی گرداند، در غیر این صورت False.
- Boolean relative(): مکان نما را به تعداد ردیف های داده شده در جهت جلو یا عقب حرکت می دهد.
- Int getRow(): شماره ردیف فعلی را که شی ResultSet اکنون به آن اشاره می کند برمی گرداند.
- Void moveToCurrentRow(): مکان نما را به عقب برمی گرداند. سطر فعلی اگر در حال حاضر در ردیف درج باشد.
- Void moveToInsertRow(): مکان نما را به سطر خاصی منتقل می کند تا سطر را در پایگاه داده وارد کند. مکان فعلی مکان نما را به خاطر می آورد. بنابراین می توانیم از متد moveToCurrentRow() برای انتقال مکان نما به ردیف فعلی پس از درج استفاده کنیم.
در این آموزش،همه برنامه ها به زبان جاوا نوشته شده اند. ما از نسخه جاوا 8 و Oracle DB استفاده کرده ایم.
>>نرم افزار Oracle را می توانید از اینجا دانلود کنید
>>نسخه 8 جاوا را می توانید از اینجا دانلود کنید
فرآیند نصب گام به گام جاوا را دارد.
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:
داده ها در جدول جزئیات_کارمند
توضیح:
در برنامه فوق اولین()، last()، beforeFirst()، afterLast()، next( را پیاده سازی کرده ایم. متدهای قبلی()، absolute()، relative() و getRow() در ResultSet. برای استفاده از این روشها، مقادیر ResultSet.TYPE_SCROLL_SENSITIVE، ResultSet.CONCUR_UPDATABLE را در روش PrepareStatement تنظیم میکنیم.
بعد، روشهای Getter در ResultSet چیست:
#2) Getter Methods
ResultSet داده های جدول را از پایگاه داده ذخیره کرده است. برای بدست آوردن مقادیر جدول در ResultSet از متدهای دریافت کننده استفاده می شود. برای آن، باید مقدار Index ستون یا Column Name را ارسال کنیم.
روش های دریافت کننده در ResultSet زیر هستند:
- int getInt (int ColumnIndex): برای بدست آوردن مقدار ستون مشخص شده Index به عنوان یک نوع داده int استفاده می شود.
- float getFloat(int ColumnIndex): برای بدست آوردن استفاده می شود. مقدار ستون مشخص شده Index به عنوان یک نوع داده شناور.
- java.sql.dategetDate(int ColumnIndex): برای بدست آوردن مقدار ستون مشخص شده Index به عنوان مقدار تاریخ استفاده می شود.
- int getInt(String ColumnName): برای بدست آوردن استفاده می شود. مقدار ستون مشخص شده به عنوان یک نوع داده int.
- float getFloat(String ColumnName): برای دریافت مقدار ستون مشخص شده به عنوان نوع داده شناور استفاده می شود.
- Java.sql.date getDate(String ColumnName): برای بدست آوردن مقدار ستون مشخص شده به عنوان مقدار تاریخ استفاده می شود.
روش های دریافت کننده وجود دارد برای همه انواع داده های ابتدایی (Boolean، long، double) و String نیز در رابط ResultSet. ما می توانیم یک آرایه و نوع باینری از داده ها را نیز از پایگاه داده بدست آوریم. روشهایی نیز برای آن وجود دارد.
#3) روشهای تنظیمکننده/بهروزرسانی
ما میتوانیم مقدار را در پایگاه داده با استفاده از روشهای ResultSet Updater بهروزرسانی کنیم. این شبیه به متدهای Getter است، اما در اینجا باید مقادیر/دادهها را برای ستون خاص برای بهروزرسانی در پایگاه داده ارسال کنیم.
روشهای بهروزرسانی در ResultSet زیر هستند:
- void updateInt(int ColumnIndex, int Value): برای به روز رسانی مقدار ستون مشخص شده Index با مقدار int استفاده می شود.
- void updateFloat(int ColumnIndex, float f): برای به روز رسانی مقدار ستون مشخص شده Index با مقدار float استفاده می شود.
- void updateDate(int ColumnIndex, Date d): برای به روز رسانی مقدار ستون مشخص شده Index استفاده می شودبا مقدار تاریخ.
- void updateInt(String ColumnName, int Value): برای به روز رسانی مقدار ستون مشخص شده با مقدار int داده شده استفاده می شود.
- void updateFloat(String ColumnName, float f): برای به روز رسانی مقدار ستون مشخص شده با مقدار float داده شده استفاده می شود.
- Java.sql.date getDate(string ColumnName): برای به روز رسانی مقدار ستون مشخص شده با مقدار تاریخ داده شده استفاده می شود.
روش های Updater برای همه انواع داده های اولیه (Boolean، long، double) و String وجود دارد. همچنین در رابط ResultSet.
روش های Updater فقط داده ها را در شی ResultSet به روز می کنند. پس از فراخوانی متد insertRow یا updateRow، مقادیر در DB به روز می شوند.
به روز رسانی یک ردیف:
می توانیم با فراخوانی متدهای updateX() داده ها را پشت سر هم به روز کنیم. ، ارسال نام یا نمایه ستون و مقادیر برای به روز رسانی. در روش updateX می توانیم از هر نوع داده ای به جای X استفاده کنیم. تا به حال، ما داده ها را در شی ResultSet به روز کرده ایم. برای به روز رسانی داده ها در DB، باید متد updateRow() را فراخوانی کنیم.
درج یک ردیف:
برای حرکت مکان نما باید از moveToInsertRow() استفاده کنیم. برای درج یک ردیف جدید قبلاً در قسمت روشهای ناوبری به این موضوع پرداخته ایم. در مرحله بعد، باید متد ()updateX را فراخوانی کنیم تا داده ها را به ردیف اضافه کنیم. ما باید داده هایی را برای تمام ستون ها ارائه دهیم، در غیر این صورت از مقدار پیش فرض آن استفاده می شودستون.
بعد از به روز رسانی داده ها، باید متد insertRow() را فراخوانی کنیم. سپس از متد moveToCurrentRow() استفاده کنید تا موقعیت مکان نما را به ردیفی که قبل از درج یک ردیف جدید در آن بودیم برگردانید.
ResultSet Example:
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. سپس با استفاده از متد last() ResultSet داده های آخرین ردیف را در جدول working_details نمایش دادیم. متد moveToInsertRow() باعث می شود مکان نما به ردیف فعلی اشاره کند، اکنون ردیف فعلی آخرین ردیف است.
متدهای updateXXX() برای به روز رسانی مقادیر به سطر و متد insertRow() داده ها را در آن درج کرده است. یک ردیف جدید با استفاده از متد absolute() ما مکان نما را طوری قرار دادیم که به ردیف پنجم اشاره کند. متد UpdateInt() برای به روز رسانی EMPNUM با شناسه جدید پنجمین کارمند در جدول استفاده شده است. پس از آن، داده ها را برای بررسی اینکه آیا EMPNUM به روز شده است یا نه، نمایش داده می شود.
مکان نما را با استفاده از last() به آخرین ردیف جدول نشان می دهد و آن را نمایش می دهد. برای اجرای منطق فوق، باید مقادیر ResultSet.TYPE_SCROLL_INSENSITIVE، ResultSet.CONCUR_UPDATABLE را در روشprepareStatement تنظیم کنیم.
#4) روش های متفرقه
- void close(): برای بستن نمونه ResultSet و آزاد کردنمنابع مرتبط با نمونه ResultSet.
- ResultSetMetaData getMetaData(): نمونه ResultSetMetaData را برمی گرداند. اطلاعات مربوط به نوع و ویژگی ستون های خروجی پرس و جو را دارد. در بخش بعدی درباره ResultSetMetaData بیشتر خواهیم آموخت.
ResultSetMetaData
Metadata چیست؟
Metadata چیست؟ به معنی داده در مورد داده است. با استفاده از این رابط، اطلاعات بیشتری در مورد ResultSet به دست خواهیم آورد. در بسته java.sql موجود است. هر شی ResultSet با یک شی ResultSetMetaData مرتبط است.
این شی جزئیات ویژگی های ستون ها مانند نوع داده ستون، نام ستون، تعداد ستون ها، نام جدول، نام طرح و غیره را خواهد داشت. میتوانیم شی ResultSetMetaData را با استفاده از متد getMetaData() ResultSet دریافت کنیم.
Syntax ResultSetMetaData:
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”); ResultSetMetaData rsmd = rs.getMetaData();
روشهای مهم رابط ResultSetMetaData:
نام روش | توضیح |
---|---|
رشته getColumnName (ستون int) | نام ستون ستون خاص را برمیگرداند |
رشته getColumnTypeName(ستون int) | نوع داده را برمیگرداند ستون خاصی که به عنوان پارامتر ارسال کرده ایم |
String getTableName(int column) | نام جدول ستون را برمی گرداند |
رشته getSchemaName(ستون int) | این |