Рубрики
Без рубрики

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

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

Автор оригинала: 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