EasyRelation發佈,簡單強大的數據關聯框架

来源:https://www.cnblogs.com/linpeilie/archive/2023/03/27/17263382.html
-Advertisement-
Play Games

本文已經收錄到Github倉庫,該倉庫包含電腦基礎、Java基礎、多線程、JVM、資料庫、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分散式、微服務、設計模式、架構、校招社招分享等核心知識點,歡迎star~ Github地址 今天來熟悉一下,關於JVM調優常 ...


當開發人員需要進行關聯查詢時,往往需要編寫大量的冗餘代碼來處理數據之間的關係。這不僅浪費時間和精力,還會影響項目的可維護性和可擴展性。

EasyRelation 是一個簡單、高效的自動關聯數據框架,可以通過一行代碼,自動關聯查詢並填充需要的數據,對於性能影響極小,且省略了大量的冗餘代碼。

該框架適應於當前對象中的欄位需要關聯查詢,並賦值到當前對象的欄位中,數據來源可以是枚舉、資料庫、RPC 介面等等任意來源

特點

  • 不限制關聯查詢方式,需要關聯的數據可以是任意來源
  • 兩級緩存支持,可自由選擇使用的緩存
  • 執行效率高,對性能影響極小
  • 支持多條件關聯和常量條件關聯

快速開始

下麵演示如何使用 EasyRelation 進行自動關聯數據

假設有訂單類(Order)和用戶類(User),訂單中保存了用戶名,需要關聯查詢用戶昵稱。

  • Order
@Data
public class Order {

    private String orderId;

    private String username;

    private String nickName;

}
  • User
@Data
public class User {
    private String username;
    private String nickName;
}

添加依賴

<properties>
    <easy-relation.version>最新版本</easy-relation.version>
</properties>
<dependencies>
    <dependency>
        <groupId>cn.easii</groupId>
        <artifactId>easy-relation-spring-boot-starter</artifactId>
        <version>${easy-relation.version}</version>
    </dependency>
</dependencies>

定義用戶數據數據提供者

這裡需要定義一個類,實現 DataProvideService 介面,在其中定義獲取用戶信息的介面,並添加 @DataProvider 註解。

@Component
public class UserInfoDataProvider implements DataProvideService {

    @DataProvider(RelationIdentifiers.getUserByUsername)
    public User getUserByUsername(UserQueryReq req) {
        if ("admin".equals(req.getUsername())) {
            final User user = new User();
            user.setUsername("admin");
            user.setNickName("管理員");
            return user;
        }
        return null;
    }

}

這裡的 UserQueryReq 為用戶信息查詢入參,定義如下:

@Data
@AutoMapMapper
public class UserQueryReq {

    private String username;

    private Long userId;

    private Boolean isDeleted;

}

測試

@SpringBootTest
class InjectRelationTest {

    @Autowired
    private InjectRelation injectRelation;

    @Test
    void quickStart() {
        Order order = getOrder("2f453910375641648ab3a2fc6e3328ef");
        injectRelation.injectRelation(order);
        System.out.println(order);  // Order(orderId=2f453910375641648ab3a2fc6e3328ef, username=admin, nickName=管理員)
        Assert.equals(order.getNickName(), "管理員");
    }

    private Order getOrder(String orderId) {
        Order order = new Order();
        order.setOrderId(orderId);
        order.setUsername("admin");
        return order;
    }

}

緩存支持

EasyRelation 中共設計有兩級緩存,參考了 Mybatis 中的設計,在進行數據關聯時,會依次經過 一級緩存 --> 二級緩存 ---> 數據提供源,從而提高數據獲取的效率。

這裡簡單瞭解一下一級緩存與二級緩存:

  • 一級緩存:單次數據關聯操作內的緩存,緩存的數據只在這個關聯過程內有效,一級緩存根據一定規則,會自動開啟。

這裡的單次數據關聯操作指的是調用一次 injectRelation 方法內的執行流程。

  • 二級緩存:全局緩存,比如使用 Redis 作為緩存,二級緩存需要手動開啟。

詳細可以參考緩存 | EasyRelation (easii.cn)

性能損耗

測試運行環境:

  • CPU:Intel i5 10400
  • 記憶體:32 GB
  • JDK:17

執行一百萬次,多種情況下,消耗在 185 ~ 620 毫秒之間,具體可以查看性能 | EasyRelation (easii.cn)

項目地址

官方文檔

主頁 | EasyRelation (easii.cn)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 訪問者模式(Visitor Pattern)是一種行為型設計模式,用於將操作與其所操作的對象分離開來。該模式的核心思想是將操作封裝在一個訪問者對象中,而不是分散在各個對象中。通過將操作與對象分離開來,訪問者模式可以在不修改對象結構的情況下,添加新的操作。 在前端開發中,訪問者模式通常用於處理DOM樹 ...
  • mounted: () { this.getList('', (data) => { console.log(data); }) } methods: { getList (condition) { get_list({...condition}).then(res => { if (res.dat ...
  • 在Vue $mount過程中,我們需要把模版編譯成render函數,整體實現可以分為三部分: parse、optimize、codegen。 ...
  • 1. 響應式編程 1.1. 使用基於事件的範式處理非同步數據流 1.2. 和非同步編程提供了相同的性能優勢 1.3. 能夠擴展程式(特別是擴展I/O)以處理很多連接和數據源 2. 非阻塞I/O 2.1. 有效擴展伺服器的基礎 2.2. 允許伺服器用相對較少的線程處理相對較多的連接 2.2.1. 傳統的服 ...
  • 關於商業認知 2022 年復盤了過去幾年的項目經歷:很多項目商業都沒開始就死了,能商業化閉環 & 能持續一段時間的一隻手數量都沒有。 從 2022 年幾個月陸續復盤中,收穫了不少商業相關心得: 心得:一定要選合適自己方向的項目 以前我對戰略、方向的思考是極少的,很容易陷入達克效應(鄧寧-克魯格效應) ...
  • 本文已經收錄到Github倉庫,該倉庫包含電腦基礎、Java基礎、多線程、JVM、資料庫、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分散式、微服務、設計模式、架構、校招社招分享等核心知識點,歡迎star~ Github地址 大家好,我是大彬~ 今天給大家分 ...
  • 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。本篇介紹 VLD 配置文件中配置項 MaxDataDump 的使用方法。 ...
  • 在現在的日常開發中,不管前端還是後端,JSON 格式的數據是用得比較多的,甚至可以說無處不在。在某些業務場景下也是需要用到 JSON 的,特別是 JSON 與 Java 對象之間的轉化。 ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...