介绍

为什么用

你的产品给你画了以上一张图,还附带了一些要求:

  • 检索结果分页展示
  • 可以按任意字段排序
  • 按检索条件统计某些字段值

这时候,后台接口该怎么写???使用 Mybatis 或 Hibernate 写 100 行代码是不是还打不住?而使用 Bean Searcher,只需 一行代码 便可实现上述要求!!!

设计哲学

写这个章节实属无奈,因为很多刚刚接触 Bean Searcher 的人都很难明白它真正要解决的问题是什么,只有正确使用它一段时间后才能体验到它带来的巨大便利。本章则尝试用文字向你展示它的一些设计思考。

任何一个系统都难逃有列表检索(如:订单管理,用户管理)的这样的需求,而每一个列表页所需展示的数据往往会横跨多张数据库表(比如订单管理页表格里的订单号列来自订单表,用户名列来自用户表),此时我们的后端所建的 域类(与数据库表想关联的那个实体类)与页面所需展示的数据并不能形成一一对应关系。

因此,VO 产生了。它介于页面数据与域类之间,页面展示的数据不再需要与后端的域类一一对应,而只需要与 VO 一一对应就可以了,而 VO 也不再需要与数据表做映射,业务代码里拼装就可以了。

但此时,后端的逻辑又复杂了一点,因为我们还要处理 域类(或者复杂的 SQL 查询语句)与 VO 之间的转换关系。

而 Bean Searcher 认为,VO 不再需要与域类扯上关系,一个 VO 既可以与页面数据一一对应,又可以直接映射到数据库里的多张数据表(域类不同,它只映射到一张表),而这种新的 VO 称为 Search Bean。因此,Search Bean 是直接与数据库有跨表映射关系的 VO,它与 域类 有着本质的区别。

正因为 Search Bean 是一种 VO,所以它不应像域类那样在业务代码中被随意引用,它是直接面向前端的页面数据的(深刻理解一下:Search Bean 里定义的 Java 字段都是给前端页面直接使用的)。因此,一个 Search Bean 代表一种业务检索,如:

  • 订单列表检索接口,对应一个 SearchBean
  • 用户列表检索接口,对应一个 SearchBean

关于检索条件

在 Search Bean 出现之前,前端传来的检索条件都是需要业务代码处理的(因为普通的 VO 无法与数据库直接映射),而 Search Bean 出现之后,检索条件可以用 Search Bean 里的字段和参数直接表达,并且直接映射成数据库的查询语句。

所以,后端检索接口里的代码只需要收集页面的检索参数即可,就像文档首页所展示的代码 一样,并不需要做太多的处理。这就是 Bean Searcher 之所以提倡 使一行代码实现复杂列表检索成为可能 的原因。

Bean Searcher

Bean Searcher 是一个轻量级 数据库 条件检索引擎,它的作用是从已有的数据库表中检索数据,它的目的是为了减少后端模板代码的开发,极大提高开发效率,节省开发时间,使得一行代码完成一个列表查询接口成为可能!

  • 不依赖具体的 Web 框架(即可以在任意的 Java Web 框架内使用)

  • 不依赖具体的 ORM 框架(即可以与任意的 ORM 框架配合使用,没有 ORM 也可单独使用)

与 Hibernate MyBatis 的区别

首先,Bean Searcher 并不是一个完全的 ORM 框架,它存在的目的不是为了替换他们,而是为了弥补他们在 列表检索领域 的不足。

下表列举它们之间的具体区别:

区别点Bean SearcherHibernateMyBatis
ORM只读 ORM全自动 ORM半自动 ORM
实体类可多表映射支持不支持不支持
字段运算符动态静态静态
CRUDOnly RCRUDCRUD

从上表可以看出,Bean Searcher 只能做数据库查询,不支持 增删改。但它的 多表映射机制动态字段运算符,可以让我们在做复杂列表检索时代码 以一当十,甚至 以一当百

更关键的是,它无第三方依赖,在项目中可以和 任意 ORM 配合 使用。

哪些项目可以使用

  • Java 项目(当然 Kotlin、Groovy 也是可以的)

  • 使用了 关系数据库的项目(如:MySQL)

  • 可与任意框架集成:Spring Boot、Grails、Jfinal 等等

DEMO 快速体验

仓库地址

https://gitee.com/troyzhxu/bean-searcher-demo

第一步:克隆

> git clone https://gitee.com/troyzhxu/bean-searcher-demo.git
1

第二步:运行

> cd bean-searcher-demo
> mvn spring-boot:run
1
2

第三步:效果

访问 http://localhost:8080/ 既可查看运行效果。

此例的更多信息,可参阅:DEMO 详细介绍

版本迭代

v2.2 的新特性

  1. 支持以 lambda 的方式构建检索参数
  2. SQL 日志的输出级别调为 DEBUG

v2.1 的新特性

  1. 支持形如 :name: 的拼接参数

v2.0 的新特性

  1. 实现 Spring Boot Starter 化