乐趣区

关于java:EasyRelation-发布简单强大的数据关联框架

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

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)

退出移动版