热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

比MyBatis效率快100倍的条件检索引擎,天生支持联表

点击“终码一生”,关注,置顶公众号每日技术干货,第一时间送达!1开源项目简介比MyBatis效率快100倍的条件检索引擎,天生支持联表,使一行代码实现复杂列表检索成为可能!2开源协

点击“终码一生”,关注,置顶公众号

每日技术干货,第一时间送达!

1、开源项目简介

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

2、开源协议

使用Apache-2.0开源协议

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

PS:防止找不到本篇文章,可以收藏点赞,方便翻阅查找哦


推荐阅读
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
author-avatar
用户89e44snpn5
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有