Java编程通过预测增强数据模型详解

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(76)   2024-05-28 06:21:22

介绍

数据模型可能很棘手。建模可能更难。有时应该进入数据库表的信息不一定是我们想要输出到每段代码的信息。

和许多其他时候一样,Spring 来拯救。一个名为投影 的小功能可以帮助我们在普通界面中仅用几行就可以映射数据。

在本文中,我们将通过一个简单示例了解如何使用投影。

基础知识

好的,让我们设置场景。假设我们有以下实体:

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table
@EqualsAndHashCode(doNotUseGetters = true)
@ToString(doNotUseGetters = true)
public class User implements Serializable {
 
 @Id
 @SequenceGenerator(name = "user_seq", sequenceName = "user_seq")
 @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "user_seq")
 private Long id;
 
 @Basic
 private String username;
 
 @Basic
 private String salt;
 
 @Basic
 private String password;
 
 @Basic
 private String firstName;
 
 @Basic
 private String lastName;
}

一些解释在这里可能会有帮助:让我们看一下注释。老实说,我很懒惰,所以 Lombok 正合我意。 Lombok 为我们提供了一种很好的声明方式来说明我们需要:

  • 用于创建 bean 的漂亮构建器界面 (@Builder)
  • getter 和 setter (@Data)
  • 默认构造函数(@NoArgsConstructor
  • 一个带有所有字段参数的构造函数 (@AllArgsConstructor)
  • equals()hashCode(),但请使用字段,而不是 getter (@EqualsAndHashCode(doNotUseGetters = true))
  • toString();再次使用字段 (@ToString(doNotUseGetter = true))

其余注释(@Entity@Table)是很好的旧 JPA。

是的,所以,我们有一个很好的实体。问题是什么?

以传统方式获取数据

让我们看看这个存储库:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

}

上面的代码为我们提供了一组最小的 CRUD 方法。一个是 getOne(Long id)。很好,不是吗?

那么,正确答案必须是:视情况而定!为什么?因为这会返回整个实体,包括盐和散列密码。这是非常敏感的信息。特别是盐不应该被外界获取。

为了从生成的实体中获取此信息,我们将不得不做大量的手动工作。就在我的脑海里,我们应该: * 创建一个新的 bean * 实现一个映射器以从我们的实体到新的 bean也可能有多个结果。

返回最低限度

值得庆幸的是,Spring安全了一天。一个名为投影 的小功能可以让我们以声明的方式定义映射。这样的界面看起来像这样:

public interface UserProjection {
 
 @Value("#{target.getUsername()}")
 String getUsername();
 
 @Value("#{target.getFirstName()}")
 String getFirstName();
 
 @Value("#{target.getLastName()}")
 String getLastName();
}

Spring 会将 target 替换为我们当前正在处理的实体。换句话说,target 将是 User 的一个实例。

我们现在唯一要做的就是这样:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
 
 UserProjection findById(Long id);
 
 List<UserProjection> findAllUser();
}

现在,每次我们调用 findById() 时,我们都会得到一个 UserProjection 的实例。我们的盐或密码散列不可能泄露!更好的是,我们可以对具有多个结果的方法使用相同的过程。

总结

我们可以使用 Spring Projections 节省大量代码和痛苦。 @Value() 定义可以根据我们的需要变得非常复杂。例如,在我当前的项目中,当我们将“有趣的”遗留数据库设计映射到更简单的数据模型时,这为我的团队节省了大量样板代码。

如果您想试一试,可以在 GitHub 上找到一个简单的示例应用程序。

标签2: Java教程
地址:https://www.cundage.com/article/jcg-power-data-model-projections.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...