английский | 中文
Документация: https://bs.zhxu.cn
阿里云最低 1 折: https://www.aliyun.com/minisite/goods?userCode=zugtbi5w
Блоги Цзюэджина:
Всего одна строка кода для достижения:
Дизайн-мышление: мышление Bean Searcher
Архитектура:
Хотя 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 ; // Inject BeanSearcher
@ GetMapping ( "/index" )
public SearchResult < User > index ( HttpServletRequest request ) {
// Only one line of code written here
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 records default
],
"totalCount" : 100 ,
"summaries" : [
2500 // age statistics
]
}
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
Сортировка поиска по age
и нумерации страниц по умолчанию.
GET: /user/index? onlySelect=username,age
Получение username,age
только по нумерации страниц по умолчанию:
{
"dataList" : [
{
"username" : " Jack " ,
"age" : 25 ,
},
... // 15 records default
],
"totalCount" : 100 ,
"summaries" : [
2500 // age statistics
]
}
GET: /user/index? selectExclude=joinDate
Получение joinDate
исключенной нумерации страниц по умолчанию
Map < String , Object > params = MapUtils . builder ()
. selectExclude ( User :: getJoinDate ) // Exclude joinDate field
. field ( User :: getStatus , 1 ) // Filter:status = 1
. field ( User :: getName , "Jack" ). ic () // Filter:name = 'Jack' (case ignored)
. field ( User :: getAge , 20 , 30 ). op ( Opetator . Between ) // Filter:age between 20 and 30
. orderBy ( User :: getAge , "asc" ) // Sorting by age ascending
. page ( 0 , 15 ) // Pagination: page=0 and size=15
. build ();
List < User > users = beanSearcher . searchList ( User . class , params );
Демо :
Использование Bean Searcher может значительно сэкономить время разработки сложных API поиска по спискам!
domain
без определения новой Entity
Bean Searcher может работать с любыми фреймворками JavaWeb, такими как: SpringBoot, SpringMVC, Grails, Jfinal и так далее.
Все, что вам нужно, это добавить зависимость:
implementation ' cn.zhxu:bean-searcher-boot-stater:4.3.4 '
а затем вы можете внедрить Searcher в Controller
или Service
:
/**
* Inject a MapSearcher, which retrieved data is Map objects
*/
@Autowired
private MapSearcher mapSearcher;
/**
* Inject a BeanSearcher, which retrieved data is generic objects
*/
@Autowired
private BeanSearcher beanSearcher;
Все, что вам нужно, это добавить зависимость:
implementation ' cn.zhxu:bean-searcher-solon-plugin:4.3.4 '
а затем вы можете внедрить Searcher в Controller
или Service
:
/**
* Inject a MapSearcher, which retrieved data is Map objects
*/
@Inject
private MapSearcher mapSearcher;
/**
* Inject a BeanSearcher, which retrieved data is generic objects
*/
@Inject
private BeanSearcher beanSearcher;
Добавляем эту зависимость:
implementation ' cn.zhxu:bean-searcher:4.3.4 '
то вы можете создать Searcher
с помощью SearcherBuilder
:
DataSource dataSource = ... // Get the dataSource of the application
// DefaultSqlExecutor suports multi datasources
SqlExecutor sqlExecutor = new DefaultSqlExecutor ( dataSource );
// build a MapSearcher
MapSearcher mapSearcher = SearcherBuilder . mapSearcher ()
. sqlExecutor ( sqlExecutor )
. build ();
// build a BeanSearcher
BeanSearcher beanSearcher = SearcherBuilder . beanSearcher ()
. sqlExecutor ( sqlExecutor )
. build ();
Вы можете настроить и расширить любой компонент в Bean Searcher.
Например:
FieldOp
для поддержки других полевых операторовDbMapping
для поддержки аннотаций других ORMParamResolver
для поддержки параметров запроса JSONFieldConvertor
для поддержки любого типа поляDialect
для поддержки большего количества баз данныхСсылка: https://bs.zhxu.cn
[ Sa-Token ]一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!
[Свободное владение MyBatis] MyBatis 语法增强框架, 综合了 MyBatisPlus, DynamicSql,Jpa
[ OkHttps ] Поддержка HTTP и HTTP, поддержка WebSocket и Stomp.
[ hrun4j ]接口自动化测试解决方案 --工具选得好,下班回家早;测试用得对,半夜安心睡
[ JsonKit ]超轻量级 JSON 门面工具,用法简单,不依赖具体实现,让业务代码与 Jackson, Gson, Fastjson等解耦!
[Бесплатный пользовательский интерфейс] Доступен Vue3 + TypeScript,一个非常轻量炫酷的 UI 组件库 !
git checkout -b feat/xxxx
git commit -am 'feat(function): add xxxxx'
git push origin feat/xxxx
pull request