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