比 MyBatis 快 100 倍,天生支持联表!

简介: 比 MyBatis 快 100 倍,天生支持联表!



1 开源项目简介

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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

2 开源协议

使用Apache-2.0开源协议

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

3 界面展示

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

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

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

4 功能概述

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

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

集成简单

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

扩展性强

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

支持 注解缺省

约定优于配置,可省略注解,可复用原有域类,同时支持自定义注解

支持 多数据源

分库分表?在这里特别简单,告别分库分表带来的代码熵值增高问题

支持 Select 指定字段

同一个实体类,可指定只 Select 其中的某些字段,或排除某些字段

支持 参数过滤器

支持添加多个参数过滤器,可自定义参数过滤规则

支持 字段转换器

支持添加多个字段转换器,可自定义数据库字段到实体类字段的转换规则

支持 SQL 拦截器

支持添加多个 SQL 拦截器,可自定义 SQL 生成规则

5 技术选型

  • 框架目的:只一行代码实现:多表联查分页搜索任意字段组合过滤任意字段排序多字段统计
  • 架构图:

为什么用

这绝不是一个重复的轮子

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

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

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

后端需要写一个检索接口,而如果用传统的 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...
}

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

@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()), new String[]{ "age" });
    }
}

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

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

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

  • 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 源码地址



相关文章
|
前端开发 Java 数据库连接
比 MyBatis 效率快 100 倍的条件检索引擎,天生支持联表! 下
比 MyBatis 效率快 100 倍的条件检索引擎,天生支持联表! 下
|
SQL 消息中间件 JavaScript
比 MyBatis 效率快 100 倍的条件检索引擎,天生支持联表! 上
比 MyBatis 效率快 100 倍的条件检索引擎,天生支持联表! 上
|
19天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
7天前
|
SQL XML Java
springboot整合mybatis-plus及mybatis-plus分页插件的使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis-Plus及其分页插件,包括依赖引入、配置文件编写、SQL表创建、Mapper层、Service层、Controller层的创建,以及分页插件的使用和数据展示HTML页面的编写。
springboot整合mybatis-plus及mybatis-plus分页插件的使用
|
2月前
|
Java 数据库连接 测试技术
SpringBoot 3.3.2 + ShardingSphere 5.5 + Mybatis-plus:轻松搞定数据加解密,支持字段级!
【8月更文挑战第30天】在数据驱动的时代,数据的安全性显得尤为重要。特别是在涉及用户隐私或敏感信息的应用中,如何确保数据在存储和传输过程中的安全性成为了开发者必须面对的问题。今天,我们将围绕SpringBoot 3.3.2、ShardingSphere 5.5以及Mybatis-plus的组合,探讨如何轻松实现数据的字段级加解密,为数据安全保驾护航。
89 1
|
2月前
|
Web App开发 前端开发 关系型数据库
基于SpringBoot+Vue+Redis+Mybatis的商城购物系统 【系统实现+系统源码+答辩PPT】
这篇文章介绍了一个基于SpringBoot+Vue+Redis+Mybatis技术栈开发的商城购物系统,包括系统功能、页面展示、前后端项目结构和核心代码,以及如何获取系统源码和答辩PPT的方法。
|
2月前
|
Java 关系型数据库 MySQL
1、Mybatis-Plus 创建SpringBoot项目
这篇文章是关于如何创建一个SpringBoot项目,包括在`pom.xml`文件中引入依赖、在`application.yml`文件中配置数据库连接,以及加入日志功能的详细步骤和示例代码。
|
28天前
|
Java 数据库连接 开发者
MyBatis-Plus整合SpringBoot及使用
MyBatis-Plus为MyBatis提供了强大的增强,使得在Spring Boot项目中的数据访问层开发变得更加快捷和简便。通过MyBatis-Plus提供的自动CRUD、灵活的查询构造器和简洁的配置,开发者
36 0
|
2月前
|
数据库
elementUi使用dialog的进行信息的添加、删除表格数据时进行信息提示。删除或者添加成功的信息提示(SpringBoot+Vue+MybatisPlus)
这篇文章介绍了如何在基于SpringBoot+Vue+MybatisPlus的项目中使用elementUI的dialog组件进行用户信息的添加和删除操作,包括弹窗表单的设置、信息提交、数据库操作以及删除前的信息提示和确认。
elementUi使用dialog的进行信息的添加、删除表格数据时进行信息提示。删除或者添加成功的信息提示(SpringBoot+Vue+MybatisPlus)
|
2月前
|
Java 数据库 Spring
MyBatisPlus分页插件在SpringBoot中的使用
这篇文章介绍了如何在Spring Boot项目中配置和使用MyBatis-Plus的分页插件,包括创建配置类以注册分页拦截器,编写测试类来演示如何进行分页查询,并展示了测试结果和数据库表结构。
MyBatisPlus分页插件在SpringBoot中的使用