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

OSCHINA-MIRROR/sxran-APIJSONParser

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

APIJSONParser

Это компилятор SQL, созданный на основе проекта APIJSON (https://github.com/TommyLemon/APIJSON). Он преобразует данные в формате JSON в SQL-запросы.

В программе APIJSON можно выделить три основных шага:

  • проверка прав доступа;
  • генерация SQL-запроса на основе данных;
  • формирование ответа в заданном формате.

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

Обновление версии:

1.0.0:

Завершена реализация вышеуказанных функций.

1.1.0-hutool:

Оптимизирована структура каталогов, зависимость заменена на hutool-json».

Комментарии ( 0 )

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

Введение

Анализ SQL в apijson, автор не разделил код на отдельные модули. Попытки связаться с автором также не решили проблему. Использована сторонняя библиотека, связанная с apijson, но она больше не обновляется, и PR также не возвращаются. Придётся поддерживать самостоятельно. Идеи apijson всё ещё неплохи: передать простые операции добавления, измене... Развернуть Свернуть
Отмена

Обновления (1)

все

Участники

все

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

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