切換語言為:簡體
比 MyBatis 快 100 倍的 ORM 框架

比 MyBatis 快 100 倍的 ORM 框架

  • 爱糖宝
  • 2024-10-15
  • 2041
  • 0
  • 0

1、開源專案簡介

比 MyBatis 快 100 倍的 ORM 框架


bean-searcher 是一款比 MyBatis 效率快 100 倍的條件檢索引擎,專注高階查詢的只讀 ORM,天生支援聯表,免 DTO/VO    轉換,使一行程式碼實現複雜列表檢索成為可能!

最近整理了一份10萬字的面試寶典,可以免費送給大家,獲取方式加我微信:su_san_java,備註:面試。

2、開源協議

使用Apache-2.0開源協議

3、介面展示

比 MyBatis 快 100 倍的 ORM 框架
你的產品給你畫了以上一張圖,還附帶了一些要求:


  • 檢索結果分頁展示
  • 可以按任意欄位排序
  • 按檢索條件統計某些欄位值


這時候,後臺介面該怎麼寫???使用 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、技術選型

  • 框架目的:只一行程式碼實現:多表聯查分頁搜尋任意欄位組合過濾任意欄位排序多欄位統計
  • 架構圖:

比 MyBatis 快 100 倍的 ORM 框架


為什麼用

這絕不是一個重複的輪子

雖然 增刪改 是 hibernate 和 mybatis、data-jdbc 等等 ORM 的強項,但查詢,特別是有 多條件、聯表、分頁、排序    的複雜的列表查詢,卻一直是它們的弱項。
傳統的 ORM 很難用較少的程式碼實現一個複雜的列表檢索,但 Bean Searcher    卻在這方面下足了功夫,這些複雜的查詢,幾乎只用一行程式碼便可以解決。
  • 例如,這樣的一個典型的需求:
比 MyBatis 快 100 倍的 ORM 框架
後端需要寫一個檢索介面,而如果用傳統的 ORM 來寫,程式碼之複雜是可以想象的。
而 Bean Searcher 卻可以:

只一行程式碼實現以上功能

首先,你有一個實體類:
@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);
快速開發
使用 Bean Searcher 可以極大地節省後端的複雜列表檢索介面的開發時間!
  • 普通的複雜列表查詢只需一行程式碼
  • 單表檢索可複用原有 Domain,無需定義 SearchBean

整合簡單

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

Spring Boot 專案,新增依賴即整合完畢:

implementation 'com.ejlchina:bean-searcher-boot-stater:3.6.0'
接著便可在 Controller 或 Service 裡注入檢索器:
/** 
            * 注入 Map 檢索器,它檢索出來的資料以 Map 物件呈現 
            */ 
            @Autowired 
            private MapSearcher mapSearcher;             
            /** 
            * 注入 Bean 檢索器,它檢索出來的資料以 泛型 物件呈現 
            */ 
            @Autowired 
            private BeanSearcher beanSearcher;

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

implementation 'com.ejlchina:bean-searcher:3.6.0'
然後可以使用 SearcherBuilder 構建一個檢索器:
DataSource dataSource = ... // 拿到應用的資料來源             
            // DefaultSqlExecutor 也支援多資料來源 
            SqlExecutor sqlExecutor = new DefaultSqlExecutor(dataSource);             
            // 構建 Map 檢索器 
            MapSearcher mapSearcher = SearcherBuilder.mapSearcher() 
            .sqlExecutor(sqlExecutor) 
            .build();             
            // 構建 Bean 檢索器 
            BeanSearcher beanSearcher = SearcherBuilder.beanSearcher() 
            .sqlExecutor(sqlExecutor) 
            .build();

擴充套件性強

面向介面設計,使用者可自定義擴充套件 Bean Searcher 中的任何元件!
比如你可以:


  • 自定義 FieldOp 來支援更多的欄位運算子
  • 自定義 FieldConvertor 來支援任意的 特殊欄位型別
  • 自定義 DbMapping 來實現自定義註解,或讓 Bean Searcher 識別其它 ORM 的註解
  • 自定義 ParamResolver 來支援其它形式的檢索引數
  • 自定義 Dialect 來支援更多的資料庫
  • 等等..

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.