1 開源項目簡介
比 MyBatis 效率快 100 倍的條件檢索引擎,天生支持聯表,使一行代碼實現復雜列表檢索成為可能!
基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
- 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
- 視頻教程:https://doc.iocoder.cn/video/
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="useru,roler",joinCond="u.role_id=r.id",autoMapTo="u")
publicclassUser{
privatelongid;
privateStringusername;
privateintstatus;
privateintage;
privateStringgender;
privateDatejoinDate;
privateintroleId;
@DbField("r.name")
privateStringroleName;
//Gettersandsetters...
}
然后你就可以用一行代碼實現這個用戶檢索接口:
@RestController
@RequestMapping("/user")
publicclassUserController{
@Autowired
privateBeanSearcherbeanSearcher;//注入BeanSearcher的檢索器
@GetMapping("/index")
publicSearchResultindex(HttpServletRequestrequest) {
//這里只寫一行代碼
returnbeanSearcher.search(User.class,MapUtils.flat(request.getParameterMap()),newString[]{"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 字段
參數構建器
Mapparams=MapUtils.builder()
.selectExclude(User::getJoinDate)//排除joinDate字段
.field(User::getStatus,1)//過濾:status=1
.field(User::getName,"Jack").ic()//過濾:name='Jack'(caseignored)
.field(User::getAge,20,30).op(Opetator.Between)//過濾:agebetween20and30
.orderBy(User::getAge,"asc")//排序:年齡,從小到大
.page(0,15)//分頁:第0頁,每頁15條
.build();
Listusers=beanSearcher.searchList(User.class,params);
快速開發
使用 Bean Searcher 可以極大地節省后端的復雜列表檢索接口的開發時間!
- 普通的復雜列表查詢只需一行代碼
- 單表檢索可復用原有 Domain,無需定義 SearchBean
集成簡單
可以和任意 Java Web 框架集成,如:SpringBoot、Spring MVC、Grails、Jfinal 等等。
Spring Boot 項目,添加依賴即集成完畢:
implementation'com.ejlchina3.6.0'
接著便可在 Controller 或 Service 里注入檢索器:
/**
*注入Map檢索器,它檢索出來的數據以Map對象呈現
*/
@Autowired
privateMapSearchermapSearcher;
/**
*注入Bean檢索器,它檢索出來的數據以泛型對象呈現
*/
@Autowired
privateBeanSearcherbeanSearcher;
其它框架,使用如下依賴:
implementation'com.ejlchina3.6.0'
然后可以使用 SearcherBuilder 構建一個檢索器:
DataSourcedataSource=...//拿到應用的數據源
//DefaultSqlExecutor也支持多數據源
SqlExecutorsqlExecutor=newDefaultSqlExecutor(dataSource);
//構建Map檢索器
MapSearchermapSearcher=SearcherBuilder.mapSearcher()
.sqlExecutor(sqlExecutor)
.build();
//構建Bean檢索器
BeanSearcherbeanSearcher=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
審核編輯 :李倩
-
轉換器
+關注
關注
27文章
8745瀏覽量
148057 -
引擎
+關注
關注
1文章
361瀏覽量
22630 -
mybatis
+關注
關注
0文章
62瀏覽量
6745
原文標題:比 MyBatis 效率快 100 倍的條件檢索引擎,天生支持聯表!
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論