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