本文已經收錄到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)