當前位置: 妍妍網 > 碼農

比 MyBatis 快了 100 倍

2024-05-29碼農

大家好,我是磊哥。


比 MyBatis 效率快 100 倍的條件檢索引擎,天生支持聯表,使一行程式碼實作復雜列表檢索成為可能!

2、開源協定

使用Apache-2.0開源協定

3、 界面展示

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

  • 檢索結果分頁展示

  • 可以按任意欄位排序

  • 按檢索條件統計某些欄位值

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

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

  • 架構圖:

  • 為什麽用

    這絕不是一個重復的輪子

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

    如果你近期準備面試跳槽,建議在ddkk.com線上刷題,涵蓋 一萬+ 道 Java 面試題,幾乎覆蓋了所有主流技術面試題,還有市面上最全的技術五百套,精品系列教程,免費提供

    傳統的 ORM 很難用較少的程式碼實作一個復雜的列表檢索,但 Bean Searcher 卻在這方面下足了功夫,這些復雜的查詢,幾乎只用一行程式碼便可以解決。

  • 例如,這樣的一個典型的需求:

  • 後端需要寫一個檢索介面,而如果用傳統的 ORM 來寫,程式碼之復雜是可以想象的。

    而 Bean Searcher 卻可以:

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

    首先,你有一個實體類:

    @SearchBean(tables="user u, role r", joinCond="u.role_id = r.id", autoMapTo="u")
    public classUser{
    privatelong id;
    private String username;
    privateint status;
    privateint age;
    private String gender;
    private Date joinDate;
    privateint roleId;
    @DbField("r.name")
    private String roleName;
    // Getters and setters...
    }

    然後你就可以用一行程式碼實作這個使用者檢索介面:

    @RestController
    @RequestMapping("/user")
    public classUserController{
    @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, 2030).op(Opetator.Between) // 過濾:age between 20 and 30
    .orderBy(User::getAge, "asc"// 排序:年齡,從小到大
    .page(015// 分頁:第 0 頁, 每頁 15 條
    .build();
    List<User> users = beanSearcher.searchList(User. class, params);

    快速開發

    使用 Bean Searcher 可以極大地節省後端的復雜列表檢索介面的開發時間!

    普通的復雜列表查詢只需一行程式碼

    單表檢索可復用原有 Domain,無需定義 SearchBean

    如果你近期準備面試跳槽,建議在ddkk.com線上刷題,涵蓋 一萬+ 道 Java 面試題,幾乎覆蓋了所有主流技術面試題,還有市面上最全的技術五百套,精品系列教程,免費提供

    整合簡單

    可以和任意 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 來支持更多的資料庫

  • 等等..

  • 6、 源碼地址

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

  • 🔥 磊哥私藏精品 熱門推薦 🔥