条件检索引擎 Bean Searcher

条件检索引擎 Bean Searcher

Artistic-2.0
跨平台
2021-12-09
zhxutroy

:fire::fire::fire: 比 MyBatis 开发效率高 100 倍的条件检索引擎,天生支持联表,使一行代码实现复杂列表检索成为可能!

:sparkles: 特性

  • 支持 实体多表映射
  • 支持 动态字段运算符
  • 支持 分组聚合 查询
  • 支持 Select | Where | From 子查询
  • 支持 实体类嵌入参数
  • 支持 字段转换器
  • 支持 Sql 拦截器
  • 支持 数据库 Dialect 扩展
  • 支持 多数据源 与 动态数据源
  • 支持 注解缺省 与 自定义
  • 等等

:interrobang:️为什么用

这绝不是一个重复的轮子

虽然 增删改 是 hibernate 和 mybatis、data-jdbc 等等 ORM 的强项,但查询,特别是有 多条件联表分页排序 的复杂的列表查询,却一直是它们的弱项。

传统的 ORM 很难用较少的代码实现一个复杂的列表检索,但 Bean Searcher 却在这方面下足了功夫,这些复杂的查询,几乎只用一行代码便可以解决。

  • 例如,这样的一个典型的需求:

后端需要写一个检索接口,而如果用传统的 ORM 来写,代码之复杂是可以想象的。

而 Bean Searcher 却可以:

:boom: 只一行代码实现以上功能

首先,你有一个实体类:

@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...
}

然后你就可以用一行代码实现这个用户检索接口:

@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()));
    }
	
}

这一行代码实现了以下功能:

  • 多表联查
  • 分页搜索
  • 组合过滤
  • 任意字段排序
  • 字段统计

例如,该接口支持如下请求:

  • 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 字段

:sparkles: 参数构建器

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);

:rocket: 快速开发

使用 Bean Searcher 可以极大地节省后端的复杂列表检索接口的开发时间!

  • 普通的复杂列表查询只需一行代码
  • 单表检索可复用原有 Domain,无需定义 SearchBean

:seedling: 集成简单

可以和任意 Java Web 框架集成,如:SpringBoot、Spring MVC、Grails、Jfinal 等等。

Spring Boot 项目,添加依赖即集成完毕:

implementation 'com.ejlchina:bean-searcher-boot-stater:3.1.2'

接着便可在 Controller  Service 里注入检索器:

/**
 * 注入 Map 检索器,它检索出来的数据以 Map 对象呈现
 */
@Autowired
private MapSearcher mapSearcher;

/**
 * 注入 Bean 检索器,它检索出来的数据以 泛型 对象呈现
 */
@Autowired
private BeanSearcher beanSearcher;

其它框架,使用如下依赖:

implementation 'com.ejlchina:bean-searcher:3.1.2'

然后可以使用 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();

:hammer: 扩展性强

面向接口设计,用户可自定义扩展 Bean Searcher 中的任何组件!

比如你可以:

  • 自定义 DbMapping 来实现自定义注解,或让 Bean Searcher 识别其它 ORM 的注解
  • 自定义 ParamResolver 来支持 JSON 形式的检索参数
  • 自定义 FieldConvertor 来支持任意的 字段类型
  • 自定义 Dialect 来支持更多的数据库
  • 等等..
加载中

Bean Searcher 发布 v3.7.0 版本

简介 很多系统都有列表检索(如:订单管理,用户管理)这样的需求,而每一个列表页所需展示的数据往往会横跨多张数据库表(比如订单管理页表格里的订单号列来自订单表,用户名列来自用户表)...

07/08 13:30

Bean Searcher 发布 v3.6.1 版本

本次更新内容: :sparkles: Features Bean Searcher 新增 BoolNumFieldConvertor 字段转换器:支持 Boolean -> Number 方向的转换 优化 SearcherBuilder 新增 addResultFilter(..) 方法 Bean...

05/10 11:13

Bean Searcher 发布 v3.6.0 版本

更新内容: 1. 支持嵌入参数前缀符转义语义 2. 实体类支持声明默认排序与排序约束 3. 新增 ResultFilter,可对检索结果统一做进一步的自定义处理 4. 新增 PostgreSqlDialect 方言,可用于 Po...

04/22 09:59

Bean Searcher 发布 v3.5.3 版本

更新内容: :sparkles: Better Bean Searcher Boot Starter: 升级 spring-boot -> 2.6.6 :bug: Bug Fixes 修复:对于 Boolean 类型的字段,当检索时该字段传入的参数值为 空串 时,BoolValue...

04/07 10:08

Bean Searcher 发布 v3.5.2 版本

:sparkles: Features Bean Searcher: 参数构建器新增 field(FieldFn<T, ?> fieldFn, Collection<?> values) 与 field(String fieldName, Collection<?> values) 方法,支持字段值集合参数 :s...

03/17 11:34

Bean Searcher 发布 v3.5.1 版本

:sparkles: Better 强化对复杂逻辑表达式的简化能力 升级 slf4j-api -> 1.7.36 参见: https://github.com/ejlchina/bean-searcher/releases https://gitee.com/ejlchina-zhxu/bean-searcher...

02/28 14:53

Bean Searcher 发布 v3.5.0 版本

:sparkles: Features Bean Searcher 新增 GroupResolver、ExprParser 等组件,实现参数分组与逻辑关系的表达、运算、智能化简与解析的能力 参见:#I4J229:如何实现 更加复杂 的 or 条件分组查...

02/24 19:11

Bean Searcher 发布 v3.4.3 版本

:bug: Bug Fixes 修复 StartWith 运算符不后模糊匹配的问题(该 BUG 在 v3.4.2 中滋生) 参见: https://github.com/ejlchina/bean-searcher/releases https://gitee.com/ejlchina-zhxu/bea...

02/22 14:56

Bean Searcher 发布 v3.4.2 版本

:sparkles: Better 带嵌入参数的字段也能参与过滤条件 带嵌入参数的字段也能参与字段统计 参见: https://github.com/ejlchina/bean-searcher/releases https://gitee.com/ejlchina-zhxu/bea...

02/21 10:29

Bean Searcher 发布 v3.4.1 版本

:sparkles: Better Bean Searcher 优化 SQL 生成逻辑:当 @SearchBean 注解的 joinCond 属性只有一个拼接参数 且 该参数值为空时,则使其不参与 where 子句 :bug: Bug Fixes 修复 DateFieldC...

02/17 10:45

没有更多内容

加载失败,请刷新页面

暂无问答

暂无博客

返回顶部
顶部