Автор оригинала: Pankaj Kumar.
Интерфейс Java ResultSet является частью пакета java.sql. Это один из основных компонентов JDBC Framework . Объект ResultSet используется для доступа к результатам запросов, полученным из реляционных баз данных.
Набор результатов поддерживает курсор/указатель, который указывает на одну строку результатов запроса. Используя навигационные методы и методы получения, предоставляемые ResultSet, мы можем выполнять итерации и получать доступ к записям базы данных по одной. Результирующий набор также можно использовать для обновления данных.
Иерархия наборов результатов Java
На приведенной выше диаграмме показано место набора результатов в структуре JDBC. Набор результатов может быть получен путем выполнения SQL-запроса с использованием Оператора , PreparedStatement или CallableStatement .
Автоклавируемые , Обертка являются суперинтерфейсами набора результатов. Теперь мы увидим, как работать с набором результатов в наших Java-программах.
Пример набора результатов
Мы будем использовать MySQL для нашего примера. Используйте приведенный ниже сценарий базы данных для создания базы данных и таблицы вместе с некоторыми записями.
create database empdb; use empdb; create table tblemployee (empid integer primary key, firstname varchar(32), lastname varchar(32), dob date); insert into tblemployee values (1, 'Mike', 'Davis',' 1998-11-11'); insert into tblemployee values (2, 'Josh', 'Martin', '1988-10-22'); insert into tblemployee values (3, 'Ricky', 'Smith', '1999-05-11');
Давайте рассмотрим приведенный ниже пример программы для извлечения записей из таблицы и их печати на консоли. Пожалуйста, убедитесь, что у вас есть драйвер MySQL JDBC в пути к классу проекта.
package com.journaldev.examples; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Date; /** * Java Resultset Example of Retrieving records. * * @author pankaj * */ public class ResultSetDemo { public static void main(String[] args) { String query = "select empid, firstname, lastname, dob from tblemployee"; Connection conn = null; Statement stmt = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/empdb", "root", "root"); stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query); while (rs.next()) { Integer empId = rs.getInt(1); String firstName = rs.getString(2); String lastName = rs.getString(3); Date dob = rs.getDate(4); System.out.println("empId:" + empId); System.out.println("firstName:" + firstName); System.out.println("lastName:" + lastName); System.out.println("dob:" + dob); System.out.println(""); } rs.close(); } catch (Exception e) { e.printStackTrace(); } finally { try { stmt.close(); conn.close(); } catch (Exception e) {} } } }
Выход:
empId:1 firstName:Mike lastName:Davis dob:1998-11-11 empId:2 firstName:Josh lastName:Martin dob:1988-10-22 empId:3 firstName:Ricky lastName:Smith dob:1999-05-11
Объяснение :
- Набор результатов получается путем вызова метода ExecuteQuery в экземпляре инструкции. Первоначально курсор набора результатов указывает на позицию перед первой строкой.
- Метод next из набора результатов перемещает курсор в следующую строку. Он возвращает true, если есть еще одна строка, в противном случае он возвращает false.
- Мы можем получить данные из ResultSet , используя методы получения, предоставляемые it. например, getInt (), getString (), getDate()
- Все методы получения имеют два варианта. 1 st вариант принимает индекс столбца в качестве параметра, а 2 nd вариант принимает имя столбца в качестве параметра.
- Наконец, нам нужно вызвать закрыть метод в наборе результатов экземпляре, чтобы все ресурсы были очищены должным образом.
Типы наборов результатов и параллелизм
Мы можем указать тип и параллелизм набора результатов при создании экземпляра Statement, PreparedStatement или CallableStatement .
statement.createStatement(int resultSetType, int resultSetConcurrency)
Типы наборов результатов
1) Только вперед (ResultSet.TYPE_FORWARD_ONLY)
Экземпляр набора результатов этого типа может перемещаться только в прямом направлении от первой строки к последней строке. Результирующий набор можно переместить на одну строку вперед, вызвав метод next (). Мы можем получить набор результатов такого типа при создании экземпляра Statement, PreparedStatement или CallableStatement.
Statement stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery("select * from tbluser");
2) Нечувствительный к прокрутке (ResultSet.TYPE_SCROLL_INSENSITIVE)
Набор результатов без учета прокрутки может прокручиваться как в прямом, так и в обратном направлениях. Его также можно прокрутить до абсолютного положения, вызвав метод absolute (). Но он не чувствителен к изменениям данных. Он будет содержать данные только тогда, когда запрос был выполнен и получен результирующий набор. Он не будет отражать изменения, внесенные в данные после их получения.
Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery("select * from tbluser");
3) Чувствительный к прокрутке (ResultSet.TYPE_SCROLL_SENSITIVE)
Набор результатов, чувствительный к прокрутке, может прокручиваться как в прямом, так и в обратном направлениях. Его также можно прокрутить до абсолютного положения, вызвав метод absolute (). Но он чувствителен к изменениям данных. Он будет отражать изменения, внесенные в данные, пока он открыт.
Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery("select * from tbluser");
Параллелизм набора результатов
1) Только для чтения (ResultSet.CONCURR_READ_ONLY)
Это модель параллелизма по умолчанию. Мы можем выполнять операции только для чтения с экземпляром набора результатов. Никакие операции обновления не допускаются.
2) Обновляемый (ResultSet.CONCURR_UPDATABLE)
В этом случае мы можем выполнить операции обновления для экземпляра набора результатов.
Методы набора результатов
Мы можем разделить методы набора результатов на следующие категории.
- Навигационные методы
- Методы получения/считывания
- Методы настройки/обновления
- Разные методы – close() и getMetadata()
1. Навигационные методы набора результатов
- логический абсолютный( int строка) вызывает Исключение SQLException : Этот метод перемещает курсор набора результатов в указанную строку и возвращает значение true, если операция прошла успешно.
- void afterLast() вызывает Исключение SQLException : Этот метод перемещает курсор набора результатов в положение после последней строки.
- void beforeFirst() вызывает Исключение SQLException : Этот метод перемещает курсор набора результатов в положение перед первой строкой.
- логическое first() вызывает Исключение SQLException: Этот метод перемещает курсор набора результатов в первую строку.
- логическое значение last() вызывает Исключение SQLException: Этот метод перемещает курсор набора результатов в последнюю строку.
- логическое значение next() вызывает Исключение SQLException: Этот метод перемещает курсор набора результатов в следующую строку.
- логическое предыдущее() вызывает Исключение SQLException: Этот метод перемещает курсор набора результатов в предыдущую строку.
package com.journaldev.examples; import java.sql.*; /** * Java Resultset Example using navigational methods. * * @author pankaj * */ public class ResultSetDemo { public static void main(String[] args) { String query = "select empid, firstname, lastname, dob from tblemployee"; Connection conn = null; Statement stmt = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/empdb", "root", "root"); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery(query); System.out.println("All the rows of table=>"); while (rs.next()) { // Go to next row by calling next() method displayData(rs); } System.out.println("Now go directly to 2nd row=>"); rs.absolute(2); // Go directly to 2nd row displayData(rs); System.out.println("Now go to Previous row=>"); rs.previous(); // Go to 1st row which is previous of 2nd row displayData(rs); rs.close(); } catch (Exception e) { e.printStackTrace(); } finally { try { stmt.close(); conn.close(); } catch (Exception e) { } } } public static void displayData(ResultSet rs) throws SQLException { System.out.println("empId:" + rs.getInt(1)); System.out.println("firstName:" + rs.getString(2)); System.out.println("lastName:" + rs.getString(3)); System.out.println("dob:" + rs.getDate(4)); System.out.println(""); } }
Выход:
All the rows of table=> empId:1 firstName:Mike lastName:Davis dob:1998-11-11 empId:2 firstName:Josh lastName:Martin dob:1988-10-22 empId:3 firstName:Ricky lastName:Smith dob:1999-05-11 Now go directly to 2nd row=> empId:2 firstName:Josh lastName:Martin dob:1988-10-22 Now go to Previous row=> empId:1 firstName:Mike lastName:Davis dob:1998-11-11
2. Методы получения/считывания набора результатов
- int getInt( int ColumnIndex) вызывает Исключение SQLException: Этот метод возвращает значение указанного индекса столбца как int .
- long getLong( int ColumnIndex) вызывает Исключение SQLException: Этот метод возвращает значение указанного ColumnIndex как long
- Строка getString( int ColumnIndex) вызывает Исключение SQLException: Этот метод возвращает значение указанного ColumnIndex в виде Строки
- java.sql.Дата getDate( int ColumnIndex) вызывает Исключение SQLException: Этот метод возвращает значение указанного индекса столбца как java.sql.Дата
- int getInt(строковая метка столбца) вызывает Исключение SQLException: Этот метод возвращает значение указанного имени столбца как int .
- long getLong(строковая метка столбца) вызывает Исключение SQLException: Этот метод возвращает значение указанного имени столбца как long .
- Строка getString(Строковая метка столбца) вызывает Исключение SQLException: Этот метод возвращает значение указанного имени столбца в виде строки.
- java.sql.Date getDate(Строковая метка столбца) вызывает исключение SQLException: Этот метод возвращает значение указанного имени столбца как java.sql.Date .
- Набор результатов содержит методы получения, которые возвращают другие примитивные типы данных, такие как boolean, float и double. Он также имеет методы для получения массивов и двоичных данных из базы данных.
3. Методы настройки/обновления набора результатов
- void updateInt( int ColumnIndex, int x) вызывает Исключение SQLException: Этот метод обновляет значение указанного столбца текущей строки значением int .
- void updateLong( int ColumnIndex, long x) вызывает Исключение SQLException: Этот метод обновляет значение указанного столбца текущей строки значением long.
- void updateString(int ColumnIndex, строка x) вызывает исключение SQLException: Этот метод обновляет значение указанного столбца текущей строки значением строки .
- void UpdateDate( int ColumnIndex, java.sql.Дата x) вызывает Исключение SQLException: Этот метод обновляет значение указанного столбца текущей строки с помощью java.sql.Дата | значение. void updateInt(Строковая метка столбца, int x) вызывает исключение SQLException: Этот метод обновляет значение указанной метки столбца текущей строки значением int.
- void updateLong(строковая метка столбца, длинный x) вызывает исключение SQLException: Этот метод обновляет значение указанной метки столбца текущей строки значением long.
- void updateString(строка columnLabel, Строка x) вызывает исключение SQLException: Этот метод обновляет значение указанной метки столбца текущей строки значением строки
- . void
- обновленные данные(Строковая метка столбца, java.sql.Дата x) вызывает Исключение SQLException: Этот метод обновляет значение указанной метки столбца текущей строки значением java.sql.Дата.
Примечание: Методы Setter/Updater напрямую не обновляют значения базы данных. Значения базы данных будут вставлены/обновлены после вызова метода insertRow или updateRow .
package com.journaldev.examples; import java.sql.*; /** * Java Resultset Example using updater methods. * * @author pankaj * */ public class ResultSetUpdateDemo { public static void main(String[] args) { String query = "select empid, firstname, lastname, dob from tblemployee"; Connection conn = null; Statement stmt = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/empdb", "root", "root"); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery(query); System.out.println("Now go directly to 2nd row for Update"); if (rs.absolute(2)) { // Go directly to 2nd row System.out.println("Existing Name:" + rs.getString("firstName")); rs.updateString("firstname", "Tyson"); rs.updateRow(); } rs.beforeFirst(); // go to start System.out.println("All the rows of table=>"); while (rs.next()) { // Go to next row by calling next() method displayData(rs); } rs.close(); } catch (Exception e) { e.printStackTrace(); } finally { try { stmt.close(); conn.close(); } catch (Exception e) { } } } public static void displayData(ResultSet rs) throws SQLException { System.out.println("empId:" + rs.getInt(1)); System.out.println("firstName:" + rs.getString(2)); System.out.println("lastName:" + rs.getString(3)); System.out.println("dob:" + rs.getDate(4)); System.out.println(""); } }
Выход:
Now go directly to 2nd row for Update Existing Name:Josh All the rows of table=> empId:1 firstName:Mike lastName:Davis dob:1998-11-11 empId:2 firstName:Tyson lastName:Martin dob:1988-10-22 empId:3 firstName:Ricky lastName:Smith dob:1999-05-11
4. Набор результатов Разные методы
- void close() вызывает Исключение SQLException : Этот метод освобождает ресурсы, связанные с экземпляром набора результатов. Его необходимо вызвать, иначе это приведет к утечке ресурсов.
- ResultSetMetaData getMetadata() вызывает Исключение SQLException: Этот метод возвращает экземпляр ResultSetMetaData. Он предоставляет информацию о типе и свойстве столбцов вывода запроса.
Ссылка : Javadoc