Java SQL Server: разбиение на страницы

В этом руководстве вы узнаете, как разбить большой набор данных на более мелкие страницы в Java, выполнив оператор SELECT с предложениями FETCH и OFFSET.

Этот урок начинается с того места, где закончился урок «Выбор данных из таблицы в Java».

Данные пагинации

Метод пагинации позволяет разбить большой набор результатов на более мелкие. В SQL Server для выполнения пагинации можно использовать предложения FETCH и OFFSET или функцию ROW_NUMBER().

Мы покажем вам, как разбить на страницы данные, полученные из таблицы Authors, с помощью оператора SELECT с предложениями FETCH и OFFSET.

Шаг 1. Измените класс AuthorDB и определите метод find():

public List find(int limit, int offset) throws DBException {
  var sql = "SELECT AuthorID, FirstName, LastName, BirthDate " +
                  "FROM Authors   " +
                  "ORDER BY AuthorID " +
                  "OFFSET ? ROWS FETCH FIRST ? ROWS ONLY";
  var authors = new ArrayList();
  try(var statement = connection.prepareStatement(sql)) {
    // Set values to parameters
    statement.setInt(1, offset);
    statement.setInt(2, limit);
    try(var resultset = statement.executeQuery()) {
      while(resultset.next()) {
        authors.add(createAuthorFrom(resultset));
      }
    }
    return authors;
  } catch(SQLException e) {
    throw new DBException(e.getMessage());
  }
}

Как это работает.

Сначала определите метод find(), который принимает два параметра limit и offset. Limit указывает максимальное количество возвращаемых объектов Author, а offset определяет количество строк, которые следует пропустить перед началом извлечения объектов Author:

public List find(int limit, int offset) throws DBException {

Метод find() возвращает список объектов Author и выдает исключение DBException, если при выборе данных возникает какая-либо ошибка.

Во-вторых, создайте оператор SELECT, который извлекает данные из таблицы Authors с двумя параметрами(смещение и предел):

var sql = "SELECT AuthorID, FirstName, LastName, BirthDate " +
                  "FROM Authors   " +
                  "ORDER BY AuthorID " +
                  "OFFSET ? ROWS FETCH FIRST ? ROWS ONLY";

В-третьих, инициализируем пустой список объектов Author:

var authors = new ArrayList();

В-четвертых, создайте объект PreparedStatement с оператором SELECT, вызвав метод prepareStatement объекта Connection:

try(var statement = connection.prepareStatement(sql)) {

В-пятых, задайте значения для оператора:

statement.setInt(1, offset);
statement.setInt(2, limit);

В-шестых, выполните запрос, создайте объект Author из каждой строки набора результатов и добавьте его в список авторов:

try(var resultset = statement.executeQuery()) {
  while(resultset.next()) {
    authors.add(createAuthorFrom(resultset));
  }
}

В-седьмых, верните список авторов:

return authors;

Наконец, создайте новое исключение DBException, если при выборе данных возникнет какая-либо ошибка:

} catch(SQLException e) {
  throw new DBException(e.getMessage());
}

Шаг 2. Измените метод main() класса Main, чтобы использовать метод find() для получения первых пяти авторов из таблицы Authors:

import java.sql.SQLException;
public class Main {
    public static void main(String[] args) {
        try(var connection = SQLServerConnection.connect()) {
            var authorDB = new AuthorDB(connection);
            // Find the first 5 authors
            var authors = authorDB.find(5, 0);
            for(var author: authors) {
                System.out.println(author.getAuthorId() + " - " + author.getFirstName() + ", " + author.getLastName());
            }
        } catch(SQLException | DBException e) {
            System.err.println(e.getMessage());
        }
    }
}

Шаг 3. Запустите программу Java. Она покажет следующих авторов в выводе:

1 - John, Doe
2 - Lisa, Rodriguez
3 - Susan, Williams
4 - Anthony, Martinez
5 - Linda, Johnson

Если вы хотите получить следующих пяти авторов, вы можете изменить аргумент смещения на 5 следующим образом:

var authors = authorDB.find(5, 5);

Перезапустите программу Java, вы получите следующий вывод:

6 - Daniel, Hall
7 - Thomas, Williams
8 - Richard, Martin
9 - Barbara, King
10 - Jessica, Smith

Загрузите исходный код проекта

Загрузите исходный код проекта

Краткое содержание

  • Используйте оператор SELECT с предложениями OFFSET и FETCH для реализации функции разбиения на страницы.
Мирослав С.

Автор статей, ИБ-специалист