介绍

为什么用

需求图

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

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

这时候,后台接口该怎么写???使用 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://github.com/ejlchina/bean-searcher/tree/master/bean-searcher-demos/spring-boot-demo

第一步:克隆

> git clone https://github.com/ejlchina/bean-searcher.git
1

第二步:运行

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

第三步:效果

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

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

版本迭代

v3.1 的新特性

  • Bean Searcher

    • 新增 BFieldConvertorMFieldConvertor 字段转换器子接口,提高字段转换效能
    • 新增 DateFieldConvertor,支持 DateLocalDateTime 类型之间的转换
    • 增强 DateFormatFieldConvertor,使支持 Temporal 及其子类的对象的格式化
    • 增强 DateFormatFieldConvertor,新增:setZoneId(ZoneId) 方法,可配置时区
    • 增强 DefaultSqlExecutor,新增 setTransactionIsolation(int level) 方法,可配置隔离级别
    • 增强 DbMapping,使其完全接管数据映射的解析工作,并将 DefaultDbMappingDefaultMetaResolver 的内部独立出来
    • 增强 DefaultDbMapping,使支持配置注解缺省时的表名前缀与是否开启大写映射,即支持默认映射大写的表名与列名
  • Bean Searcher Boot Starter

    • 支持配置 NamedDataSource 类型的 Bean 来添加多个具名数据源
    • 自动添加 spring-boot-starter-jdbc 依赖
    • 默认自动配置添加 NumberFieldConvertor
    • 默认自动配置添加 StrNumFieldConvertor
    • 默认自动配置添加 BoolFieldConvertor
    • 默认自动配置添加 DateFieldConvertor
    • 默认自动配置添加 DateFormatFieldConvertor
    • 支持配置文件指定表名与字段默认小写映射 或 大写映射
    • 支持配置文件指定表名默认映射的前缀

v3.0 的新特性

  1. 支持 热加载
  2. 支持 无注解
  3. 支持 Select 指定字段
  4. 支持 条件与运算符的约束
  5. 支持 参数过滤器
  6. 支持 字段转换器
  7. 支持 Sql 拦截器
  8. 支持 多数据源
  9. 支持 JDK 9+
  10. Spring Boot 自动配置功能 独立成 Bean Searcher Boot Starter` 项目中,Bean Searcher 核心包不再依赖 Spring
  11. 简化使用,不再需要启动操作,不再需要配置 SearchBean 包名路径(移除了 SearcherStarter 类)

v2.2 的新特性

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

v2.1 的新特性

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

v2.0 的新特性

  1. 实现 Spring Boot Starter 化