1 開源項目簡介
比 MyBatis 效率快 100 倍的條件檢索引擎,天生支持聯(lián)表,使一行代碼實現(xiàn)復雜列表檢索成為可能!
基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權限、多租戶、數(shù)據(jù)權限、工作流、三方登錄、支付、短信、商城等功能
- 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
- 視頻教程:https://doc.iocoder.cn/video/
2 開源協(xié)議
使用Apache-2.0開源協(xié)議
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權限、多租戶、數(shù)據(jù)權限、工作流、三方登錄、支付、短信、商城等功能
3 界面展示

你的產(chǎn)品給你畫了以上一張圖,還附帶了一些要求:
- 檢索結(jié)果分頁展示
- 可以按任意字段排序
- 按檢索條件統(tǒng)計某些字段值
這時候,后臺接口該怎么寫???使用 Mybatis 或 Hibernate 寫 100 行代碼是不是還打不???而使用 Bean Searcher,只需 一行代碼 便可實現(xiàn)上述要求?。?!
4 功能概述
特性
- 支持 實體多表映射
- 支持 動態(tài)字段運算符
- 支持 分組聚合 查詢
- 支持 Select | Where | From 子查詢
- 支持 實體類嵌入?yún)?shù)
- 支持 字段轉(zhuǎn)換器
- 支持 Sql 攔截器
- 支持 數(shù)據(jù)庫 Dialect 擴展
- 支持 多數(shù)據(jù)源 與 動態(tài)數(shù)據(jù)源
- 支持 注解缺省 與 自定義
- 支持 字段運算符 擴展
- 等等
快速開發(fā)
使用 Bean Searcher 可以極大節(jié)省后端的復雜列表檢索接口的開發(fā)時間
集成簡單
可以和任意 Java Web 框架集成,如:SpringBoot、Grails、Jfinal 等
擴展性強
面向接口設計,用戶可自定義擴展 Bean Searcher 中的任何組件
支持 注解缺省
約定優(yōu)于配置,可省略注解,可復用原有域類,同時支持自定義注解
支持 多數(shù)據(jù)源
分庫分表?在這里特別簡單,告別分庫分表帶來的代碼熵值增高問題
支持 Select 指定字段
同一個實體類,可指定只 Select 其中的某些字段,或排除某些字段
支持 參數(shù)過濾器
支持添加多個參數(shù)過濾器,可自定義參數(shù)過濾規(guī)則
支持 字段轉(zhuǎn)換器
支持添加多個字段轉(zhuǎn)換器,可自定義數(shù)據(jù)庫字段到實體類字段的轉(zhuǎn)換規(guī)則
支持 SQL 攔截器
支持添加多個 SQL 攔截器,可自定義 SQL 生成規(guī)則
5 技術選型
- 框架目的:只一行代碼實現(xiàn):多表聯(lián)查分頁搜索任意字段組合過濾任意字段排序多字段統(tǒng)計
- 架構圖:

為什么用
這絕不是一個重復的輪子
雖然 增刪改 是 hibernate 和 mybatis、data-jdbc 等等 ORM 的強項,但查詢,特別是有 多條件、聯(lián)表、分頁、排序 的復雜的列表查詢,卻一直是它們的弱項。
傳統(tǒng)的 ORM 很難用較少的代碼實現(xiàn)一個復雜的列表檢索,但 Bean Searcher 卻在這方面下足了功夫,這些復雜的查詢,幾乎只用一行代碼便可以解決。
- 例如,這樣的一個典型的需求:

后端需要寫一個檢索接口,而如果用傳統(tǒng)的 ORM 來寫,代碼之復雜是可以想象的。
而 Bean Searcher 卻可以:
只一行代碼實現(xiàn)以上功能
首先,你有一個實體類:
@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...
}
然后你就可以用一行代碼實現(xiàn)這個用戶檢索接口:
@RestController
@RequestMapping("/user")
publicclassUserController{
@Autowired
privateBeanSearcherbeanSearcher;//注入BeanSearcher的檢索器
@GetMapping("/index")
publicSearchResultindex(HttpServletRequestrequest) {
//這里只寫一行代碼
returnbeanSearcher.search(User.class,MapUtils.flat(request.getParameterMap()),newString[]{"age"});
}
}
這一行代碼實現(xiàn)了以下功能:
- 多表聯(lián)查
- 分頁搜索
- 組合過濾
- 任意字段排序
- 字段統(tǒng)計
例如,該接口支持如下請求:
- GET: /user/index
- 無參請求(默認分頁):
- { "dataList": [ { "id": 1, "username": "Jack", "status": 1, "level": 1, "age": 25, "gender": "Male", "joinDate": "2021-10-01" }, ... // 默認返回 15 條數(shù)據(jù) ], "totalCount": 100, "summaries": [ 2500 // age 字段統(tǒng)計 ] }
- GET: /user/index? page=1 & size=10
- 指定分頁參數(shù)
- 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 字段
參數(shù)構建器
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);
快速開發(fā)
使用 Bean Searcher 可以極大地節(jié)省后端的復雜列表檢索接口的開發(fā)時間!
- 普通的復雜列表查詢只需一行代碼
- 單表檢索可復用原有 Domain,無需定義 SearchBean
集成簡單
可以和任意 Java Web 框架集成,如:SpringBoot、Spring MVC、Grails、Jfinal 等等。
Spring Boot 項目,添加依賴即集成完畢:
implementation'com.ejlchina3.6.0'
接著便可在 Controller 或 Service 里注入檢索器:
/**
*注入Map檢索器,它檢索出來的數(shù)據(jù)以Map對象呈現(xiàn)
*/
@Autowired
privateMapSearchermapSearcher;
/**
*注入Bean檢索器,它檢索出來的數(shù)據(jù)以泛型對象呈現(xiàn)
*/
@Autowired
privateBeanSearcherbeanSearcher;
其它框架,使用如下依賴:
implementation'com.ejlchina3.6.0'
然后可以使用 SearcherBuilder 構建一個檢索器:
DataSourcedataSource=...//拿到應用的數(shù)據(jù)源
//DefaultSqlExecutor也支持多數(shù)據(jù)源
SqlExecutorsqlExecutor=newDefaultSqlExecutor(dataSource);
//構建Map檢索器
MapSearchermapSearcher=SearcherBuilder.mapSearcher()
.sqlExecutor(sqlExecutor)
.build();
//構建Bean檢索器
BeanSearcherbeanSearcher=SearcherBuilder.beanSearcher()
.sqlExecutor(sqlExecutor)
.build();
擴展性強
面向接口設計,用戶可自定義擴展 Bean Searcher 中的任何組件!
比如你可以:
- 自定義 FieldOp 來支持更多的字段運算符
- 自定義 FieldConvertor 來支持任意的 特殊字段類型
- 自定義 DbMapping 來實現(xiàn)自定義注解,或讓 Bean Searcher 識別其它 ORM 的注解
- 自定義 ParamResolver 來支持其它形式的檢索參數(shù)
- 自定義 Dialect 來支持更多的數(shù)據(jù)庫
- 等等..
6 源碼地址
- Gitee:https://gitee.com/ejlchina-zhxu/bean-searcher
- GitHub:https://github.com/ejlchina/bean-searcher
審核編輯 :李倩
-
轉(zhuǎn)換器
+關注
關注
27文章
8974瀏覽量
150965 -
引擎
+關注
關注
1文章
366瀏覽量
22910 -
mybatis
+關注
關注
0文章
63瀏覽量
6879
原文標題:比 MyBatis 效率快 100 倍的條件檢索引擎,天生支持聯(lián)表!
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
基于網(wǎng)格技術的并行搜索引擎
維、哈、柯全文搜索引擎檢索器的關鍵技術
問答式信息檢索中模式優(yōu)化及性能評價
化工搜索引擎索引庫的研究和實現(xiàn)
開放源代碼的全文檢索引擎 Lucene
主題搜索引擎的研究
網(wǎng)絡搜索引擎,網(wǎng)絡搜索引擎的工作原理
垂直搜索引擎是什么_垂直搜索引擎有哪些
基于Lucene實現(xiàn)全文搜索引擎MYSearch的構建

阿里云圖像識別速度創(chuàng)紀錄,比AWS快2.36倍,比谷歌快5.28倍
迫于歐盟壓力,谷歌放寬對搜索引擎競爭對手的競標條件
新納米級設備比晶體管運行速度快十倍
新型納米器材誕生,比晶體管運行速度快100倍
2020上半年國內(nèi)搜索引擎數(shù)據(jù)出爐,百度斬獲雙第一
使用Rust語言重寫的代碼搜索引擎黑鳥系統(tǒng)Blackbird正式啟用

評論