英语 | 中文
文档: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 可以:
首先,您有一个实体类:
@ 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
默认分页检索以Jac
开头的name
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 '
然后你可以使用SearcherBuilder
构建一个Searcher
:
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
以支持其他 ORM 的注释ParamResolver
以支持 JSON 查询参数FieldConvertor
以支持任何类型的字段Dialect
以支持更多数据库参考:https://bs.zhxu.cn
[Sa-Token]一个轻量级Java权限认证框架,让鉴权变得简单、优雅!
[ Fluent MyBatis ] MyBatis 语法增强框架,综合了 MyBatisPlus、DynamicSql、Jpa 等框架的特性和优点,利用注解处理器生成代码
[ OkHttps ]轻量却强大的 HTTP 客户端,前端通用,支持 WebSocket 和 Stomp 协议
[ hrun4j ]接口自动化测试解决方案--工具选得好,下班早回家;测试用得对,半夜安心睡觉
[ JsonKit ]超轻量级 JSON 门面工具,最简单,不依赖具体实现,让业务代码与 Jackson、Gson、Fastjson 等解耦合!
[免费UI]基于Vue3 + TypeScript,一个非常轻量炫酷的UI组件库!
git checkout -b feat/xxxx
git commit -am 'feat(function): add xxxxx'
git push origin feat/xxxx
pull request