sql-paging
sql-paging — это библиотека классов для SQL-запросов с разбиением на страницы, которая изначально была компонентом интеллектуального разбиения на страницы в Sqltool, а затем была выделена в отдельный проект для интеграции с другими компонентами. Вызывая соответствующие API, можно быстро преобразовать обычный SQL в подсчитывающий (COUNT) SQL или запрос с разбивкой на страницы для конкретной базы данных. sql-paging использует встроенный инструмент анализа SQL для создания оптимального подсчитывающего (COUNT) или запроса с разбивкой на страницы.
База данных | Поддерживаемая версия | Реализация класса диалекта |
---|---|---|
MySQL | 1.0+ | MySQLPagingDialect |
Oracle | 1.0+ | OraclePagingDialect |
PostgreSQL | 1.0+ | PostgreSQLPagingDialect |
SQLServer | 1.0+ | SQLServerPagingDialect |
SQLite | 1.2.7+ | SQLitePagingDialect |
В качестве примера рассмотрим проект на основе Maven.
<!-- https://mvnrepository.com/artifact/cn.tenmg/sql-paging -->
<dependency>
<groupId>cn.tenmg</groupId>
<artifactId>sql-paging</artifactId>
<version>${sql-paging.version}</version>
</dependency>
SQLPagingDialect.countSql
, чтобы получить подсчитывающий SQL (на примере MySQL):String namedSql = "……";
sqlMetaData sqlMetaData = SQLUtils.getSQLMetaData(namedSql);
SQLPagingDialect dialect = MySQLPagingDialect.getInstance();
String countSql = dialect.countSql(namedSql, sqlMetaData);
……
SQLPagingDialect.pageSql
, чтобы получить запрос с разбивкой на страницы (на примере MySQL):……
try {
String pageSql = dialect.pageSql(con, namedSql, params, sqlMetaData, 20, 2);
……
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
……
Используется для автоматического создания подсчитывающего SQL на основе фактического запроса SQL, который выполняет подсчет общего количества и позволяет вычислить общее количество страниц с учетом размера страницы. Анализ исходного SQL и интеллектуальное принятие решений позволяют создать подсчитывающий SQL, удаляя ненужные столбцы или предложения ORDER BY, и не вводить ненужные подзапросы для достижения оптимальной производительности. Например, следующий SQL:
SELECT
S.STAFF_ID,
S.STAFF_NAME,
S.DEPARTMENT_ID,
S.POSITION,
S.STATUS
FROM STAFF_INFO S
ORDER BY S.STAFF_ID
Не является простым заключением в подзапрос для подсчета:
SELECT
COUNT(*)
FROM (
SELECT
S.STAFF_ID,
S.STAFF_NAME,
S.DEPARTMENT_ID,
S.POSITION,
S.STATUS
FROM STAFF_INFO S
ORDER BY S.STAFF_ID
) T
Вместо этого он удаляет ненужное предложение ORDER BY и не вводит ненужные подзапросы:
SELECT
COUNT(*)
FROM STAFF_INFO S
Это действительно то, что мы хотим. Но что, если ситуация немного сложнее? Например, нам нужно запросить сумму заказов пользователей за определенный период времени и отсортировать их по сумме в порядке убывания:
SELECT
USER_ID,
SUM(AMT) AMT
FROM ORDER_INFO O
WHERE O.CREATE_TIME >= :begin AND O.CREATE_TIME < :end
GROUP BY USER_ID
ORDER BY SUM(AMT) DESC
Мы получаем:
SELECT
COUNT(*)
FROM (
SELECT
USER_ID,
SUM(AMT) AMT
FROM ORDER_INFO O
WHERE O.CREATE_TIME >= :begin AND O.CREATE_TIME < :end
GROUP BY USER_ID
) SQL_PAGING
Отлично! Это именно то, чего мы ожидаем. Но что, если ситуация еще немного сложнее? Например, мы хотим запросить первые 100 пользователей с наибольшими суммами заказов за определенный период времени:
SELECT
USER_ID, /*用户编号*/
AMT /*订单金额*/
FROM (
SELECT
USER_ID,
SUM(AMT) AMT
FROM ORDER_INFO O
WHERE O.CREATE_TIME >= :begin AND O.CREATE_TIME < :end
GROUP BY USER_ID
) T
ORDER BY AMT DESC
LIMIT 100
Получаем:
SELECT
COUNT(*)
FROM (
SELECT
USER_ID, /*用户编号*/
AMT /*订单金额*/
FROM (
SELECT
USER_ID,
SUM(AMT) AMT
FROM ORDER_INFO O
WHERE O.CREATE_TIME >= :begin AND O.CREATE_TIME < :end
) T
LIMIT 100
) SQL_PAGING
sql-paging не убивает невинных, кроме удаления предложения ORDER BY, все остальное остается неизменным, обеспечивая точность результатов и повышая эффективность запросов.
Используется для создания запроса с разбивкой на страницы на основе фактического SQL-запроса. Он также не просто заключает исходный SQL в подзапрос, но и принимает интеллектуальные решения на основе потребностей. Продолжая приведенные выше три примера:
SELECT
S.STAFF_ID,
S.STAFF_NAME,
S.DEPARTMENT_ID,
S.POSITION,
S.STATUS
FROM STAFF_INFO S
ORDER BY S.STAFF_ID
Получим запрос с разбивкой на страницы SQL (размер страницы равен 10, страница 2):
1.1. MySQL
SELECT
S.STAFF_ID,
S.STAFF_NAME,
S.DEPARTMENT_ID,
S.POSITION,
S.STATUS
FROM
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )