English | 中文
Документация: https://bs.zhxu.cn
АлиБаба облако, минимальная цена 10%: https://www.aliyun.com/minisite/goods?userCode=zugtbi5w
Жуэджин блоги:
Только одна строка кода для достижения:
Концептуальное мышление: Мышление Bean Searcher
Архитектура:
Хотя CREATE/UPDATE/DELETE являются сильными сторонами Hibernate, MyBatis, DataJDBC и других ORM, запросы, особенно сложные запросы списка с несколькими условиями, несколькими таблицами, пагинацией, сортировкой, всегда были их слабыми сторонами. Традиционный ORM затрудняет реализацию сложного извлечения списков с меньшим количеством кода, но Bean Searcher сделал значительные усилия в этом направлении. Эти сложные запросы можно решить почти одной строкой кода.
Внутри приложения необходимо написать API для извлечения данных, и если это будет сделано с использованием традиционного ORM, сложность кода будет очень высокой.
Но Bean Searcher может:
@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 и так далее.
Все, что вам нужно, это добавить зависимость:
implementation 'cn.zhxu:bean-searcher-boot-starter:4.3.4'
и затем вы можете внедрить Searcher в Controller
или Service
:
/**
* Внедрение MapSearcher, который получает данные в виде объектов Map
*/
@Autowired
private MapSearcher mapSearcher;
/**
* Внедрение BeanSearcher, который возвращает данные в виде общих объектов
*/
@Autowired
private BeanSearcher beanSearcher;
Все, что вам нужно, это добавить зависимость:
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 )