EasyRelation釋出,簡單強大的資料關聯框架

林培烈發表於2023-03-27

當開發人員需要進行關聯查詢時,往往需要編寫大量的冗餘程式碼來處理資料之間的關係。這不僅浪費時間和精力,還會影響專案的可維護性和可擴充套件性。

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)

相關文章