比MyBatis快100倍,天生支持聯(lián)表!
點擊上方“碼農(nóng)突圍”,馬上關(guān)注
這里是碼農(nóng)充電第一站,回復“666”,獲取一份專屬大禮包 真愛,請設(shè)置“星標”或點個“在看”

文章來源:https://c1n.cn/my8R6
簡介
開源協(xié)議
界面展示
功能概述
技術(shù)選型
源碼地址
簡介
對于 Java 程序員來說,MyBatis、Hibernate 等都是常見的 ORM 框架,對于一些簡單的 CRUD,事務支持非常不錯。
比 MyBatis 效率快 100 倍的條件檢索引擎,天生支持聯(lián)表,使一行代碼實現(xiàn)復雜列表檢索成為可能,絕無夸張之語!

開源協(xié)議
使用 Apache-2.0 開源協(xié)議。
界面展示
如下圖:

你的產(chǎn)品給你畫了以上一張圖,還附帶了一些要求:
檢索結(jié)果分頁展示
可以按任意字段排序
按檢索條件統(tǒng)計某些字段值
這時候,后臺接口該怎么寫???使用 Mybatis 或 Hibernate 寫 100 行代碼是不是還打不住?而使用 Bean Searcher,只需一行代碼便可實現(xiàn)上述要求!!!
功能概述
特性如下:
支持實體多表映射
支持動態(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 等。
| 擴展性強
面向接口設(shè)計,用戶可自定義擴展 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ī)則。
技術(shù)選型
框架目的:只一行代碼實現(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="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"?});
????}
}
這一行代碼實現(xiàn)了以下功能:
多表聯(lián)查
分頁搜索
組合過濾
任意字段排序
字段統(tǒng)計
例如,該接口支持如下請求:
代碼如下:
{
??"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? onlySelect=username,age:只檢索 username 與 age 兩個字段。
{
??"dataList":?[
????{
??????"username":?"Jack",
??????"age":?25
????},
????...
??],
??"totalCount":?100,
??"summaries":?[
????2500
??]
}
⑧GET: /user/index? selectExclude=joinDate:檢索時排除 joinDate 字段。
| 參數(shù)構(gòu)建器
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);
| 快速開發(fā)
使用 Bean Searcher 可以極大地節(jié)省后端的復雜列表檢索接口的開發(fā)時間:
普通的復雜列表查詢只需一行代碼
單表檢索可復用原有?Domain,無需定義?SearchBean
| 集成簡單
可以和任意 Java Web 框架集成,如:SpringBoot、Spring MVC、Grails、Jfinal 等等。
SpringBoot 項目,添加依賴即集成完畢:
implementation?'com.ejlchina:bean-searcher-boot-stater:3.6.0'
/**
?*?注入?Map?檢索器,它檢索出來的數(shù)據(jù)以?Map?對象呈現(xiàn)
?*/
@Autowired
private?MapSearcher?mapSearcher;
/**
?*?注入?Bean?檢索器,它檢索出來的數(shù)據(jù)以?泛型?對象呈現(xiàn)
?*/
@Autowired
private?BeanSearcher?beanSearcher;
其他框架,使用如下依賴:
implementation?'com.ejlchina:bean-searcher:3.6.0'
DataSource?dataSource?=?...?????//?拿到應用的數(shù)據(jù)源
//?DefaultSqlExecutor?也支持多數(shù)據(jù)源
SqlExecutor?sqlExecutor?=?new?DefaultSqlExecutor(dataSource);
//?構(gòu)建?Map?檢索器
MapSearcher?mapSearcher?=?SearcherBuilder.mapSearcher()
????????.sqlExecutor(sqlExecutor)
????????.build();
//?構(gòu)建?Bean?檢索器
BeanSearcher?beanSearcher?=?SearcherBuilder.beanSearcher()
????????.sqlExecutor(sqlExecutor)
????????.build();
| 擴展性強
面向接口設(shè)計,用戶可自定義擴展 Bean Searcher 中的任何組件!
比如你可以:
自定義?FieldOp?來支持更多的字段運算符
自定義?FieldConvertor?來支持任意的 特殊字段類型
自定義?DbMapping?來實現(xiàn)自定義注解,或讓 Bean Searcher 識別其它 ORM 的注解
自定義?ParamResolver?來支持其它形式的檢索參數(shù)
自定義?Dialect?來支持更多的數(shù)據(jù)庫
等等..
源碼地址
Gitee:https://gitee.com/ejlchina-zhxu/bean-searcher
GitHub:https://github.com/ejlchina/bean-searcher(完)
碼農(nóng)突圍資料鏈接
1、臥槽!字節(jié)跳動《算法中文手冊》火了,完整版 PDF 開放下載!
2、計算機基礎(chǔ)知識總結(jié)與操作系統(tǒng) PDF 下載
3、艾瑪,終于來了!《LeetCode Java版題解》.PDF
4、Github 10K+,《LeetCode刷題C/C++版答案》出爐.PDF歡迎添加魚哥個人微信:smartfish2020,進粉絲群或圍觀朋友圈
