У цьому уроці пояснюється, як використовувати 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 підтримує курсор на даних результату. За замовчуванням, курсор знаходиться перед першим рядком даних результату.
Метод next() використовується для переміщення курсору на наступну позицію у напрямку вперед. Він повертає FALSE, якщо більше немає записів. Він отримує дані шляхом виклику методу executeQuery() з використанням будь-якого об'єкта оператора. Це може бути об'єкт Statement, PreparedStatement або CallableStatement. Інтерфейси PreparedStatement та CallableStatement є підінтерфейсами оператора Statementінтерфейс.
Інтерфейс операторів
Оператор statemnt1 = conn.createStatement(); Множина результатів rs1 = statemnt1.executeQuery("Select * from EMPLOYEE_DETAILS");
Інтерфейс PreparedStatement
Підготовлений оператор pstatemnt1 = conn.prepareStatement(insert_query); Множина результатів 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, які повернулися як результат виконаного SQL-запиту, у прямому напрямку. Ми можемо ітерувати значення в інших напрямках, використовуючи Scrollable ResultSet. Ми можемо вказати тип і паралельність ResultSet під час створення об'єктів Statement, PreparedStatement і CallableStatement.
У ResultSet є 3 типи:
- TYPE_FORWARD_ONLY: За замовчуванням курсор рухається від початку до кінця, тобто в прямому напрямку.
- TYPE_SCROLL_INSENSITIVE: У цьому типі курсор буде рухатися як вперед, так і назад. Якщо ми вносимо будь-які зміни в дані під час ітерації збережених даних, вони не оновляться в наборі даних, якщо хтось змінить дані в БД. Тому що в наборі даних є дані з того моменту, коли SQL-запит повертає дані.
- TYPE_SCROLL_SENSITIVE: Він схожий на TYPE_SCROLL_INSENSITIVE, різниця полягає в тому, що якщо хтось оновлює дані після того, як SQL-запит повернув дані, під час ітерації він буде відображати зміни в наборі даних.
Паралелізм ResultSet Паралелізм
У ResultSet є 2 режими одночасності, а саме
- ResultSet.CONCUR_READ_ONLY: Це режим паралелізму за замовчуванням. Ми можемо лише читати дані у ResultSet. Оновлення не застосовується.
- ResultSet.CONCUR_UPDATABLE: Ми можемо оновити дані в об'єкті ResultSet.
Деякі бази даних не підтримують режим паралельності для всіх типів ResultSet. У такому випадку нам потрібно перевірити, чи підтримують вони потрібний нам тип і режим паралельності за допомогою методу supportsResultSetConcurrency().
Методи в інтерфейсі ResultSet
Існує 4 категорії методів ResultSet, а саме
- Методи навігації
- Методи Геттера
- Методи налаштування
- Різні методи
Спочатку ми обговоримо методи навігації, а потім підемо далі.
#1) Методи навігації
Цей метод використовується для переміщення курсору по набору даних.
- Boolean absolute(int row): Використовується для переміщення курсору до вказаного рядка, який згадується в параметрі, і повертає true, якщо операція пройшла успішно, інакше повертає false.
- Void afterLast(): Це змушує курсор ResultSet переміститися після останнього рядка.
- Void beforeFirst(): Це змушує курсор ResultSet переміститися до першого рядка.
- Булеве first(): Змушує курсор ResultSet переміститися на перший рядок. Повертає True, якщо операція пройшла успішно, інакше False.
- Boolean last(): Змушує курсор ResultSet переміститися до останнього рядка. Повертає True, якщо операція пройшла успішно, інакше False.
- Boolean next(): Вона переміщує курсор ResultSet на наступний рядок і повертає значення True, якщо є ще записи, і значення False, якщо записів більше немає.
- Boolean previous(): Змушує курсор ResultSet переміститися на попередній рядок. Повертає True, якщо операція пройшла успішно, інакше False.
- Булеве відношення(): Вона переміщує курсор на задану кількість рядків у прямому або зворотному напрямку.
- Int getRow(): Він повертає поточний номер рядка, на який вказує об'єкт ResultSet.
- Void moveToCurrentRow(): Вона повертає курсор до поточного рядка, якщо він знаходиться у вставленому рядку.
- Void moveToInsertRow(): Він переміщує курсор на певний рядок, щоб вставити його в базу даних. Він запам'ятовує поточне розташування курсору. Тому ми можемо використовувати метод moveToCurrentRow(), щоб перемістити курсор на поточний рядок після вставки.
У цьому підручнику всі програми написані на мові Java. Ми використовували версію Java 8 та базу даних Oracle.
Завантажити програмне забезпечення 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 Автоматично згенерована заглушка методу //Запит на вибірку String select_query = "select * fromemployee_details"; Class.forName("oracle.jdbc.driver.OracleDriver"); //Підключення до БД Oracle try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:X E")) { //Створення об'єкту DatabaseMetaData DatabaseMetaData dbmd = conn.getMetaData(); //Перевірка, чи підтримує драйвер чутливий до прокрутки тип та узгоджене оновлення булеве isSupportResultSetType =dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Створення підготовленого оператору PreparedStatement pstatemnt1 = conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet. CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(); //Переміщення курсору на перший рядок 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)); //Переміщення курсору в останній рядок 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)); //Переміщення курсору до початку першого ряду rs.beforeFirst();System.out.println("Cursor is pointed at before the first row. Use next() to move in forward direction"); //Переміщення курсору на перший рядок за допомогою функції 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)); //Переміщення курсору на рядок, що слідує за попереднім, за допомогою функції rs.afterLast(); System.out.println("Cursoris pointed at after the last row. Use previous() to move in backward direction"); //Переміщення курсору на останній рядок за допомогою 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)); //Переміщення курсору на третій рядок rs.absolute(3); System.out.println("Курсор вказує на 3row"); System.out.println("THIRD ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Переміщення курсору на попередній рядок третього рядка rs.relative(-1); System.out.println("Курсор знаходиться на 1 рядку, що передує 3-му рядку"); System.out.println("THIRD ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+rs.getString(2)+"\n ПЕРШЕ ІМ'Я = " + rs.getString(3)); //Переміщення курсору на точку 4-го рядка після 2-го рядка rs.relative(4); System.out.println("Курсор знаходиться на 4-му рядку після 2-го рядка"); System.out.println("ШОСТИЙ РЯД \n EMP NUM = " + rs.getInt("empNum") +"\n ОСТАТОЧНЕ ІМ'Я = "+ rs.getString(2)+"\n ПЕРШЕ ІМ'Я = " + rs.getString(3)); //Переміщення курсору на точку поточного рядкаSystem.out.println(" Current Row = " + rs.getRow()); } } catch (SQLException e) { e.printStackTrace(); } } }
ВИХІД:
Дані в таблиці Employee_details
Пояснення:
У вищенаведеній програмі ми реалізували методи first(), last(), beforeFirst(), afterLast(), next(), previous(), absolute(), relative() та getRow() в ResultSet. Для використання цих методів ми встановили значення ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE в методі prepareStatement.
Далі ми обговоримо, що таке методи Getter у ResultSet:
#2) Методи геттерів
ResultSet зберігає дані таблиці з бази даних. Методи Getter використовуються для отримання значень таблиці в ResultSet. Для цього нам потрібно передати або значення індексу стовпця, або ім'я стовпця (Column Name).
Нижче наведено методи getter у ResultSet:
- int getInt(int ColumnIndex): Використовується для отримання значення вказаного стовпця Index як типу даних int.
- float getFloat(int ColumnIndex): Використовується для отримання значення вказаного стовпця Index як типу даних з плаваючою комою.
- java.sql.date getDate(int ColumnIndex): Використовується для отримання значення вказаного стовпця Index у вигляді дати.
- int getInt(String ColumnName): Використовується для отримання значення вказаного стовпця як тип даних int.
- float getFloat(String ColumnName): Використовується для отримання значення вказаного стовпця як типу даних float.
- Java.sql.date getDate(String ColumnName): Використовується для отримання значення вказаного стовпця у вигляді дати.
В інтерфейсі ResultSet є методи getter для всіх примітивних типів даних (Boolean, long, double), а також String. Ми можемо отримати масив і бінарний тип даних також з бази даних. Для цього також є методи.
#3) Методи встановлення/оновлення
Ми можемо оновити значення в базі даних за допомогою методів ResultSet Updater. Вони схожі на методи Getter, але тут нам потрібно передати значення/дані для конкретного стовпця, які потрібно оновити в базі даних.
Нижче наведено методи оновлення у ResultSet:
- void updateInt(int ColumnIndex, int Value): Використовується для оновлення значення вказаного стовпця Index значенням типу int.
- void updateFloat(int ColumnIndex, float f): Використовується для оновлення значення вказаного стовпця Index значенням з плаваючою комою.
- void updateDate(int ColumnIndex, Date d): Використовується для оновлення значення вказаного стовпця Index значенням дати.
- void updateInt(String ColumnName, int Value): Використовується для оновлення значення вказаного стовпчика заданим значенням int.
- void updateFloat(String ColumnName, float f): Використовується для оновлення значення вказаного стовпчика заданим значенням з плаваючою комою.
- Java.sql.date getDate(String ColumnName): Використовується для оновлення значення вказаного стовпця заданим значенням дати.
В інтерфейсі ResultSet є методи Updater для всіх примітивних типів даних (булевий, довгий, подвійний) та String.
Методи оновлення просто оновлюють дані в об'єкті ResultSet. Значення будуть оновлені в БД після виклику методу insertRow або updateRow.
Оновлення рядка:
Ми можемо оновити дані в рядку, викликаючи методи updateX(), передаючи ім'я або індекс стовпця та значення, які потрібно оновити. Ми можемо використовувати будь-який тип даних замість X в методі updateX. Досі ми оновлювали дані в об'єкті ResultSet. Щоб оновити дані в БД, ми повинні викликати метод updateRow().
Вставка рядка:
Нам потрібно використати метод moveToInsertRow() для переміщення курсору, щоб вставити новий рядок. Ми вже розглядали це в розділі "Методи навігації". Далі нам потрібно викликати метод updateX(), щоб додати дані до рядка. Ми повинні надати дані для всіх стовпців, інакше буде використано значення за замовчуванням для цього конкретного стовпця.
Після оновлення даних нам потрібно викликати метод insertRow(), а потім за допомогою методу moveToCurrentRow() повернути курсор до того рядка, на якому він знаходився до початку вставки нового рядка.
Приклад 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 Автоматично згенерований метод-заглушка String select_query ="select empnum,lastName,firstName from employee_details"; String insert_query = "вставити в employee_details values(?,?,?,?,?,?,?,?)"; Class.forName("oracle.jdbc.driver.OracleDriver"); //Підключення до БД Oracle try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE")) { //Створення об'єкта DatabaseMetaData DatabaseMetaData dbmd = conn.getMetaData();//Перевірка, чи драйвер підтримує нечутливий до прокрутки тип та узгоджене оновлення boolean isSupportResultSetType = dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Створення підготовленого оператора PreparedStatement pstatemnt1 =conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(select_query); //Переміщення курсору на останній рядок таблиці rs.last(); System.out.println("ОСТАННІЙ РЯДОК: Перед вставкою нового співробітника"); System.out.println("ОСТАННІЙ РЯДОК: EMPNUM = " + rs.getInt(1)); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\nLAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Задання значень для вставки в таблицю EMPLOYEE_DETAILS //Переміщення курсору на точку вставки рядка в таблицю rs.moveToInsertRow(); //Оновлення значення EMPNUM rs.updateInt(1, 1017); //Оновлення значення LAST NAME rs.updateString(2, "Бонд"); //Оновлення значення FIRST NAME rs.updateString(3, "Джеймс"); //Вставлення нового рядка rs.insertRow();//Переміщення курсору в точку 5-го рядка rs.absolute(5); System.out.println("До оновлення EMPNUM 5-го рядка"); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = " + rs.getString(2)+ "\n FIRST NAME = " + rs.getString(3)); System.out.println("Оновлення ідентифікатора EMP 5-го СПІВРОБІТНИКА"); //Оновлення EMPNUM 5-го рядка rs.updateInt(1 3005); rs.updateRow(); System.out.println("\n EMPNUM = " + 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. Потім ми відобразили дані останнього рядка в таблиці employee_details за допомогою методу last() об'єкта ResultSet. Метод moveToInsertRow() переводить курсор на поточний рядок, тепер поточний рядок є останнім рядком.
Методи updateXXX() використано для оновлення значень у рядку, а метод insertRow() вставив дані в новий рядок. За допомогою методу absolute() ми встановили курсор на 5-й рядок. Метод UpdateInt() використано для оновлення EMPNUM новим ідентифікатором 5-го працівника в таблиці. Після цього відобразили дані, щоб перевірити, чи оновлено EMPNUM чи ні.
Зробили наведення курсору на останній рядок таблиці за допомогою last() і вивели його. Щоб виконати наведену вище логіку, нам потрібно встановити значення ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE в методі prepareStatement.
#4) Різні методи
- void close(): Використовується для закриття екземпляра ResultSet і звільнення ресурсів, пов'язаних з екземпляром ResultSet.
- ResultSetMetaData getMetaData(): Він повертає екземпляр ResultSetMetaData, який містить інформацію про тип і властивості стовпців, що виводяться в результаті запиту. Ми дізнаємося більше про ResultSetMetaData в наступному розділі.
ResultSetMetaData
Що таке метадані?
Метадані - це дані про дані. За допомогою цього інтерфейсу ми отримаємо більше інформації про ResultSet. Він доступний у пакеті java.sql. Кожен об'єкт ResultSet пов'язаний з одним об'єктом ResultSetMetaData.
Цей об'єкт міститиме детальну інформацію про властивості стовпців, такі як тип даних стовпця, назва стовпця, кількість стовпців, назва таблиці, назва схеми і т.д. Ми можемо отримати об'єкт ResultSetMetaData за допомогою методу getMetaData() функції ResultSet.
Синтаксис ResultSetMetaData:
Підготовлений оператор pstatemnt1 = conn.prepareStatement(insert_query); Набір результатів rs1 = pstatemnt1.executeQuery("Select * from EMPLOYEE_DETAILS"); Набір метаданих rsmd = rs.getMetaData();
Важливі методи інтерфейсу ResultSetMetaData:
Назва методу | Опис |
---|---|
String getColumnName(int column) | Повертає назву конкретного стовпця |
String getColumnTypeName(int column) | Він повертає тип даних конкретного стовпця, який ми передали як параметр |
String getTableName(int column) | Повертає назву стовпця таблиці |
String getSchemaName(int column) | Повертає назву схеми таблиці стовпця |
int getColumnCount() | Повертає кількість стовпців результуючого набору ResultSet |
boolean isAutoIncrement(int Column) | Повертає true, якщо заданий стовпець є автоінкрементом, інакше false |
boolean isCaseSensitive(int Column) | Повертає true, якщо заданий стовпець чутливий до регістру, інакше false |
Приклад 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 Автоматично згенерована заглушка методу String QUERY= " select * fromemployee_details"; Class.forName("oracle.jdbc.driver.OracleDriver"); try(З'єднання 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("Використовується ResultSetMetaData");System.out.println("Кількість: стовпців: "+ rsmd.getColumnCount()); System.out.println("Назва стовпця 1: "+ rsmd.getColumnName(1)); System.out.println("Тип даних стовпця 2: " + rsmd.getColumnTypeName(2)); System.out.println("Назва таблиці стовпця 1: " + rsmd.getTableName(1)); System.out.println("Ім'я таблиці стовпця 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() | Повертає назви схем, доступних у підключеній базі даних |
Рядок getStringFunctions() | Повертає список рядкових функцій, доступних у підключеній базі даних |
String getTimeDateFunctions() | Повертає список функцій часу і дати, доступних у підключеній базі даних |
Рядок getURL() | Він повертає URL-адресу бази даних |
Boolean isReadOnly() | Повертає, чи знаходиться база даних в режимі тільки для читання |
Boolean підтримуєBatchUpdates() | Повертає, чи підтримує база даних пакетні оновлення |
Boolean підтримуєSavepoints() | Повертає, чи підтримує база даних точки збереження |
Boolean підтримуєStatementPooling() | Повертає, чи підтримує база даних об'єднання операторів |
Boolean підтримуєStoredProcedures() | Повертає, чи підтримує база даних збережені процедури |
Boolean підтримуєOuterJoins() | Повертає, чи підтримує база даних зовнішнє приєднання |
Тут ми перерахували деякі важливі методи інтерфейсу DatabaseMetaData. Ви можете звернутись до офіційного сайту інтерфейсу Оракул де ви можете побачити всі методи, доступні в інтерфейсі 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 { // Заглушка методу, що створюється в процесі виконання TODOClass.forName("oracle.jdbc.driver.OracleDriver"); З'єднання conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE"); DatabaseMetaData dbmd = conn.getMetaData(); System.out.println("Using DatabaseMetaData"); System.out.println("Ім'я драйвера: " + dbmd.getDriverName()); System.out.println("Версія драйвера: " + dbmd.getDriverVersion()); System.out.println("КористувачБаза даних: " + dbmd.getUserName()); System.out.println("Назва продукту бази даних:" + dbmd.getDatabaseProductName()); System.out.println("Версія продукту бази даних:" + dbmd.getDatabaseProductVersion()); System.out.println("Список рядкових функцій у базі даних:" + dbmd.getStringFunctions()); System.out.println("Список функцій часу і дати у базі даних:" + dbmd.getTimeDateFunctions());System.out.println("URL бази даних: " + dbmd.getURL()); System.out.println("База даних доступна тільки для читання? " + dbmd.isReadOnly()); System.out.println("Підтримувати пакетні оновлення? " + dbmd.supportsBatchUpdates()); System.out.println("Підтримувати точки збереження? " + dbmd.supportsSavepoints()); System.out.println("Підтримувати об'єднання операторів? " + dbmd.supportsStatementPooling()); System.out.println("Підтримувати зберіганняПроцедури? " + dbmd.supportsStoredProcedures()); System.out.println("Support Outer Join? "+ dbmd.supportsOuterJoins()); } }
ВИХІД:
Пояснення:
У наведеній вище програмі ми використали/реалізували методи getDriverName(), getDriverVersion(), getUserName(), getDatabaseProductName(), getDatabaseProductVersion(), getStringFunctions(), getTimeDateFunctions(), getURL(), isReadOnly(), supportsBatchUpdates(), supportsStatementPooling(), supportsSavepoints(), supportsStoredProcedures() та supportsOuterJoins() у DatabaseMetaData Interface.
Моменти, на які слід звернути увагу:
- Інтерфейс JDBC ResultSet використовується для зберігання даних з бази даних і використання їх у нашій програмі на Java.
- Ми також можемо використовувати ResultSet для оновлення даних за допомогою методів updateXXX().
- Об'єкт ResultSet вказує курсор перед першим рядком результуючих даних. За допомогою методу next() ми можемо ітераційно переглядати ResultSet.
- Для переміщення далі в об'єкті ResultSet у нас є методи навігації ResultSet
- ResultMetaData використовується для отримання додаткової інформації про ResultSet, такої як назва стовпця, кількість стовпців, тип даних стовпця тощо.
- DatabaseMetData використовується для отримання інформації про базу даних, яку ми підключили
Поширені запитання
Питання #1) Для чого використовується ResultSet?
Відповідай: ResultSet використовується для зберігання та отримання даних з БД. Коли метод executeQuery() виконається, він поверне об'єкт ResultSet. Ми можемо використовувати цей об'єкт ResultSet у нашій програмі для виконання логіки.
Q #2) Як перевірити, чи порожній ResultSet чи ні?
Відповідай: Для перевірки на порожність результуючої множини немає попередньо визначених методів, таких як length(), size(). Ми можемо використовувати метод next() для ітерації, і якщо він повертає True, то множина не порожня, якщо він повертає False, це означає, що результуюча множина порожня.
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 містить інформацію про базу даних.
<