1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/tenmg-sql-paging

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

sql-paging

maven

Введение

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.

  1. Добавьте зависимость в файл pom.xml, где ${sql-paging.version} — номер версии. Можно определить атрибут или напрямую использовать номер версии для замены:
<!-- https://mvnrepository.com/artifact/cn.tenmg/sql-paging -->
<dependency>
    <groupId>cn.tenmg</groupId>
    <artifactId>sql-paging</artifactId>
    <version>${sql-paging.version}</version>
</dependency>
  1. Вызовите метод SQLPagingDialect.countSql, чтобы получить подсчитывающий SQL (на примере MySQL):
String namedSql = "……";
sqlMetaData sqlMetaData = SQLUtils.getSQLMetaData(namedSql);
SQLPagingDialect dialect = MySQLPagingDialect.getInstance();
String countSql = dialect.countSql(namedSql, sqlMetaData);
……
  1. Вызовите метод SQLPagingDialect.pageSql, чтобы получить запрос с разбивкой на страницы (на примере MySQL):
……
try {
    String pageSql = dialect.pageSql(con, namedSql, params, sqlMetaData, 20, 2);
    ……
} catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
……

Подробное описание API

countSql

Используется для автоматического создания подсчитывающего 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, все остальное остается неизменным, обеспечивая точность результатов и повышая эффективность запросов.

pageSql

Используется для создания запроса с разбивкой на страницы на основе фактического 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Библиотека диалектов для запросов с разбиением на страницы SQL. Можно быстро преобразовать обычный SQL в SQL для подсчёта (*COUNT*) или в запрос с разбивкой на страницы для конкретной базы данных, вызвав соответствующие API. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/tenmg-sql-paging.git
git@api.gitlife.ru:oschina-mirror/tenmg-sql-paging.git
oschina-mirror
tenmg-sql-paging
tenmg-sql-paging
master