构建一个应用程序,用于在基于内存的数据库中存储 POJO(普通旧 Java 对象)

时间:2022-12-20 16:19:36

构建一个应用程序,用于在基于内存的数据库中存储 POJO(普通旧 Java 对象)

本指南将引导您完成构建应用程序的过程,该应用程序使用 Spring Data JPA 在关系数据库中存储和检索数据。

您将构建什么

您将构建一个应用程序,用于在基于内存的数据库中存储 POJO(普通旧 Java 对象)。​​Customer​

你需要什么

  • 约15分钟
  • 最喜欢的文本编辑器或 IDE
  • JDK 1.8或以后
  • 格拉德尔 4+或梅文 3.2+
  • 您也可以将代码直接导入到 IDE 中:
  • 弹簧工具套件 (STS)
  • 智能理念
  • VSCode

如何完成本指南

像大多数春天一样入门指南,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都会得到工作代码。

从头开始,请继续从 Spring 初始化开始.

跳过基础知识,请执行以下操作:

  • 下载并解压缩本指南的源存储库,或使用吉特:git clone https://github.com/spring-guides/gs-accessing-data-jpa.git
  • 光盘成gs-accessing-data-jpa/initial
  • 跳转到定义简单实体.

完成后,您可以根据 中的代码检查结果。​​gs-accessing-data-jpa/complete​

从 Spring 初始化开始

你可以使用这个预初始化项目,然后单击生成以下载 ZIP 文件。此项目配置为适合本教程中的示例。

手动初始化项目:

  1. 导航到https://start.spring.io.此服务拉入应用程序所需的所有依赖项,并为您完成大部分设置。
  2. 选择 Gradle 或 Maven 以及您要使用的语言。本指南假定您选择了 Java。
  3. 单击依赖关系并选择 Spring Data JPA,然后选择 H2 数据库
  4. 单击生成
  5. 下载生成的 ZIP 文件,该文件是配置了您选择的 Web 应用程序的存档。

如果您的 IDE 集成了 Spring Initializr,则可以从 IDE 完成此过程。

您也可以从 Github 分叉项目,然后在 IDE 或其他编辑器中打开它。

定义简单实体

在此示例中,您将存储对象,每个对象都作为 JPA 实体进行批注。下面的清单显示了 Customer 类 (in ):​​Customer​​​​src/main/java/com/example/accessingdatajpa/Customer.java​

package com.example.accessingdatajpa;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Customer {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String firstName;
private String lastName;

protected Customer() {}

public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}

@Override
public String toString() {
return String.format(
"Customer[id=%d, firstName='%s', lastName='%s']",
id, firstName, lastName);
}

public Long getId() {
return id;
}

public String getFirstName() {
return firstName;
}

public String getLastName() {
return lastName;
}
}

这里有一个具有三个属性的类:、 和 。您还有两个构造函数。默认构造函数的存在只是为了 JPA。您不直接使用它,因此它被指定为 .另一个构造函数是用于创建要保存到数据库的实例的构造函数。​​Customer​​​​id​​​​firstName​​​​lastName​​​​protected​​​​Customer​

该类用 注释,表示它是一个 JPA 实体。(由于不存在批注,因此假定此实体映射到名为 .​​Customer​​​​@Entity​​​​@Table​​​​Customer​

对象的属性被批注,以便 JPA 将其识别为对象的 ID。该属性还带有批注,以指示应自动生成 ID。​​Customer​​​​id​​​​@Id​​​​id​​​​@GeneratedValue​

其他两个属性 和 不带批注。假定它们映射到与属性本身共享相同名称的列。​​firstName​​​​lastName​

方便的方法打印出客户的财产。​​toString()​

创建简单查询

Spring Data JPA专注于使用JPA将数据存储在关系数据库中。它最引人注目的功能是能够在运行时从存储库界面自动创建存储库实现。

若要了解其工作原理,请创建与实体一起使用的存储库界面,如以下清单 (in ) 所示:​​Customer​​​​src/main/java/com/example/accessingdatajpa/CustomerRepository.java​

package com.example.accessingdatajpa;

import java.util.List;

import org.springframework.data.repository.CrudRepository;

public interface CustomerRepository extends CrudRepository<Customer, Long> {

List<Customer> findByLastName(String lastName);

Customer findById(long id);
}

​CustomerRepository​​扩展接口。它使用的实体类型和 ID 和 在 上的泛型参数中指定。通过扩展 ,继承了几种使用持久性的方法,包括保存、删除和查找实体的方法。​​CrudRepository​​​​Customer​​​​Long​​​​CrudRepository​​​​CrudRepository​​​​CustomerRepository​​​​Customer​​​​Customer​

Spring Data JPA 还允许您通过声明其方法签名来定义其他查询方法。例如,包括方法。​​CustomerRepository​​​​findByLastName()​

在典型的 Java 应用程序中,您可能希望编写一个实现 .然而,这就是Spring Data JPA如此强大的原因:你不需要编写存储库接口的实现。Spring Data JPA在运行应用程序时创建一个实现。​​CustomerRepository​

现在你可以连接这个例子,看看它是什么样子的!

创建应用程序类

Spring Initializr 为应用程序创建了一个简单的类。下面的清单显示了 Initializr 为此示例创建的类(在 中):​​src/main/java/com/example/accessingdatajpa/AccessingDataJpaApplication.java​

package com.example.accessingdatajpa;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AccessingDataJpaApplication {

public static void main(String[] args) {
SpringApplication.run(AccessingDataJpaApplication.class, args);
}

}

​@SpringBootApplication​​是一个方便的注释,它添加了以下所有内容:

  • ​@Configuration​​:将类标记为应用程序上下文的 Bean 定义源。
  • ​@EnableAutoConfiguration​​:告诉 Spring 引导根据类路径设置、其他 bean 和各种属性设置开始添加 bean。例如,如果 在类路径上,则此注释会将应用程序标记为 Web 应用程序并激活关键行为,例如设置 .spring-webmvcDispatcherServlet
  • ​@ComponentScan​​:告诉 Spring 在包中查找其他组件、配置和服务,让它找到控制器。com/example

该方法使用 Spring Boot 的方法启动应用程序。您是否注意到没有一行 XML?也没有文件。此 Web 应用程序是 100% 纯 Java,您无需处理配置任何管道或基础结构。​​main()​​​​SpringApplication.run()​​​​web.xml​

现在,您需要修改初始化者为您创建的简单类。要获取输出(在本例中为控制台),您需要设置一个记录器。然后,您需要设置一些数据并使用它来生成输出。以下清单显示了已完成的类(在 中):​​AccessingDataJpaApplication​​​​src/main/java/com/example/accessingdatajpa/AccessingDataJpaApplication.java​

package com.example.accessingdatajpa;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class AccessingDataJpaApplication {

private static final Logger log = LoggerFactory.getLogger(AccessingDataJpaApplication.class);

public static void main(String[] args) {
SpringApplication.run(AccessingDataJpaApplication.class);
}

@Bean
public CommandLineRunner demo(CustomerRepository repository) {
return (args) -> {
// save a few customers
repository.save(new Customer("Jack", "Bauer"));
repository.save(new Customer("Chloe", "O'Brian"));
repository.save(new Customer("Kim", "Bauer"));
repository.save(new Customer("David", "Palmer"));
repository.save(new Customer("Michelle", "Dessler"));

// fetch all customers
log.info("Customers found with findAll():");
log.info("-------------------------------");
for (Customer customer : repository.findAll()) {
log.info(customer.toString());
}
log.info("");

// fetch an individual customer by ID
Customer customer = repository.findById(1L);
log.info("Customer found with findById(1L):");
log.info("--------------------------------");
log.info(customer.toString());
log.info("");

// fetch customers by last name
log.info("Customer found with findByLastName('Bauer'):");
log.info("--------------------------------------------");
repository.findByLastName("Bauer").forEach(bauer -> {
log.info(bauer.toString());
});
// for (Customer bauer : repository.findByLastName("Bauer")) {
// log.info(bauer.toString());
// }
log.info("");
};
}

}

该类包含一个通过一些测试的方法。首先,它从 Spring 应用程序上下文中获取。然后,它保存一些对象,演示方法并设置一些要使用的数据。接下来,它调用从数据库中获取所有对象。然后它调用按其 ID 获取单个。最后,它调用查找所有姓氏为“Bauer”的客户。该方法返回一个 Bean,该 Bean 在应用程序启动时自动运行代码。​​AccessingDataJpaApplication​​​​demo()​​​​CustomerRepository​​​​CustomerRepository​​​​Customer​​​​save()​​​​findAll()​​​​Customer​​​​findById()​​​​Customer​​​​findByLastName()​​​​demo()​​​​CommandLineRunner​

缺省情况下,Spring 引导启用 JPA 存储库支持,并查找包(及其子包)所在的位置。如果您的配置具有位于不可见的包中的 JPA 存储库接口定义,那么可以使用 及其类型安全参数指出备用包。​​@SpringBootApplication​​​​@EnableJpaRepositories​​​​basePackageClasses=MyRepository.class​

构建可执行的 JAR

您可以使用 Gradle 或 Maven 从命令行运行应用程序。您还可以构建一个包含所有必需依赖项、类和资源的可执行 JAR 文件并运行该文件。通过构建可执行 jar,可以轻松地在整个开发生命周期中跨不同环境等将服务作为应用程序进行交付、版本控制和部署。

如果使用 Gradle,则可以使用 .或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:​​./gradlew bootRun​​​​./gradlew build​

java -jar build/libs/gs-accessing-data-jpa-0.1.0.jar

如果使用 Maven,则可以使用 运行应用程序。或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:​​./mvnw spring-boot:run​​​​./mvnw clean package​

java -jar target/gs-accessing-data-jpa-0.1.0.jar

此处描述的步骤将创建一个可运行的 JAR。你也可以构建经典 WAR 文件.

运行应用程序时,应看到类似于以下内容的输出:

== Customers found with findAll():
Customer[id=1, firstName='Jack', lastName='Bauer']
Customer[id=2, firstName='Chloe', lastName='O'Brian']
Customer[id=3, firstName='Kim', lastName='Bauer']
Customer[id=4, firstName='David', lastName='Palmer']
Customer[id=5, firstName='Michelle', lastName='Dessler']

== Customer found with findById(1L):
Customer[id=1, firstName='Jack', lastName='Bauer']

== Customer found with findByLastName('Bauer'):
Customer[id=1, firstName='Jack', lastName='Bauer']
Customer[id=3, firstName='Kim', lastName='Bauer']

总结

祝贺!您已经编写了一个简单的应用程序,该应用程序使用 Spring Data JPA 将对象保存到数据库中并从中获取它们,所有这些都无需编写具体的存储库实现。