当开发人员须要进行关联查问时,往往须要编写大量的冗余代码来解决数据之间的关系。这不仅浪费时间和精力,还会影响我的项目的可维护性和可扩展性。
EasyRelation 是一个简略、高效的主动关联数据框架,能够通过一行代码,主动关联查问并填充须要的数据,对于性能影响极小,且省略了大量的冗余代码。
该框架适应于以后对象中的字段须要关联查问,并赋值到以后对象的字段中,数据起源能够是枚举、数据库、RPC 接口等等任意起源。
特点
- 不限度关联查问形式,须要关联的数据能够是任意起源
- 两级缓存反对,可自由选择应用的缓存
- 执行效率高,对性能影响极小
- 反对多条件关联和常量条件关联
疾速开始
上面演示如何应用 EasyRelation 进行主动关联数据
假如有订单类(Order
)和用户类(User
),订单中保留了用户名,须要关联查问用户昵称。
Order
@Datapublic class Order { private String orderId; private String username; private String nickName;}
User
@Datapublic 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
注解。
@Componentpublic 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@AutoMapMapperpublic class UserQueryReq { private String username; private Long userId; private Boolean isDeleted;}
测试
@SpringBootTestclass 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)