<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          比MyBatis快100倍,天生支持聯(lián)表!

          共 4921字,需瀏覽 10分鐘

           ·

          2022-05-15 16:49

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
          關(guān)注


          閱讀本文大概需要 5 分鐘。

          來自:https://c1n.cn/my8R6


          簡介


          對于 Java 程序員來說,MyBatis、Hibernate 等都是常見的 ORM 框架,對于一些簡單的 CRUD,事務(wù)支持非常不錯。

          但是有時候用起來可能比較繁瑣,最近看到一個新的類似 ORM 的框架,具備了 ORM 框架的功能,同時也還有一點 GraphQL 語法的味道。

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

          開源協(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 攔截器

          • 支持?jǐn)?shù)據(jù)庫 Dialect 擴展

          • 支持多數(shù)據(jù)源與動態(tài)數(shù)據(jù)源

          • 支持注解缺省與自定義

          • 支持字段運算符擴展

          • 等等


          | 快速開發(fā)

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


          | 集成簡單

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

          | 擴展性強

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


          | 支持注解缺省

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

          | 支持多數(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)計。

          架構(gòu)圖如下:
          為什么用?這絕不是一個重復(fù)的輪子。

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

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

          例如,這樣的一個典型的需求:
          后端需要寫一個檢索接口,而如果用傳統(tǒng)的 ORM 來寫,代碼之復(fù)雜是可以想象的,而 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...
          }

          然后你就可以用一行代碼實現(xiàn)這個用戶檢索接口:
          @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)計


          例如,該接口支持如下請求:

          GET: /user/index:無參請求(默認(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)計
          ??]
          }

          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 兩個字段。

          代碼如下:
          {
          ??"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ù)雜列表檢索接口的開發(fā)時間:
          • 普通的復(fù)雜列表查詢只需一行代碼

          • 單表檢索可復(fù)用原有?Domain,無需定義?SearchBean


          | 集成簡單

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

          SpringBoot 項目,添加依賴即集成完畢:

          implementation?'com.ejlchina:bean-searcher-boot-stater:3.6.0'

          接著便可在 Controller 或 Service 里注入檢索器:
          /**
          ?*?注入?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'

          然后可以使用 SearcherBuilder 構(gòu)建一個檢索器:
          DataSource?dataSource?=?...?????//?拿到應(yīng)用的數(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

          推薦閱讀:

          炸了!Java多線程批量操作,居然有人不做事務(wù)控制

          這些SpringBoot天生自帶Buff工具類你都用過哪些?

          互聯(lián)網(wǎng)初中高級大廠面試題(9個G)

          內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!

          ?戳閱讀原文領(lǐng)取!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??朕已閱?

          瀏覽 71
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲AV自拍 | 99精品视频在线播放免费 | 色六月综合 | 成人做爰A片免费看网站找不到了 | 久久久久久三级 |