1、開源專案簡介
bean-searcher 是一款比 MyBatis 效率快 100 倍的條件檢索引擎,專注高階查詢的只讀 ORM,天生支援聯表,免 DTO/VO 轉換,使一行程式碼實現複雜列表檢索成為可能!
最近整理了一份10萬字的面試寶典,可以免費送給大家,獲取方式加我微信:su_san_java,備註:面試。
2、開源協議
使用Apache-2.0開源協議
3、介面展示
-
檢索結果分頁展示 -
可以按任意欄位排序 -
按檢索條件統計某些欄位值
4、功能概述
-
支援 實體多表對映 -
支援 動態欄位運算子 -
支援 分組聚合 查詢 -
支援 Select | Where | From 子查詢 -
支援 實體類嵌入引數 -
支援 欄位轉換器 -
支援 Sql 攔截器 -
支援 資料庫 Dialect 擴充套件 -
支援 多資料來源 與 動態資料來源 -
支援 註解預設 與 自定義 -
支援 欄位運算子 擴充套件 -
等等
快速開發
使用 Bean Searcher 可以極大節省後端的複雜列表檢索介面的開發時間
整合簡單
擴充套件性強
支援 註解預設
支援 多資料來源
支援 Select 指定欄位
支援 引數過濾器
支援 欄位轉換器
支援 SQL 攔截器
5、技術選型
-
框架目的:只一行程式碼實現:多表聯查分頁搜尋任意欄位組合過濾任意欄位排序多欄位統計 -
架構圖:
這絕不是一個重複的輪子
-
例如,這樣的一個典型的需求:
只一行程式碼實現以上功能
@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<User> index(HttpServletRequest request) { // 這裏只寫一行程式碼 return beanSearcher.search(User.class, MapUtils.flat(request.getParameterMap()), new String[]{ "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 欄位
引數構建器
Map<String, Object> 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<User> users = beanSearcher.searchList(User.class, params);
-
普通的複雜列表查詢只需一行程式碼 -
單表檢索可複用原有 Domain,無需定義 SearchBean
整合簡單
Spring Boot 專案,新增依賴即整合完畢:
implementation 'com.ejlchina:bean-searcher-boot-stater:3.6.0'
/** * 注入 Map 檢索器,它檢索出來的資料以 Map 物件呈現 */ @Autowired private MapSearcher mapSearcher; /** * 注入 Bean 檢索器,它檢索出來的資料以 泛型 物件呈現 */ @Autowired private BeanSearcher beanSearcher;
其它框架,使用如下依賴:
implementation 'com.ejlchina:bean-searcher:3.6.0'
DataSource dataSource = ... // 拿到應用的資料來源 // DefaultSqlExecutor 也支援多資料來源 SqlExecutor sqlExecutor = new DefaultSqlExecutor(dataSource); // 構建 Map 檢索器 MapSearcher mapSearcher = SearcherBuilder.mapSearcher() .sqlExecutor(sqlExecutor) .build(); // 構建 Bean 檢索器 BeanSearcher beanSearcher = SearcherBuilder.beanSearcher() .sqlExecutor(sqlExecutor) .build();
擴充套件性強
-
自定義 FieldOp 來支援更多的欄位運算子 -
自定義 FieldConvertor 來支援任意的 特殊欄位型別 -
自定義 DbMapping 來實現自定義註解,或讓 Bean Searcher 識別其它 ORM 的註解 -
自定義 ParamResolver 來支援其它形式的檢索引數 -
自定義 Dialect 來支援更多的資料庫 -
等等..