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

OSCHINA-MIRROR/troyzhxu-bean-searcher

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 15 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 22.04.2025 23:44 9be8fcd

logo

Maven Central License Troy.Zhou

English | 中文

✨ Функции* Поддержка одного сущности для нескольких таблиц

  • Поддержка динамического оператора поля
  • Поддержка группового и агрегатного запроса
  • Поддержка подзапроса Select | Where | From
  • Поддержка встроенных параметров в сущности
  • Поддержка конвертеров полей
  • Поддержка перехватчиков SQL
  • Поддержка расширения SQL диалекта
  • Поддержка нескольких источников данных и динамического источника данных
  • Поддержка игнорирования аннотаций и кастомизации
  • Поддержка расширения оператора поля
  • и т.д.

⁉️ПОЧЕМУ

Это не повторение колеса

Хотя CREATE/UPDATE/DELETE являются сильными сторонами Hibernate, MyBatis, DataJDBC и других ORM, запросы, особенно сложные запросы списка с несколькими условиями, несколькими таблицами, пагинацией, сортировкой, всегда были их слабыми сторонами. Традиционный ORM затрудняет реализацию сложного извлечения списков с меньшим количеством кода, но Bean Searcher сделал значительные усилия в этом направлении. Эти сложные запросы можно решить почти одной строкой кода.

  • Например, такая типичная требование:

Внутри приложения необходимо написать API для извлечения данных, и если это будет сделано с использованием традиционного ORM, сложность кода будет очень высокой.

Но Bean Searcher может:

💥 Реализовано одной строкой кодаСначала у вас есть класс Entity:

@SearchBean(tables="user u, role r", joinCond="u.role_id = r.id", autoMapTo="u")
public class User {
  private long id;
  private String username;
  private int status;
  private int age;
  private String gender;
  private Date joinDate;
  private int roleId;
  @DbField("r.name")
  private String roleName;
  // Getters and setters...
}

Затем вы можете завершить API одной строкой кода:

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private BeanSearcher beanSearcher;              // Внедрение BeanSearcher

    @GetMapping("/index")
    public SearchResult<User> index(HttpServletRequest request) {
        // Здесь написана только одна строка кода
        return beanSearcher.search(User.class, MapUtils.flat(request.getParameterMap()), new String[]{ "age" });
    }

}

Эта строка кода может выполнить:

  • Извлечение из нескольких таблиц
  • Пагинацию по любому полю
  • Объединение фильтров по любому полю
  • Сортировку по любому полю
  • Сводку по полю age

Например, этот API можно запросить следующим образом:

  • GET: /user/index

    Извлечение по умолчанию с пагинацией:

    {
      "dataList": [
        {
          "id": 1,
          "username": "Jack",
          "status": 1,
          "age": 25,
          "gender": "Male",
          "joinDate": "2021-10-01",
          "roleId": 1,
          "roleName": "User"
        },
        ...     // 15 записей по умолчанию
      ],
      "totalCount": 100,
      "summaries": [
        2500    // статистика по полю `age`
      ]
    }
  • GET: /user/index? page=1 & size=10

    Извлечение с указанными параметрами пагинации

  • GET: /user/index? status=1

    Извлечение с status = 1 по умолчанию с пагинацией* GET: /user/index? name=Jac & name-op=sw

    Извлечение данных с name, начинающимся с Jac по умолчанию с пагинацией* GET: /user/index? name=Jack & name-ic=true

    Получение данных с name = Jack (игнорирование регистра) по умолчанию с пагинацией* GET: /user/index? sort=age & order=desc

    Получение данных с сортировкой по возрасту в порядке убывания и по умолчанию с пагинацией

  • GET: /user/index? onlySelect=username,age

    Получение данных только по полям username,age с пагинацией по умолчанию:

    {
      "dataList": [
        {
          "username": "Jack",
          "age": 25
        },
        ...     // 15 записей по умолчанию
      ],
      "totalCount": 100,
      "summaries": [
        2500    // статистика по возрасту
      ]
    }
  • GET: /user/index? selectExclude=joinDate

    Получение данных с исключением поля joinDate с пагинацией по умолчанию

✨ Построитель параметров

Map<String, Object> params = MapUtils.builder()
        .selectExclude(User::getJoinDate)                 // Исключение поля joinDate
        .field(User::getStatus, 1)                        // Фильтр: статус = 1
        .field(User::getName, "Jack").ic()                // Фильтр: имя = 'Jack' (игнорирование регистра)
        .field(User::getAge, 20, 30).op(Opetator.Between) // Фильтр: возраст между 20 и 30
        .orderBy(User::getAge, "asc")                     // Сортировка по возрасту в порядке возрастания
        .page(0, 15)                                      // Пагинация: страница=0 и размер=15
        .build();
List<User> users = beanSearcher.searchList(User.class, params);

Примеры

🚀 Быстрое развитие

Использование Bean Searcher значительно сокращает время разработки сложных API для получения списков данных!* Обычный сложный запрос списка данных требует всего одной строки кода

  • Получение данных из одной таблицы можно выполнять с использованием оригинального домена, без определения нового Entity### 🌱 Легкая интеграция

Bean Searcher может работать с любыми JavaWeb фреймворками, такими как: SpringBoot, SpringMVC, Grails, Jfinal и так далее.

SpringBoot / Grails

Все, что вам нужно, это добавить зависимость:

implementation 'cn.zhxu:bean-searcher-boot-starter:4.3.4'

и затем вы можете внедрить Searcher в Controller или Service:

/**
 * Внедрение MapSearcher, который получает данные в виде объектов Map
 */
@Autowired
private MapSearcher mapSearcher;

Автоматическое внедрение BeanSearcher

/**
 * Внедрение BeanSearcher, который возвращает данные в виде общих объектов
 */
@Autowired
private BeanSearcher beanSearcher;

Проект Solon

Все, что вам нужно, это добавить зависимость:

implementation 'cn.zhxu:bean-searcher-solon-plugin:4.3.4'

и затем вы сможете внедрить Searcher в Controller или Service:

/**
 * Внедрение MapSearcher, который возвращает данные в виде объектов Map
 */
@Inject
private MapSearcher mapSearcher;

/**
 * Внедрение BeanSearcher, который возвращает данные в виде общих объектов
 */
@Inject
private BeanSearcher beanSearcher;

Другие фреймворки

Добавление этой зависимости:

implementation 'cn.zhxu:bean-searcher:4.3.4'

затем вы сможете создать Searcher с помощью SearcherBuilder:

DataSource dataSource = ...     // Получение dataSource приложения

// DefaultSqlExecutor поддерживает несколько источников данных
SqlExecutor sqlExecutor = new DefaultSqlExecutor(dataSource);

// Создание MapSearcher
MapSearcher mapSearcher = SearcherBuilder.mapSearcher()
        .sqlExecutor(sqlExecutor)
        .build();

// Создание BeanSearcher
BeanSearcher beanSearcher = SearcherBuilder.beanSearcher()
        .sqlExecutor(sqlExecutor)
        .build();
```### 🔨 Легкое расширение

Вы можете настраивать и расширять любой компонент в Bean Searcher.

Например:
* Настройка [`FieldOp`](/bean-searcher/src/main/java/cn/zhxu/bs/FieldOp.java) для поддержки других операторов полей
* Настройка [`DbMapping`](/bean-searcher/src/main/java/cn/zhxu/bs/DbMapping.java) для поддержки других аннотаций ORM
* Настройка [`ParamResolver`](/bean-searcher/src/main/java/cn/zhxu/bs/ParamResolver.java) для поддержки параметров запроса JSON
* Настройка [`FieldConvertor`](/bean-searcher/src/main/java/cn/zhxu/bs/FieldConvertor.java) для поддержки любого типа поля
* Настройка [`Dialect`](/bean-searcher/src/main/java/cn/zhxu/bs/dialect/Dialect.java) для поддержки большего количества баз данных
* и так далее

### 📚 Подробная документация

Ссылка: https://bs.zhxu.cn

### 🤝 Дружественные ссылки

[**[ Sa-Token ]** Легковесный Java-фреймворк для управления правами доступа, делающий аутентификацию простой и элегантной!](https://github.com/dromara/Sa-Token)

[**[ Fluent MyBatis ]** Фреймворк для улучшения синтаксиса MyBatis, объединяющий лучшие черты и преимущества MyBatisPlus, DynamicSql и Jpa, используя аннотации для генерации кода](https://gitee.com/fluent-mybatis/fluent-mybatis)

[**[ OkHttps ]** Легкий, но мощный HTTP-клиент, который можно использовать как на клиентской, так и на серверной стороне, поддерживает протоколы WebSocket и Stomp](https://gitee.com/troyzhxu/okhttps)

[**[ hrun4j ]** Решение для автоматизированного тестирования API -- выбери правильный инструмент, и ты будешь уходить с работы раньше; используй правильные тесты, и ты будешь спать спокойно ночью](https://github.com/lematechvip/hrun4j)[**[ JsonKit ]** Легковесный инструмент для работы с JSON, прост в использовании, не зависит от конкретной реализации, что позволяет отделить бизнес-код от Jackson, Gson, Fastjson и других](https://gitee.com/troyzhxu/xjsonkit)

[**[ Free UI ]** На основе Vue3 + TypeScript, это очень легкий и крутой набор UI-компонентов](https://gitee.com/phoeon/free-ui)


### ❤️ Как внести свой вклад

1. Сделай форк кода!
2. Создай свой собственный ветвь: `git checkout -b feat/xxxx`
3. Подтверди свои изменения: `git commit -am 'feat(function): add xxxxx'`
4. Отправь свою ветвь: `git push origin feat/xxxx`
5. Отправь запрос на слияние `pull request`

Опубликовать ( 0 )

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

1
https://api.gitlife.ru/oschina-mirror/troyzhxu-bean-searcher.git
git@api.gitlife.ru:oschina-mirror/troyzhxu-bean-searcher.git
oschina-mirror
troyzhxu-bean-searcher
troyzhxu-bean-searcher
dev