Поиск по сайту:

Учебник по набору результатов Java


Интерфейс Java ResultSet является частью пакета java.sql. Это один из основных компонентов JDBC Framework. Объект ResultSet используется для доступа к результатам запроса, полученным из реляционных баз данных.

ResultSet поддерживает курсор/указатель, который указывает на одну строку результатов запроса. Используя методы навигации и получения, предоставляемые ResultSet, мы можем перебирать и получать доступ к записям базы данных одну за другой. ResultSet также можно использовать для обновления данных.

Иерархия набора результатов Java

На приведенной выше диаграмме показано место ResultSet в JDBC Framework. ResultSet можно получить, выполнив SQL-запрос с помощью оператора, PreparedStatement или CallableStatement.

AutoCloseable, Wrapper — это суперинтерфейсы ResultSet. Теперь мы увидим, как работать с ResultSet в наших 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

Объяснение:

  • ResultSet получается путем вызова метода executeQuery для экземпляра оператора. Первоначально курсор ResultSet указывает на позицию перед первой строкой.
  • Метод next из ResultSet перемещает курсор на следующую строку. Возвращает true, если есть следующая строка, в противном случае возвращает false.
  • Мы можем получить данные из ResultSet, используя предоставляемые им методы получения. например getInt(), getString(), getDate()
  • Все методы получения имеют два варианта. 1-й вариант принимает индекс столбца в качестве параметра, а 2-й вариант принимает имя столбца в качестве параметра.
  • Наконец, нам нужно вызвать метод close для экземпляра ResultSet, чтобы правильно очистить все ресурсы.

Типы результирующих наборов и параллелизм

Мы можем указать тип и параллелизм ResultSet при создании экземпляра оператора, CallableStatement.

statement.createStatement(int resultSetType, int resultSetConcurrency)

Типы результирующих наборов

1) Только вперед (ResultSet.TYPE_FORWARD_ONLY)

Этот тип экземпляра ResultSet может перемещаться только в прямом направлении от первой строки к последней строке. ResultSet можно переместить вперед на одну строку, вызвав метод next(). Мы можем получить этот тип ResultSet при создании экземпляра оператора, 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)

Нечувствительный к прокрутке ResultSet может прокручиваться как вперед, так и назад. Его также можно прокрутить до абсолютной позиции, вызвав метод absolute(). Но он не чувствителен к изменениям данных. Он будет иметь данные только тогда, когда запрос был выполнен и получен ResultSet. Он не будет отражать изменения, внесенные в данные после их получения.

Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,  		ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery("select * from tbluser");

3) Чувствительность к прокрутке (ResultSet.TYPE_SCROLL_SENSITIVE)

Scroll Sensitive ResultSet может прокручиваться как вперед, так и назад. Его также можно прокрутить до абсолютной позиции, вызвав метод absolute(). Но он чувствителен к изменениям данных. Он будет отражать изменения, внесенные в данные, пока они открыты.

Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,  		ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery("select * from tbluser");

Параллелизм набора результатов

1) Только чтение (ResultSet.CONCUR_READ_ONLY)

Это модель параллелизма по умолчанию. Мы можем выполнять операции только для чтения в экземпляре ResultSet. Операции обновления запрещены.

2) Обновляемый (ResultSet.CONCUR_UPDATABLE)

В этом случае мы можем выполнять операции обновления экземпляра ResultSet.

Методы набора результатов

Мы можем разделить методы ResultSet на следующие категории.

  • Методы навигации
  • Методы получения/считывания
  • Методы установки/обновления
  • Разные методы — close() и getMetaData()

1. Методы навигации по набору результатов

  • boolean absolute(int row) выдает SQLException**:** Этот метод перемещает курсор ResultSet в указанную строку и возвращает значение true, если операция выполнена успешно.
  • void afterLast() генерирует SQLException**:** Этот метод перемещает курсор ResultSet в позицию после последней строки.
  • void beforeFirst() генерирует SQLException**:** Этот метод перемещает курсор ResultSet в позицию перед первой строкой.
  • boolean first() генерирует SQLException: этот метод перемещает курсор ResultSet в первую строку.
  • boolean last() генерирует SQLException: этот метод перемещает курсор ResultSet в последнюю строку.
  • boolean next() генерирует SQLException: этот метод перемещает курсор ResultSet на следующую строку.
  • булева предыдущая() выдает SQLException: этот метод перемещает курсор ResultSet на предыдущую строку.

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. Методы получения/считывания ResultSet

  • int getInt(int columnIndex) выдает SQLException: этот метод возвращает значение указанного columnIndex как целое.
  • long getLong(int columnIndex) выдает SQLException: этот метод возвращает значение указанного столбцаIndex как long
  • String getString(int columnIndex) выдает SQLException: этот метод возвращает значение указанного columnIndex как строку
  • java.sql.Date getDate(int columnIndex) выдает SQLException: этот метод возвращает значение указанного столбцаIndex как java.sql.Date
  • int getInt(String columnLabel) выдает SQLException: этот метод возвращает значение указанного имени столбца как целое.
  • long getLong(String columnLabel) выдает SQLException: этот метод возвращает значение указанного имени столбца как длинное.
  • String getString(String columnLabel) выдает SQLException: этот метод возвращает значение указанного имени столбца в виде строки.
  • java.sql.Date getDate(String columnLabel) выдает SQLException: этот метод возвращает значение указанного имени столбца как java.sql.Date.
  • ResultSet содержит методы получения, которые возвращают другие примитивные типы данных, такие как логические, плавающие и двойные. Он также имеет методы для получения массива и двоичных данных из базы данных.

3. Методы установки/обновления ResultSet

  • void updateInt(int columnIndex, int x) выдает SQLException: этот метод обновляет значение указанного столбца текущей строки значением int.
  • void updateLong(int columnIndex, long x) выдает SQLException: этот метод обновляет значение указанного столбца текущей строки с длинным значением.
  • void updateString(int columnIndex, String x) выдает SQLException: этот метод обновляет значение указанного столбца текущей строки строковым значением.
  • void updateDate(int columnIndex, java.sql.Date x) выдает SQLException: этот метод обновляет значение указанного столбца текущей строки значением java.sql.Date.
  • void updateInt(String columnLabel, int x) выдает SQLException: этот метод обновляет значение указанной метки столбца текущей строки значением int.
  • void updateLong(String columnLabel, long x) выдает SQLException: этот метод обновляет значение указанной метки столбца текущей строки с длинным значением.
  • void updateString(String columnLabel, String x) выдает SQLException: этот метод обновляет значение указанной метки столбца текущей строки строковым значением.
  • void updateDate(String columnLabel, java.sql.Date x) выдает SQLException: этот метод обновляет значение указанного столбцаLabel текущей строки со значением java.sql.Date.

Примечание. Методы установки/обновления не обновляют значения базы данных напрямую. Значения базы данных будут вставлены/обновлены после вызова метода 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. Разные методы ResultSet

  • void close() генерирует SQLException**:** Этот метод освобождает ресурсы, связанные с экземпляром ResultSet. Его необходимо вызвать, иначе это приведет к утечке ресурсов.
  • ResultSetMetaData getMetaData() генерирует SQLException: этот метод возвращает экземпляр ResultSetMetaData. Он предоставляет информацию о типе и свойствах столбцов вывода запроса.

Ссылка: документ Java