热门标签 | 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:防止找不到本篇文章,可以收藏点赞,方便翻阅查找哦


推荐阅读
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 如何使用 `org.apache.tomcat.websocket.server.WsServerContainer.findMapping()` 方法及其代码示例解析 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
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社区 版权所有