APIJSONParser
Это компилятор SQL, созданный на основе проекта APIJSON (https://github.com/TommyLemon/APIJSON). Он преобразует данные в формате JSON в SQL-запросы.
В программе APIJSON можно выделить три основных шага:
APIJSONParser — это инструмент для генерации SQL-запросов. Он позволяет преобразовать объект JSON в стандартный SQL-запрос. Если необходимо, можно настроить формат запроса.
Предположим, у нас есть такой JSON:
{
"Product":{
"id":"1"
}
}
Мы помещаем этот JSON в объект JSONObject
с именем obj
:
APIJSONProvider apijsonProvider = new APIJSONProvider(obj); //один APIJSON-анализатор получает один объект json
apijsonProvider.setStatementType(StatementType.SELECT); //текущий режим — запрос, также поддерживаются операции добавления, изменения и удаления
System.out.println(SQLExplorer.getSQL(apijsonProvider).getText());//получаем SQL
После выполнения этого кода будет выведен следующий SQL-запрос:
SELECT Product.*
FROM Product Product
WHERE (Product.id = '1')
Можно заметить, что в запросе Product
— это имя таблицы, а id
— условие фильтрации. Здесь может возникнуть вопрос о безопасности, но анализатор проверяет формат данных перед тем, как сформировать запрос. Это снижает эффективность работы и ограничивает гибкость SQL.
Если псевдонимы кажутся странными, их можно изменить:
{
"Product:p":{
"id":"1"
}
}
Тогда результатом будет:
SELECT p.*
FROM Product p
WHERE (p.id = '1')
Здесь мы получаем все поля для товара с идентификатором 1. А если нужны не все поля?
{
"Product:p":{
"@column":"id,code,name",
"id":"1"
}
}
Результат:
SELECT p.id, p.code, p.name
FROM Product p
WHERE (p.id = '1')
До сих пор мы использовали только идентификатор 1 в качестве условия фильтрации. Есть и другие способы фильтрации.
Например, чтобы найти товары с ценой больше 300, нужно указать:
{
"Product:p":{
"@column":"id,code,name,price",
"price{}":">300"
}
}
Результатом будет:
SELECT p.id, p.code, p.name, p.price
FROM Product p
WHERE (p.price > 300)
Фигурные скобки ({}
) обозначают диапазон значений. Можно использовать следующие операторы сравнения: <
, <=
, >
, >=
, =
{
"Product:p":{
"@column":"id,code,name,price",
"price{}":">300,<1200"
}
}
Результатом будет:
SELECT p.id, p.code, p.name, p.price
FROM Product p
WHERE (p.price > 300 AND p.price < 1200)
Теперь мы ищем товары, цена которых находится в диапазоне от 300 до 1200. Если нужно найти товары, цена которых меньше 300 или больше 1200, то можно использовать оператор |
.
{
"Product:p":{
"@column":"id,code,name,price",
"price|{}":">300,<1200"
}
}
Результатом будет:
SELECT p.id, p.code, p.name, p.price
FROM Product p
WHERE (p.price > 300 OR p.price < 1200)
Также фигурные скобки можно использовать с оператором IN
. В этом случае значения должны быть в виде массива JSON. Например, если у товара есть поле brand_id
, которое является внешним ключом к таблице брендов, то можно выбрать товары определённых брендов:
{
"Product:p":{
"@column":"id,code,name,price",
"brand_id{}": [1,4,5]
}
}
Результатом будет:
SELECT p.id, p.code, p.name, p.price
FROM Product p
WHERE (p.brand_id IN (1, 4, 5))
Чтобы исключить определённые бренды, можно использовать оператор !
:
{
"Product:p":{
"@column":"id,code,name,price",
"brand_id!{}": [1,4,5]
}
}
Результатом будет:
SELECT p.id, p.code, p.name, p.price
FROM Product p
WHERE (p.brand_id NOT IN (1, 4, 5))
Эта функция также работает с текстовыми полями. Например, чтобы выбрать товары, название которых содержит подстроку «双11», можно указать:
{
"Product:p":{
"@column":"id,code,name,price",
"name~": "双11"
}
}
Результатом будет:
SELECT p.id, p.code, p.name, p.price
FROM Product p
WHERE (p.name LIKE '%双11%')
Если нужно контролировать использование символа процента (%
), можно напрямую указать его в запросе.
{
"Product:p":{
"@column":"id,code,name,price",
"name$": "%双11"
}
}
Результатом будет:
SELECT p.id, p.code, p.name, p.price
FROM Product p
WHERE (p.name LIKE '%叄11')
Символ процента можно разместить где угодно.
Для использования регулярных выражений нужно указать:
{
"Product:p":{
"@column":"id,code,name,price",
"code?": "^[0-9]+$"
}
}
Результатом будет:
SELECT p.id, p.code, p.name, p.price
FROM Product p
WHERE ( regexp_like(p.code,'^[0-9]+$'))
Обратите внимание, что функции могут отличаться в зависимости от базы данных. Их можно изменить в соответствии с требованиями.
Чтобы отсортировать результаты по возрастанию или убыванию, можно добавить ключ @orders
. Например:
{
"Product:p":{
"@column":"id,code,name,price",
"name~": "双11",
"@orders": "price-"
}
}
Результатом будет:
SELECT p.id, p.code, p.name, p.price
FROM Product p
WHERE (p.name LIKE '%叄11%')
ORDER BY p.price DESC
Знак -
обозначает сортировку по убыванию, +
— по возрастанию. В данном примере выбираются товары с названием «双11» в порядке убывания цены. Текст запроса:
«Результаты:
SELECT p.name, max(p.price) as max_price
FROM Product p
WHERE (p.name LIKE '%双11%')
GROUP BY p.name
В настоящее время не контролируются разрешённые функции, поэтому можно использовать все функции с одним параметром.
Мы рассмотрели содержание однотабличного запроса, теперь перейдём к многотабличному запросу.
Есть две таблицы: таблица розничных продаж m_retail
, и таблица магазинов розничных продаж c_store
. Таблица розничных продаж связана с таблицей магазинов через внешний ключ m_retail.c_store_id
.
Первый способ — использование id@
:
{
"m_retail:r":{
"@column":"id,docno",
"id": 18
},
"c_store:s":{
"id@":"/r/c_store_id",
"@column":"code,name"
}
}
Результаты:
SELECT r.id, r.docno, s.code as "s.code", s.name as "s.name"
FROM m_retail r, c_store s
WHERE (r.id = 18 AND r.c_store_id = s.id)
Если не использовать id@
, то:
{
"[]": {
"c_store": {
"@column": "code,name",
"code": "C86L"
},
"m_retail:r": {
"@column": "id,docno"
}
},
"join": {
"@innerJoin": [
"c_store.id=r.c_store_id"
]
}
}
Результаты:
SELECT r.id, r.docno, c_store.code, c_store.name
FROM m_retail r
INNER JOIN c_store ON c_store.id=r.c_store_id
WHERE (c_store.code = 'C86L')
Другие способы использования соединения похожи на приведённый пример внутреннего соединения (@innerJoin
).
Поддерживаемые типы соединений:
@innerJoin
@leftOuterJoin
@rightOuterJoin
@join
@outerJoin
Скоростной поиск
Примеры в быстром поиске являются самыми простыми. Функции обновления и удаления используют те же условия фильтрации, что и запросы. Для получения дополнительной информации обратитесь к приведённым выше инструкциям.
Существует таблица под названием test_apijson
:
ID | CODE | NAME |
---|---|---|
1 | A001 | 浦东区 |
2 | B001 | 徐汇区 |
3 | C001 | 普陀区 |
Запрос
Запрос имени для кода A001
:
{
"test_apijson":{
"@column":"name",
"code":"A001"
}
}
Добавление
Добавление строки с данными, где ID равен 1:
{
"test_apijson":{
"code":"A001",
"name":"浦东区"
}
}
ID автоматически увеличивается, поэтому нет необходимости присваивать ему значение.
Изменение
Изменение кода B001
на A002
:
{
"test_apijson":{
"@code":"A002",
"code": "B001"
}
}
Удаление
Удаление A002
:
{
"test_apijson":{
"code": "A002"
}
}
Права доступа
Права доступа к таблицам:
APIJSONProvider.getTableWhiteList()
;APIJSONProvider.getTableBlackList()
.Использование белого и чёрного списков таблиц:
apijsonProvider.getTableBlackList().add("Retail");
Retail
— это имя таблицы.
Права доступа к полям:
APIJSONProvider.getColumnWhiteList()
;APIJSONProvider.getColumnBlackList()
.Использование белых и чёрных списков полей:
apijsonProvider.getColumnWhiteList().add("retail.*");
apijsonProvider.getColumnWhiteList().add("retail.amt");
Формат: таблица.поле
, поле поддерживает подстановочный знак *
.
Импорт jar
Адрес: https://jitpack.io/#com.gitee.sxran/dyna-graph-ql/1.0.0
Зависимость от pom.xml:
Шаг 1. Добавьте репозиторий JitPack в файл сборки:
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
Шаг 2. Добавьте зависимость:
Версия указана в теге.
<dependency>
<groupId>com.gitee.sxran</groupId>
<artifactId>APIJSONParser</artifactId>
<version>1.1.0-hutool</version>
</dependency>
Уже подключённые проекты:
https://gitee.com/sxran/Great
Обновление версии:
Завершена реализация вышеуказанных функций.
Оптимизирована структура каталогов, зависимость заменена на hutool-json».
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )