# bean-searcher **Repository Path**: JavaShared/bean-searcher ## Basic Information - **Project Name**: bean-searcher - **Description**: 🔥🔥🔥 比 MyBatis 效率快 100 倍的条件检索引擎,天生支持联表,使一行代码实现复杂列表检索成为可能! - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: dev - **Homepage**: https://searcher.ejlchina.com/ - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 299 - **Created**: 2021-11-06 - **Last Updated**: 2024-11-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

logo

Maven Central License Troy.Zhou

中文 | [English](./README.md) * 文档:https://bs.zhxu.cn/ * **阿里云最低 1 折**:https://www.aliyun.com/minisite/goods?userCode=zugtbi5w * 掘金博客: - [这样写代码,比直接使用 MyBatis 效率提高了 100 倍!](https://juejin.cn/post/7027733039299952676) - [最近火起的 Bean Searcher 与 MyBatis Plus 倒底有啥区别?](https://juejin.cn/post/7092411551507808264) * 框架目的:只一行代码实现: - **多表联查** - **分页搜索** - **任意字段组合过滤** - **任意字段排序** - **多字段统计** - **直接得到 VO** * 设计思想:[Bean Searcher 的设计思想](https://bs.zhxu.cn/guide/latest/introduction.html#%E8%AE%BE%E8%AE%A1%E5%93%B2%E5%AD%A6) * 架构图: ![](./assets/architecture.jpg) * 更新日志:[CHANGELOG](./CHANGELOG.md) * 性能如何:[直接说一骑绝尘你可能觉得是 Tree New Bee, 还是看报告好了](./performance/README.md) * Gitee 企业版:https://gitee.com/enterprises?invite_code=Z2l0ZWUtMTM5MzQxMg%3D%3D ### ✨ 特性 * 支持 **实体多表映射** * 支持 **动态字段运算符** * 支持 **分组聚合 查询** * 支持 **Select | Where | From 子查询** * 支持 **实体类嵌入参数** * 支持 **字段转换器** * 支持 **Sql 拦截器** * 支持 **数据库 Dialect 扩展** * 支持 **多数据源 与 动态数据源** * 支持 **注解缺省 与 自定义** * 支持 **字段运算符 扩展** * 等等 ### ⁉️为什么用 #### 这绝不是一个重复的轮子 虽然 **增删改** 是 hibernate 和 mybatis、data-jdbc 等等 ORM 的强项,但查询,特别是有 **多条件**、**联表**、**分页**、**排序** 的复杂的列表查询,却一直是它们的弱项。 传统的 ORM 很难用较少的代码实现一个复杂的列表检索,但 Bean Searcher 却在这方面下足了功夫,这些复杂的查询,几乎只用一行代码便可以解决。 * 例如,这样的一个典型的需求: ![](./assets/case.png) 后端需要写一个检索接口,而如果用传统的 ORM 来写,代码之复杂是可以想象的。 而 Bean Searcher 却可以: ### 💥 只一行代码实现以上功能 首先,你有一个实体类: ```java @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... } ``` 然后你就可以用一行代码实现这个用户检索接口: ```java @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` 无参请求(默认分页): ```json { "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` 两个字段: ```json { "dataList": [ { "username": "Jack", "age": 25 }, ... ], "totalCount": 100, "summaries": [ 2500 ] } ``` * `GET: /user/index? selectExclude=joinDate` 检索时排除 `joinDate` 字段 ### ✨ 参数构建器 ```java 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); ``` **DEMO 快速体验**: * [v4.x - demos](./bean-searcher-demos) * [v3.x - demos](https://gitee.com/troyzhxu/bean-searcher/tree/v3.8/bean-searcher-demos) ### 🚀 快速开发 使用 Bean Searcher 可以极大地节省后端的复杂列表检索接口的开发时间! * 普通的复杂列表查询只需一行代码 * 单表检索可复用原有 `Domain`,无需定义 `SearchBean` ### 🌱 集成简单 可以和任意 Java Web 框架集成,如:SpringBoot、Spring MVC、Grails、Jfinal 等等。 #### Spring Boot 项目,添加依赖即集成完毕: ```groovy implementation 'cn.zhxu:bean-searcher-boot-stater:4.3.4' ``` 接着便可在 `Controller` 或 `Service` 里注入检索器: ```groovy /** * 注入 Map 检索器,它检索出来的数据以 Map 对象呈现 */ @Autowired private MapSearcher mapSearcher; /** * 注入 Bean 检索器,它检索出来的数据以 泛型 对象呈现 */ @Autowired private BeanSearcher beanSearcher; ``` #### Solon 项目,添加依赖即集成完毕: ```groovy implementation 'cn.zhxu:bean-searcher-solon-plugin:4.3.4' ``` 接着便可在 `Controller` 或 `Service` 里注入检索器: ```groovy /** * Inject a MapSearcher, which retrieved data is Map objects */ @Inject private MapSearcher mapSearcher; /** * Inject a BeanSearcher, which retrieved data is generic objects */ @Inject private BeanSearcher beanSearcher; ``` #### 其它框架,使用如下依赖: ```groovy implementation 'cn.zhxu:bean-searcher:4.3.4' ``` 然后可以使用 `SearcherBuilder` 构建一个检索器: ```java 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`](/bean-searcher/src/main/java/cn/zhxu/bs/FieldOp.java) 来支持更多的字段运算符 * 自定义 [`FieldConvertor`](/bean-searcher/src/main/java/cn/zhxu/bs/FieldConvertor.java) 来支持任意的 特殊字段类型 * 自定义 [`DbMapping`](/bean-searcher/src/main/java/cn/zhxu/bs/DbMapping.java) 来实现自定义注解,或让 Bean Searcher 识别其它 ORM 的注解 * 自定义 [`ParamResolver`](/bean-searcher/src/main/java/cn/zhxu/bs/ParamResolver.java) 来支持其它形式的检索参数 * 自定义 [`Dialect`](/bean-searcher/src/main/java/cn/zhxu/bs/dialect/Dialect.java) 来支持更多的数据库 * 等等.. ### 📚 详细文档 参阅:https://bs.zhxu.cn/ 文档已完善! ### 📅 开发计划 * v4.2: 动态方言 ✅ * v4.3: 参数构建器支持 and 与 or 便捷方法 ✅ * v4.4: 条件模板 * v4.5: 内嵌对象/列表 ### 🤝 友情接链 [**[ Sa-Token ]** 一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!](https://github.com/dromara/Sa-Token) [**[ Fluent MyBatis ]** MyBatis 语法增强框架, 综合了 MyBatisPlus, DynamicSql,Jpa 等框架的特性和优点,利用注解处理器生成代码](https://gitee.com/fluent-mybatis/fluent-mybatis) [**[ OkHttps ]** 轻量却强大的 HTTP 客户端,前后端通用,支持 WebSocket 与 Stomp 协议](https://gitee.com/troyzhxu/okhttps) [**[ hrun4j ]** 接口自动化测试解决方案 --工具选得好,下班回家早;测试用得对,半夜安心睡 ](https://github.com/lematechvip/hrun4j) [**[ JsonKit ]** 超轻量级 JSON 门面工具,用法简单,不依赖具体实现,让业务代码与 Jackson、Gson、Fastjson 等解耦!](https://gitee.com/troyzhxu/xjsonkit) [**[ Free UI ]** 基于 Vue3 + TypeScript,一个非常轻量炫酷的 UI 组件库 !](https://gitee.com/phoeon/free-ui) ### ❤️ 参与贡献 1. Star and Fork 本仓库 2. 新建 Feat_xxx 分支(新功能基于 dev 分支,bugfix 基于特定版本的分支) 3. 提交代码 4. 新建 Pull Request