EasyRelation发布,简单强大的数据关联框架

  金牌会员 | 2023-4-4 14:18:43 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 987|帖子 987|积分 2961

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
当开发人员需要进行关联查询时,往往需要编写大量的冗余代码来处理数据之间的关系。这不仅浪费时间和精力,还会影响项目的可维护性和可扩展性。
EasyRelation 是一个简单、高效的自动关联数据框架,可以通过一行代码,自动关联查询并填充需要的数据,对于性能影响极小,且省略了大量的冗余代码。
该框架适应于当前对象中的字段需要关联查询,并赋值到当前对象的字段中,数据来源可以是枚举、数据库、RPC 接口等等任意来源
特点


  • 不限制关联查询方式,需要关联的数据可以是任意来源
  • 两级缓存支持,可自由选择使用的缓存
  • 执行效率高,对性能影响极小
  • 支持多条件关联和常量条件关联
快速开始

下面演示如何使用 EasyRelation 进行自动关联数据
假设有订单类(Order)和用户类(User),订单中保存了用户名,需要关联查询用户昵称。

  • Order
  1. @Data
  2. public class Order {
  3.     private String orderId;
  4.     private String username;
  5.     private String nickName;
  6. }
复制代码

  • User
  1. @Data
  2. public class User {
  3.     private String username;
  4.     private String nickName;
  5. }
复制代码
添加依赖
  1. <properties>
  2.     <easy-relation.version>最新版本</easy-relation.version>
  3. </properties>
  4. <dependencies>
  5.     <dependency>
  6.         <groupId>cn.easii</groupId>
  7.         <artifactId>easy-relation-spring-boot-starter</artifactId>
  8.         <version>${easy-relation.version}</version>
  9.     </dependency>
  10. </dependencies>
复制代码
定义用户数据数据提供者

这里需要定义一个类,实现 DataProvideService 接口,在其中定义获取用户信息的接口,并添加 @DataProvider 注解。
  1. @Component
  2. public class UserInfoDataProvider implements DataProvideService {
  3.     @DataProvider(RelationIdentifiers.getUserByUsername)
  4.     public User getUserByUsername(UserQueryReq req) {
  5.         if ("admin".equals(req.getUsername())) {
  6.             final User user = new User();
  7.             user.setUsername("admin");
  8.             user.setNickName("管理员");
  9.             return user;
  10.         }
  11.         return null;
  12.     }
  13. }
复制代码
这里的 UserQueryReq 为用户信息查询入参,定义如下:
  1. @Data
  2. @AutoMapMapper
  3. public class UserQueryReq {
  4.     private String username;
  5.     private Long userId;
  6.     private Boolean isDeleted;
  7. }
复制代码
测试
  1. @SpringBootTest
  2. class InjectRelationTest {
  3.     @Autowired
  4.     private InjectRelation injectRelation;
  5.     @Test
  6.     void quickStart() {
  7.         Order order = getOrder("2f453910375641648ab3a2fc6e3328ef");
  8.         injectRelation.injectRelation(order);
  9.         System.out.println(order);  // Order(orderId=2f453910375641648ab3a2fc6e3328ef, username=admin, nickName=管理员)
  10.         Assert.equals(order.getNickName(), "管理员");
  11.     }
  12.     private Order getOrder(String orderId) {
  13.         Order order = new Order();
  14.         order.setOrderId(orderId);
  15.         order.setUsername("admin");
  16.         return order;
  17.     }
  18. }
复制代码
缓存支持

EasyRelation 中共设计有两级缓存,参考了 Mybatis 中的设计,在进行数据关联时,会依次经过 一级缓存 --> 二级缓存 ---> 数据提供源,从而提高数据获取的效率。
这里简单了解一下一级缓存与二级缓存:

  • 一级缓存:单次数据关联操作内的缓存,缓存的数据只在这个关联过程内有效,一级缓存根据一定规则,会自动开启。
这里的单次数据关联操作指的是调用一次 injectRelation 方法内的执行流程。


  • 二级缓存:全局缓存,比如使用 Redis 作为缓存,二级缓存需要手动开启。
详细可以参考缓存 | EasyRelation (easii.cn)
性能损耗

测试运行环境:

  • CPU:Intel i5 10400
  • 内存:32 GB
  • JDK:17
执行一百万次,多种情况下,消耗在 185 ~ 620 毫秒之间,具体可以查看性能 | EasyRelation (easii.cn)
项目地址

官方文档

主页 | EasyRelation (easii.cn)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表