这一行代码实现了以下功能:
- 多表联查
- 分页搜索
- 组合过滤
- 任意字段排序
- 字段统计
例如,该接口支持如下请求:
- GET: /user/index
- 无参请求(默认分页):
- { "dataList": [ { "id": 1, "username": "Jack", "status": 1, "level": 1, "age": 25, "gender": "Male", "joinDate": "2021-10-01" }, ... // 默认返回 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
- 按字段 age 降序查询
- GET: /user/index? onlySelect=username,age
- 只检索 username 与 age 两个字段:
- { "dataList": [ { "username": "Jack", "age": 25 }, ... ], "totalCount": 100, "summaries": [ 2500 ] }
- GET: /user/index? selectExclude=joinDate
- 检索时排除 joinDate 字段
参数构建器
Map<String, Object> params = MapUtils.builder() .selectExclude(User::getJoinDate) // 排除 joinDate 字段 .field(User::getStatus, 1) // 过滤:status = 1 .field(User::getName, "Jack").ic() // 过滤:name = 'Jack' (case ignored) .field(User::getAge, 20, 30).op(Opetator.Between) // 过滤:age between 20 and 30 .orderBy(User::getAge, "asc") // 排序:年龄,从小到大 .page(0, 15) // 分页:第 0 页, 每页 15 条 .build(); List<User> users = beanSearcher.searchList(User.class, params);
快速开发
使用 Bean Searcher 可以极大地节省后端的复杂列表检索接口的开发时间!
- 普通的复杂列表查询只需一行代码
- 单表检索可复用原有 Domain,无需定义 SearchBean
集成简单
可以和任意 Java Web 框架集成,如:SpringBoot、Spring MVC、Grails、Jfinal 等等。
Spring Boot 项目,添加依赖即集成完毕:
implementation 'com.ejlchina:bean-searcher-boot-stater:3.6.0'
接着便可在 Controller 或 Service 里注入检索器:
/** * 注入 Map 检索器,它检索出来的数据以 Map 对象呈现 */ @Autowired private MapSearcher mapSearcher; /** * 注入 Bean 检索器,它检索出来的数据以 泛型 对象呈现 */ @Autowired private BeanSearcher beanSearcher;
其它框架,使用如下依赖:
implementation 'com.ejlchina:bean-searcher:3.6.0'
然后可以使用 SearcherBuilder 构建一个检索器:
DataSource dataSource = ... // 拿到应用的数据源 // DefaultSqlExecutor 也支持多数据源 SqlExecutor sqlExecutor = new DefaultSqlExecutor(dataSource); // 构建 Map 检索器 MapSearcher mapSearcher = SearcherBuilder.mapSearcher() .sqlExecutor(sqlExecutor) .build(); // 构建 Bean 检索器 BeanSearcher beanSearcher = SearcherBuilder.beanSearcher() .sqlExecutor(sqlExecutor) .build();
扩展性强
面向接口设计,用户可自定义扩展 Bean Searcher 中的任何组件!
比如你可以:
- 自定义 FieldOp 来支持更多的字段运算符
- 自定义 FieldConvertor 来支持任意的 特殊字段类型
- 自定义 DbMapping 来实现自定义注解,或让 Bean Searcher 识别其它 ORM 的注解
- 自定义 ParamResolver 来支持其它形式的检索参数
- 自定义 Dialect 来支持更多的数据库
- 等等..
6 源码地址
- Gitee:https://gitee.com/ejlchina-zhxu/bean-searcher
- GitHub:https://github.com/ejlchina/bean-searcher