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

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)

项目地址

官方文档

主页 | EasyRelation (easii.cn)

EasyRelation发布,简单强大的数据关联框架的更多相关文章

  1. 一个类GraphQL的ORM数据访问框架发布

    Zongsoft.Data 发布公告 很高兴我们的 ORM 数据访问框架(Zongsoft.Data)在历经两个 SaaS 产品的应用之后,今天正式宣布对外推广! 这是一个类 GraphQL 风格的  ...

  2. 架构从最简单的数据访问框架(ORM)到资源调度和治理中心(SOA)说起

    随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构当网站流量很小时,只需一个应用,将 ...

  3. hadoop大数据基础框架技术详解

    一.什么是大数据 进入本世纪以来,尤其是2010年之后,随着互联网特别是移动互联网的发展,数据的增长呈爆炸趋势,已经很难估计全世界的电子设备中存储的数据到底有多少,描述数据系统的数据量的计量单位从MB ...

  4. 分享自己的超轻量级高性能ORM数据访问框架Deft

    Deft 简介 Deft是一个超轻量级高性能O/R mapping数据访问框架,简单易用,几分钟即可上手. Deft包含如下但不限于此的特点: 1.按照Transact-SQL的语法语义风格来设计,只 ...

  5. 深度神经网络DNN的多GPU数据并行框架 及其在语音识别的应用

    深度神经网络(Deep Neural Networks, 简称DNN)是近年来机器学习领域中的研究热点,产生了广泛的应用.DNN具有深层结构.数千万参数需要学习,导致训练非常耗时.GPU有强大的计算能 ...

  6. 【深度学习系列2】Mariana DNN多GPU数据并行框架

    [深度学习系列2]Mariana DNN多GPU数据并行框架  本文是腾讯深度学习系列文章的第二篇,聚焦于腾讯深度学习平台Mariana中深度神经网络DNN的多GPU数据并行框架.   深度神经网络( ...

  7. 学习大数据基础框架hadoop需要什么基础

    什么是大数据?进入本世纪以来,尤其是2010年之后,随着互联网特别是移动互联网的发展,数据的增长呈爆炸趋势,已经很难估计全世界的电子设备中存储的数据到底有多少,描述数据系统的数据量的计量单位从MB(1 ...

  8. 语义SLAM的数据关联和语义定位(一)

    语义SLAM和多传感器融合是自动驾驶建图和定位部分比较热门的两种技术.语义SLAM中,语义信息的数据关联相较于特征点的数据关联有所不同.我们一般用特征描述子的相似性来匹配和关联不同图像中的特征点.特征 ...

  9. 使用Postman轻松实现接口数据关联

    Postman Postman是一款非常流行的HTTP(s)接口测试工具,入门简单,界面美观,功能强大.作为一个测试/开发工程师,这是一款必须要会用的工具.今天以一个实际的案例,来介绍下Postman ...

  10. html 布局;css3+jq 下拉菜单;table分页动态添加行;html5本地存储;简单易用的html框架

    简单好用的html框架,预览图见最后: 源码: 1.页面布局使用table: table 嵌套 +iframe 布局: 2.下拉菜单为jq+css3 动画; css input 无边框,select下 ...

随机推荐

  1. python + uiautomator2 常用公共方法封装

    前言 由于公司UI自动化框架底层用的是Uiautomator2,所以我就用Uiautomator2搭了一套UI自动化框架,思路其实和Appnium一样的. uiautomator2是一个自动化测试开源 ...

  2. sonar使用

    代码质量检查工具 sonar 1. 下载,版本sonar 4.5.1 运行bin下的bat文件,浏览器中访问: http://localhost:9000 , 成功. 2. 修改数据库为mysql数据 ...

  3. python3中的负数整除、求余问题

    注:小白问题,大神们请忽略先看示例,非整除: >>> -10/3-3.3333333333333335>>> 10/-3-3.3333333333333335> ...

  4. java_web----1

    一.HTML 1.网页的构成 结构:HTML 超文本标记语言  标签语言 标签写法: <标签名> </标签名> <标签名/> 表现:CSS 行为:JavaScrip ...

  5. Java流程控制1

    Scanner对象 java.util.Scanner 通过Scanner类来获取用户输入 next()和nextline()来获取输入的字符串,读取前我们一般需要使用hasnext()和hasnex ...

  6. matlab函数学习笔记

    数值精度 显示精度由format函数控制,不影响原始数据,只控制显示精度 命令 说明 long   short   rat 分数 digits   vpa   pi的输出 命令 显示结果结果 form ...

  7. Python数据分析第七周作业-MySQL的安装及应用

    项目 MySQL 博客名称 2003031126-石升福-Python数据分析第七周作业 班级链接 20级数据班(本) 作业链接 第七周作业 要求 每道题要有题目,代码(使用插入代码,不会插入代码的自 ...

  8. 08 分布式计算MapReduce--词频统计

    def getText(): txt=open("D:\\test.txt","r").read() txt=txt.lower() punctuation = ...

  9. 服务器DMZ理解

    转别人的 您的公司有一堆电脑,但可以归为两大类:客户机.服务器.所谓客户机就是主动发起连接请求的机器,所谓服务器就是被动响应提供某些服务的机器.服务器又可以分仅供企业内网使用和为外网提供服务两种.   ...

  10. Crypto入门 (九) easy_RSA

    前言: 建议看这篇随笔之前先看入门(8)数论基础,简单学习下,有利于你看懂后面得算法原理,链接给出:https://www.cnblogs.com/yuanchu/p/13494104.html ea ...