В этом уроке рассказывается о том, как использовать 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. Это может быть объект Statement, PreparedStatement или CallableStatement. Интерфейсы PreparedStatement и CallableStatement являются подинтерфейсами Statement.интерфейс.
Интерфейс заявления
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 - тип данных столбца. Мы можем использовать либо имена столбцов, либо индекс для получения значений с помощью методов 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: В этом типе курсор будет перемещаться как вперед, так и назад. Если мы сделаем какие-либо изменения в данных во время итерации хранимых данных, они не будут обновляться в наборе данных, если кто-то изменит данные в DB. Потому что набор данных содержит данные с того момента, когда SQL запрос возвращает данные.
- TYPE_SCROLL_SENSITIVE: Он аналогичен TYPE_SCROLL_INSENSITIVE, с той разницей, что если кто-либо обновляет данные после того, как SQL-запрос вернул данные, во время итерации он будет отражать изменения в наборе данных.
Параллельность наборов результатов
Существует 2 режима параллелизма в ResultSet, а именно:
- 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 перемещаться перед первой строкой.
- Boolean first(): Заставляет курсор ResultSet переместиться на первую строку. Возвращает True, если операция успешна, иначе False.
- Boolean last(): Заставляет курсор ResultSet переместиться на последнюю строку. Возвращает True, если операция успешна, иначе False.
- Boolean next(): Заставляет курсор ResultSet перейти к следующей строке. Возвращает True, если есть еще записи, и False, если записей больше нет.
- Boolean previous(): Заставляет курсор ResultSet переместиться на предыдущую строку. Возвращает True, если операция успешна, иначе False.
- Boolean relative(): Он перемещает курсор на заданное количество строк в прямом или обратном направлении.
- Int getRow(): Он возвращает номер текущей строки, на которую указывает объект ResultSet.
- Void moveToCurrentRow(): Он перемещает курсор обратно в текущую строку, если он находится в строке вставки.
- Void 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 * fromemployee_details"; Class.forName("oracle.jdbc.driver.OracleDriver"); //Подключение к Oracle DB try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:X E")) { //Создание объекта DatabaseMetaData DatabaseMetaData dbmd = conn.getMetaData(); //Проверка того, поддерживает ли драйвер чувствительный к прокрутке тип и concur updatable boolean isSupportResultSetType = 1.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)); //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("Курсор находится перед первой строкой. Используйте next() для движения вперед"); //Перемещение курсора в первую строку с помощью next() rs.next(); System.out.println("ПЕРВАЯ СТРОКА \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Перемещение курсора в точку после последней строки rs.afterLast(); System.out.println("Курсоруказывает на последнюю строку. Используйте previous() для перемещения в обратном направлении"); //Перемещение курсора в последнюю строку с помощью 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("Курсор указывает на 3-ю строку.ряд"); System.out.println("ТРЕТИЙ РЯД \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 ряд, предшествующий третьему ряду"); System.out.println("Второй ряд \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Перемещение курсора в точку 4-й строки после 2-й строки rs.relative(4); System.out.println("Курсор направлен на 4-ю строку после 2-й строки"); System.out.println("ШЕСТАЯ СТРОКА \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Перемещение курсора в точку текущей строкиSystem.out.println(" Текущая строка = " + 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. Для этого нам нужно передать либо значение индекса столбца, либо имя столбца.
Ниже перечислены методы getter в ResultSet:
- int getInt(int ColumnIndex): Используется для получения значения указанного столбца Index в виде типа данных int.
- float getFloat(int ColumnIndex): Используется для получения значения указанного столбца Index как типа данных float.
- 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 для всех примитивных типов данных (Boolean, long, double) и String.
Методы Updater просто обновляют данные в объекте ResultSet. Значения будут обновлены в БД после вызова метода insertRow или updateRow.
Обновление строки:
Мы можем обновлять данные в строке, вызывая методы updateX(), передавая имя столбца или индекс, а также значения для обновления. Мы можем использовать любой тип данных вместо X в методе updateX. До сих пор мы обновляли данные в объекте ResultSet. Чтобы обновить данные в DB, мы должны вызвать метод 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 = "insert into 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();//Проверка того, поддерживает ли драйвер нечувствительный к прокрутке тип и concur updatable 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("LAST ROW: Before inserting new Employee"); System.out.println("LAST ROW: 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, "Bond"); //Обновление значения FIRST NAME rs.updateString(3, "James"); //Вставка новой строки 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 id 5-го EMPLOYEE"); //Обновление 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:
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) | Возвращает имя схемы таблицы столбца |
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 Auto-generated method stub String QUERY= " select * fromemployee_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(" Мы используем 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() | Он возвращает список строковых функций, доступных в подключенной базе данных |
String getTimeDateFunctions() | Возвращает список функций времени и даты, доступных в подключенной базе данных |
String getURL() | Он возвращает URL для базы данных |
Boolean isReadOnly() | Возвращает, находится ли база данных в режиме только для чтения |
Boolean supportsBatchUpdates() | Возвращает, поддерживает ли база данных пакетные обновления |
Boolean supportsSavepoints() | Возвращает, поддерживает ли база данных точки сохранения |
Boolean supportsStatementPooling() | Возвращает, поддерживает ли база данных пулинг утверждений. |
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 Автоматическая генерация заглушки метода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База данных: " + 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("Поддерживать хранимые данные?Procedures? " + 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.
Следует отметить:
- Интерфейс JDBC ResultSet используется для хранения данных из базы данных и использования их в нашей Java-программе.
- Мы также можем использовать ResultSet для обновления данных с помощью методов updateXXX().
- Объект ResultSet указывает курсором на первую строку данных результата. Используя метод next(), мы можем выполнять итерации по ResultSet.
- У нас есть навигационные методы ResultSet для перемещения дальше в объекте ResultSet
- ResultMetaData используется для получения дополнительной информации о ResultSet, такой как имя столбца, количество столбцов, тип данных столбца и т.д.
- DatabaseMetData используется для получения информации о базе данных, к которой мы подключились
Часто задаваемые вопросы
Вопрос #1) Для чего используется ResultSet?
Ответ: ResultSet используется для хранения и получения данных из БД. После выполнения метода executeQuery() он возвращает объект ResultSet. Мы можем использовать этот объект ResultSet в нашей программе для выполнения логики.
Q #2) Как проверить, пуст ли ResultSet или нет?
Ответ: Для проверки IsResultSet Empty не существует предопределенных методов, таких как length(), size(). Мы можем использовать метод next() для итерации, и если он возвращает True, то ResultSet не пуст, если возвращает False, значит ResultSet пуст.
Q #3) Возможно ли, что ResultSet может быть null?
Ответ: Нет, метод executeQuery() возвращает объект ResultSet, который никогда не может быть null.
Вопрос # 4) Что такое обновляемый ResultSet?
Ответ: Обновляемый объект ResultSet используется для обновления данных в столбце, вставки данных в столбцы и удаления строк. Чтобы сделать ResultSet обновляемым, необходимо установить тип прокрутки как чувствительный или нечувствительный и тип CONCUR как обновляемый.
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE.
Q #5) Как получить имя базы данных, которая была подключена?
Ответ: Мы можем использовать метод getDatabaseProductName() объекта DatabaseMetaData.
Заключение
В этом учебнике мы рассмотрели интерфейсы ResultSet, ResultSetMetaData и DatabaseMetaData и их важные методы, часто используемые в программах JDBC. Мы также рассмотрели, как обновлять данные в БД с помощью ResultSet. ResultSetMetadata содержит информацию о ResultSet, такую как имя колонки, количество колонок и т.д.
DatabaseMetaData содержит информацию о базе данных.
<