当开发人员需要进行关联查询时,往往需要编写大量的冗余代码来处理数据之间的关系。这不仅浪费时间和精力,还会影响项目的可维护性和可扩展性。
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)