В этом руководстве вы узнаете, как разбить большой набор данных на более мелкие страницы в 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 для реализации функции разбиения на страницы.