0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

比MyBatis效率快100倍的條件檢索引擎

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-04-04 11:41 ? 次閱讀


1 開源項(xiàng)目簡(jiǎn)介

比 MyBatis 效率快 100 倍的條件檢索引擎,天生支持聯(lián)表,使一行代碼實(shí)現(xiàn)復(fù)雜列表檢索成為可能!

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址: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 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

3 界面展示

476356d0-d28f-11ed-bfe3-dac502259ad0.jpg

你的產(chǎn)品給你畫了以上一張圖,還附帶了一些要求:

  • 檢索結(jié)果分頁展示
  • 可以按任意字段排序
  • 按檢索條件統(tǒng)計(jì)某些字段值

這時(shí)候,后臺(tái)接口該怎么寫???使用 Mybatis 或 Hibernate 寫 100 行代碼是不是還打不?。慷褂?Bean Searcher,只需 一行代碼 便可實(shí)現(xiàn)上述要求!??!

4 功能概述

特性
  • 支持 實(shí)體多表映射
  • 支持 動(dòng)態(tài)字段運(yùn)算符
  • 支持 分組聚合 查詢
  • 支持 Select | Where | From 子查詢
  • 支持 實(shí)體類嵌入?yún)?shù)
  • 支持 字段轉(zhuǎn)換器
  • 支持 Sql 攔截器
  • 支持 數(shù)據(jù)庫 Dialect 擴(kuò)展
  • 支持 多數(shù)據(jù)源 與 動(dòng)態(tài)數(shù)據(jù)源
  • 支持 注解缺省 與 自定義
  • 支持 字段運(yùn)算符 擴(kuò)展
  • 等等
快速開發(fā)

使用 Bean Searcher 可以極大節(jié)省后端的復(fù)雜列表檢索接口的開發(fā)時(shí)間

集成簡(jiǎn)單

可以和任意 Java Web 框架集成,如:SpringBoot、Grails、Jfinal 等

擴(kuò)展性強(qiáng)

面向接口設(shè)計(jì),用戶可自定義擴(kuò)展 Bean Searcher 中的任何組件

支持 注解缺省

約定優(yōu)于配置,可省略注解,可復(fù)用原有域類,同時(shí)支持自定義注解

支持 多數(shù)據(jù)源

分庫分表?在這里特別簡(jiǎn)單,告別分庫分表帶來的代碼熵值增高問題

支持 Select 指定字段

同一個(gè)實(shí)體類,可指定只 Select 其中的某些字段,或排除某些字段

支持 參數(shù)過濾器

支持添加多個(gè)參數(shù)過濾器,可自定義參數(shù)過濾規(guī)則

支持 字段轉(zhuǎn)換器

支持添加多個(gè)字段轉(zhuǎn)換器,可自定義數(shù)據(jù)庫字段到實(shí)體類字段的轉(zhuǎn)換規(guī)則

支持 SQL 攔截器

支持添加多個(gè) SQL 攔截器,可自定義 SQL 生成規(guī)則

5 技術(shù)選型

  • 框架目的:只一行代碼實(shí)現(xiàn):多表聯(lián)查分頁搜索任意字段組合過濾任意字段排序多字段統(tǒng)計(jì)
  • 架構(gòu)圖:
476cd9da-d28f-11ed-bfe3-dac502259ad0.png
為什么用

這絕不是一個(gè)重復(fù)的輪子

雖然 增刪改 是 hibernate 和 mybatis、data-jdbc 等等 ORM 的強(qiáng)項(xiàng),但查詢,特別是有 多條件、聯(lián)表、分頁、排序 的復(fù)雜的列表查詢,卻一直是它們的弱項(xiàng)。

傳統(tǒng)的 ORM 很難用較少的代碼實(shí)現(xiàn)一個(gè)復(fù)雜的列表檢索,但 Bean Searcher 卻在這方面下足了功夫,這些復(fù)雜的查詢,幾乎只用一行代碼便可以解決。

  • 例如,這樣的一個(gè)典型的需求:
4779d55e-d28f-11ed-bfe3-dac502259ad0.png

后端需要寫一個(gè)檢索接口,而如果用傳統(tǒng)的 ORM 來寫,代碼之復(fù)雜是可以想象的。

而 Bean Searcher 卻可以:

只一行代碼實(shí)現(xiàn)以上功能

首先,你有一個(gè)實(shí)體類:

@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...
}

然后你就可以用一行代碼實(shí)現(xiàn)這個(gè)用戶檢索接口:

@RestController
@RequestMapping("/user")
publicclassUserController{

@Autowired
privateBeanSearcherbeanSearcher;//注入BeanSearcher的檢索器

@GetMapping("/index")
publicSearchResultindex(HttpServletRequestrequest){
//這里只寫一行代碼
returnbeanSearcher.search(User.class,MapUtils.flat(request.getParameterMap()),newString[]{"age"});
}

}

這一行代碼實(shí)現(xiàn)了以下功能:

  • 多表聯(lián)查
  • 分頁搜索
  • 組合過濾
  • 任意字段排序
  • 字段統(tǒng)計(jì)

例如,該接口支持如下請(qǐng)求:

  • GET: /user/index
  • 無參請(qǐng)求(默認(rèn)分頁):
  • { "dataList": [ { "id": 1, "username": "Jack", "status": 1, "level": 1, "age": 25, "gender": "Male", "joinDate": "2021-10-01" }, ... // 默認(rèn)返回 15 條數(shù)據(jù) ], "totalCount": 100, "summaries": [ 2500 // age 字段統(tǒng)計(jì) ] }
  • 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 兩個(gè)字段:
  • { "dataList": [ { "username": "Jack", "age": 25 }, ... ], "totalCount": 100, "summaries": [ 2500 ] }
  • GET: /user/index? selectExclude=joinDate
  • 檢索時(shí)排除 joinDate 字段
參數(shù)構(gòu)建器
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ù)雜列表檢索接口的開發(fā)時(shí)間!

  • 普通的復(fù)雜列表查詢只需一行代碼
  • 單表檢索可復(fù)用原有 Domain,無需定義 SearchBean
集成簡(jiǎn)單

可以和任意 Java Web 框架集成,如:SpringBoot、Spring MVC、Grails、Jfinal 等等。

Spring Boot 項(xiàng)目,添加依賴即集成完畢:

implementation'com.ejlchina3.6.0'

接著便可在 Controller 或 Service 里注入檢索器:

/**
*注入Map檢索器,它檢索出來的數(shù)據(jù)以Map對(duì)象呈現(xiàn)
*/
@Autowired
privateMapSearchermapSearcher;

/**
*注入Bean檢索器,它檢索出來的數(shù)據(jù)以泛型對(duì)象呈現(xiàn)
*/
@Autowired
privateBeanSearcherbeanSearcher;

其它框架,使用如下依賴:

implementation'com.ejlchina3.6.0'

然后可以使用 SearcherBuilder 構(gòu)建一個(gè)檢索器:

DataSourcedataSource=...//拿到應(yīng)用的數(shù)據(jù)源

//DefaultSqlExecutor也支持多數(shù)據(jù)源
SqlExecutorsqlExecutor=newDefaultSqlExecutor(dataSource);

//構(gòu)建Map檢索器
MapSearchermapSearcher=SearcherBuilder.mapSearcher()
.sqlExecutor(sqlExecutor)
.build();

//構(gòu)建Bean檢索器
BeanSearcherbeanSearcher=SearcherBuilder.beanSearcher()
.sqlExecutor(sqlExecutor)
.build();
擴(kuò)展性強(qiáng)

面向接口設(shè)計(jì),用戶可自定義擴(kuò)展 Bean Searcher 中的任何組件!

比如你可以:

  • 自定義 FieldOp 來支持更多的字段運(yùn)算符
  • 自定義 FieldConvertor 來支持任意的 特殊字段類型
  • 自定義 DbMapping 來實(shí)現(xiàn)自定義注解,或讓 Bean Searcher 識(shí)別其它 ORM 的注解
  • 自定義 ParamResolver 來支持其它形式的檢索參數(shù)
  • 自定義 Dialect 來支持更多的數(shù)據(jù)庫
  • 等等..

6 源碼地址

  • Gitee:https://gitee.com/ejlchina-zhxu/bean-searcher
  • GitHub:https://github.com/ejlchina/bean-searcher


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 轉(zhuǎn)換器
    +關(guān)注

    關(guān)注

    27

    文章

    8505

    瀏覽量

    145982
  • 引擎
    +關(guān)注

    關(guān)注

    1

    文章

    353

    瀏覽量

    22451
  • mybatis
    +關(guān)注

    關(guān)注

    0

    文章

    58

    瀏覽量

    6691

原文標(biāo)題:比 MyBatis 效率快 100 倍的條件檢索引擎,天生支持聯(lián)表!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于網(wǎng)格技術(shù)的并行搜索引擎

    研究現(xiàn)有網(wǎng)格技術(shù)和搜索技術(shù),分析并行搜索引擎的優(yōu)點(diǎn)和不足,提出基于網(wǎng)格技術(shù)的并行搜索引擎解決方案,其中包含一個(gè)3 層結(jié)構(gòu)的應(yīng)用框架和一個(gè)并行搜索引擎的應(yīng)用方案。
    發(fā)表于 03-30 10:09 ?23次下載

    維、哈、柯全文搜索引擎檢索器的關(guān)鍵技術(shù)

    研究維、哈、柯全文搜索引擎檢索器的關(guān)鍵問題,提出有效的解決方法,包括在用戶計(jì)算機(jī)沒有安裝本地輸入法和字庫的情況下輸入維、哈、柯文檢索詞并正常顯示搜索結(jié)果,針對(duì)
    發(fā)表于 04-11 09:26 ?14次下載

    問答式信息檢索中模式優(yōu)化及性能評(píng)價(jià)

    問答式信息檢索是新一代搜索引擎,集成自然語言處理和信息檢索科學(xué)的研究成果,提高信息檢索效率。該文介紹問答式信息
    發(fā)表于 04-17 09:29 ?11次下載

    化工搜索引擎索引庫的研究和實(shí)現(xiàn)

    本文在對(duì)Lucene 全文檢索索引開發(fā)包深入研究的基礎(chǔ)上,設(shè)計(jì)了多索引索引方案,有效地減少了索引時(shí)間,提高了
    發(fā)表于 12-18 16:27 ?13次下載

    開放源代碼的全文檢索引擎 Lucene

    開放源代碼的全文檢索引擎 Lucene――介紹、系統(tǒng)結(jié)構(gòu)與源碼實(shí)現(xiàn)分析 第一節(jié) 全文檢索系統(tǒng)與Lucene簡(jiǎn)介 一、           &
    發(fā)表于 02-10 15:09 ?5次下載

    主題搜索引擎的研究

    介紹了將開源的全文檢索工具包Lucene嵌入到自己的搜索引擎中來滿足開發(fā)主題搜索引擎的需求。并基于Lucene中文分詞的不足設(shè)計(jì)了一個(gè)比較完善的中文分詞器,然后將其引入具體應(yīng)
    發(fā)表于 07-05 16:30 ?11次下載

    網(wǎng)絡(luò)搜索引擎,網(wǎng)絡(luò)搜索引擎的工作原理

    網(wǎng)絡(luò)搜索引擎,網(wǎng)絡(luò)搜索引擎的工作原理 21 世紀(jì)是信息時(shí)代,隨著信息科學(xué)技術(shù)的不斷發(fā)展,網(wǎng)絡(luò)已成為人們生活中的重要組成部分,網(wǎng)上
    發(fā)表于 03-26 15:51 ?1412次閱讀

    垂直搜索引擎是什么_垂直搜索引擎有哪些

    垂直搜索引擎是針對(duì)某一個(gè)行業(yè)的專業(yè)搜索引擎,是搜索引擎的細(xì)分和延伸,是對(duì)網(wǎng)頁庫中的某類專門的信息進(jìn)行一次整合,定向分字段抽取出需要的數(shù)據(jù)進(jìn)行處理后再以某種形式返回給用戶。垂直搜索是相對(duì)通用搜
    發(fā)表于 01-04 17:19 ?7794次閱讀

    基于Lucene實(shí)現(xiàn)全文搜索引擎MYSearch的構(gòu)建

    Lucene是apache軟件基金會(huì)4 jakarta項(xiàng)目組的一個(gè)子項(xiàng)目,是一個(gè)開放源代碼的全文檢索引擎工具包,即它不是一個(gè)完整的全文檢索引擎,而是一個(gè)全文檢索引擎的架構(gòu),提供了完整的查詢引擎
    的頭像 發(fā)表于 07-25 08:07 ?2648次閱讀
    基于Lucene實(shí)現(xiàn)全文搜<b class='flag-5'>索引擎</b>MYSearch的構(gòu)建

    阿里云圖像識(shí)別速度創(chuàng)紀(jì)錄,AWS2.36,谷歌5.28

    阿里云圖像識(shí)別速度創(chuàng)紀(jì)錄,AWS2.36,谷歌5.28 12月25日,斯坦福大學(xué)發(fā)布
    發(fā)表于 12-27 12:51 ?213次閱讀

    迫于歐盟壓力,谷歌放寬對(duì)搜索引擎競(jìng)爭(zhēng)對(duì)手的競(jìng)標(biāo)條件

    在歐盟的壓力下,谷歌再次修改了相關(guān)條款,為想要出現(xiàn)在安卓手機(jī)上的搜索引擎競(jìng)爭(zhēng)對(duì)手放寬了競(jìng)標(biāo)條件。
    的頭像 發(fā)表于 10-24 16:02 ?2543次閱讀

    新納米級(jí)設(shè)備晶體管運(yùn)行速度

    EPFL研究人員已經(jīng)開發(fā)出一種當(dāng)今最快的晶體管運(yùn)行速度的器件。新設(shè)備的運(yùn)行速度也目前計(jì)算機(jī)中的晶體管
    的頭像 發(fā)表于 03-28 14:12 ?2339次閱讀

    新型納米器材誕生,晶體管運(yùn)行速度100

    EPFL研究員開發(fā)出了一種現(xiàn)今最快的晶體管運(yùn)行速度器件,并且新設(shè)備在運(yùn)行速度上也當(dāng)前計(jì)算機(jī)中的晶體管
    的頭像 發(fā)表于 04-02 11:55 ?2250次閱讀

    2020上半年國(guó)內(nèi)搜索引擎數(shù)據(jù)出爐,百度斬獲雙第一

    日前,“網(wǎng)速管家”發(fā)布2020年7月最新的國(guó)內(nèi)搜索引擎占有率,其中,百度作為多數(shù)中國(guó)網(wǎng)民優(yōu)先選擇的搜索引擎,穩(wěn)居國(guó)內(nèi)搜索引擎排名第一,PC端市場(chǎng)占81.26%,移動(dòng)端市場(chǎng)占
    的頭像 發(fā)表于 08-16 10:10 ?4671次閱讀

    使用Rust語言重寫的代碼搜索引擎黑鳥系統(tǒng)Blackbird正式啟用

    其次,需要完全從頭開始構(gòu)建了一個(gè)新的代碼搜索引擎。新的引擎需要非常(大約是舊代碼搜索速度的兩),功能更強(qiáng)大(支持子字符串查詢、正則表達(dá)式和符號(hào)搜索),并且理解代碼,將最相關(guān)的結(jié)果放
    的頭像 發(fā)表于 05-11 09:52 ?709次閱讀
    使用Rust語言重寫的代碼搜<b class='flag-5'>索引擎</b>黑鳥系統(tǒng)Blackbird正式啟用