當開發人員需要進行關聯查詢時,往往需要撰寫大量的冗余代碼來處理資料之間的關系,這不僅浪費時間和精力,還會影響專案的可維護性和可擴展性,
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)
專案地址
- Gitee
- Github
官方檔案
主頁 | EasyRelation (easii.cn)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/548312.html
標籤:Java
