Java 持久性 API (JPA) 是 Java 应用程序开发人员需要理解的重要 Java 功能。它准确地转换了 Java 开发人员如何将对象的方法调用转换为访问、持久化和管理存储在 NoSQL 和关系数据库中的数据。
本文通过构建自行车租赁服务的教程示例,详细 بررسی JPA。 此示例将使用 Spring Boot 框架、MongoDB 数据库(不再是开源)和 Maven 包管理器为更大的应用程序创建一个创建、读取、更新和删除 (CRUD) 层。我还使用 NetBeans 11 作为我选择的 IDE。
本教程侧重于 Java 持久性 API 的开源角度,而不是工具,以展示其工作原理。 这完全是为了学习编程应用程序的模式,但了解软件仍然是明智的。 您可以在我的 GitHub 存储库中访问完整代码。
Java:不仅仅是“beans”
Java 是一种面向对象的语言,自 1996 年发布 Java 开发工具包 (JDK) 以来,已经经历了许多变化。 了解该语言的各种途径及其虚拟机本身就是一堂历史课;简而言之,自发布以来,该语言已经像 Linux 内核一样,在许多方向上分叉。 有免费提供给社区的标准版、用于商业的企业版以及由多个供应商贡献的开源替代方案。 主要版本每六个月发布一次;由于功能经常有重大差异,因此您可能需要在选择版本之前进行一些研究。
总而言之,Java 历史悠久。 本教程重点介绍 JDK 11,它是 Java 11 的开源实现,因为它仍然是活跃的长期支持版本之一。
- Spring Boot:Spring Boot 是 Pivotal 开发的较大 Spring 框架中的一个模块。 Spring 是一个非常流行的 Java 框架。 它允许各种架构和配置。 Spring 还为 Web 应用程序和安全性提供支持。 Spring Boot 提供基本的配置,以便快速引导各种类型的 Java 项目。 本教程使用 Spring Boot 快速编写控制台应用程序并针对数据库测试功能。
- Maven: Maven 是 Apache 开发的项目/包管理器。 Maven 允许在其 POM.xml 文件中管理包和各种依赖项。 如果您使用过 NPM,您可能熟悉包管理器的功能。 Maven 还管理构建和报告功能。
- Lombok: Lombok 是一个库,允许通过对象文件中的注释创建对象 getter/setter。 这已经存在于 C# 等语言中,Lombok 将此功能引入到 Java 中。
- NetBeans: NetBeans 是一个流行的开源 IDE,专门侧重于 Java 开发。 它的许多工具都为最新的 Java SE 和 EE 更新提供了一个实现。
这组工具将用于为虚构的自行车商店创建一个简单的应用程序。 它将实现插入“Customer”和“Bike”对象集合的功能。
精心酿造
导航到 Spring Initializr。 此网站使您可以生成 Spring Boot 的基本项目需求以及项目所需的依赖项。 选择以下选项
- 项目: Maven 项目
- 语言: Java
- Spring Boot: 2.1.8(或最稳定的版本)
- 项目元数据: 任何您使用的命名约定(例如,com.stephb)
- 您可以将 Artifact 保留为“Demo”
- 依赖项: 添加
- Spring Data MongoDB
- Lombok
单击下载并在您选择的 IDE(例如 NetBeans)中打开新项目。
模型大纲
这些模型表示有关程序中特定对象的信息,这些信息将持久保存在您的数据库中。 关注两个对象:Customer 和 Bike。 首先,在 src 文件夹中创建一个 dto 文件夹。 然后,创建两个名为 Customer.java 和 Bike.java 的 Java 类对象。 它们将在程序中按以下方式结构化
Customer. Java
1 package com.stephb.JavaMongo.dto;
2
3 import lombok.Getter;
4 import lombok.Setter;
5 import org.springframework.data.annotation.Id;
6
7 /**
8 *
9 * @author stephon
10 */
11 @Getter @Setter
12 public class Customer {
13
14 private @Id String id;
15 private String emailAddress;
16 private String firstName;
17 private String lastName;
18 private String address;
19
20 }
Bike.java
1 package com.stephb.JavaMongo.dto;
2
3 import lombok.Getter;
4 import lombok.Setter;
5 import org.springframework.data.annotation.Id;
6
7 /**
8 *
9 * @author stephon
10 */
11 @Getter @Setter
12 public class Bike {
13 private @Id String id;
14 private String modelNumber;
15 private String color;
16 private String description;
17
18 @Override
19 public String toString() {
20 return "This bike model is " + this.modelNumber + " is the color " + this.color + " and is " + description;
21 }
22 }
如您所见,在对象中使用 Lombok 注释来生成属性/属性的 getter/setter。 如果您不希望该类中的所有属性都具有 getter/setter,则属性可以专门接收注释。 这两个类将形成容器,将您的数据运送到您想要显示信息的任何位置。
设置数据库
我使用 Mongo Docker 容器进行测试。 如果您的系统上安装了 MongoDB,则不必在 Docker 中运行实例。 您可以通过从其网站选择您的系统信息并按照安装说明来安装 MongoDB。
安装完成后,您可以通过命令行、GUI(例如 MongoDB Compass)或用于连接到数据源的 IDE 驱动程序与您的新 MongoDB 服务器进行交互。 现在您可以定义数据层来提取、转换和持久保存您的数据。 要设置数据库访问属性,请导航到应用程序中的 applications.properties 文件并提供以下内容
1 spring.data.mongodb.host=localhost
2 spring.data.mongodb.port=27017
3 spring.data.mongodb.database=BikeStore
定义数据访问对象/数据访问层
数据访问层 (DAL) 中的数据访问对象 (DAO) 将定义您将如何与数据库中的数据进行交互。 使用 spring-boot-starter 的好处是,查询数据库的大部分工作已经完成。
从 Customer DAO 开始。 在 src 文件夹中的新 dao 文件夹中创建一个接口,然后创建另一个名为 CustomerRepository.java 的 Java 类。 该类应如下所示
1 package com.stephb.JavaMongo.dao;
2
3 import com.stephb.JavaMongo.dto.Customer;
4 import java.util.List;
5 import org.springframework.data.mongodb.repository.MongoRepository;
6
7 /**
8 *
9 * @author stephon
10 */
11 public interface CustomerRepository extends MongoRepository<Customer, String>{
12 @Override
13 public List<Customer> findAll();
14 public List<Customer> findByFirstName(String firstName);
15 public List<Customer> findByLastName(String lastName);
16 }
此类是一个接口,它使用您的 DTO (Customer.java) 和字符串从 MongoRepository 类扩展或继承,因为它们将用于使用您的自定义函数进行查询。 因为您是从这个类继承的,所以您可以访问许多允许持久化和查询您的对象的功能,而无需实现或引用您自己的函数。 例如,在实例化 CustomerRepository 对象之后,您可以立即使用 Save 函数。 如果您需要更多扩展功能,您也可以覆盖这些功能。 我创建了一些自定义查询来搜索我的集合,给定对象的特定元素。
Bike 对象还有一个用于与数据库交互的存储库。 以与 CustomerRepository 非常相似的方式实现它。 它应该看起来像
1 package com.stephb.JavaMongo.dao;
2
3 import com.stephb.JavaMongo.dto.Bike;
4 import java.util.List;
5 import org.springframework.data.mongodb.repository.MongoRepository;
6
7 /**
8 *
9 * @author stephon
10 */
11 public interface BikeRepository extends MongoRepository<Bike,String>{
12 public Bike findByModelNumber(String modelNumber);
13 @Override
14 public List<Bike> findAll();
15 public List<Bike> findByColor(String color);
16 }
运行您的程序
现在您有了一种构建数据结构的方法以及一种提取、转换和持久化数据的方法,请运行您的程序!
导航到您的 Application.java 文件(它可能有一个不同的名称,具体取决于您如何命名您的应用程序,但它应该包含“application”)。 在定义类的位置之后包含 implements CommandLineRunner。 这将允许您实现一个 run 方法来创建一个命令行应用程序。 覆盖由 CommandLineRunner 接口提供的 run 方法并包含以下内容以测试 BikeRepository
1 package com.stephb.JavaMongo;
2
3 import com.stephb.JavaMongo.dao.BikeRepository;
4 import com.stephb.JavaMongo.dao.CustomerRepository;
5 import com.stephb.JavaMongo.dto.Bike;
6 import java.util.Scanner;
7 import org.springframework.beans.factory.annotation.Autowired;
8 import org.springframework.boot.CommandLineRunner;
9 import org.springframework.boot.SpringApplication;
10 import org.springframework.boot.autoconfigure.SpringBootApplication;
11
12
13 @SpringBootApplication
14 public class JavaMongoApplication implements CommandLineRunner {
15 @Autowired
16 private BikeRepository bikeRepo;
17 private CustomerRepository custRepo;
18
19 public static void main(String[] args) {
20 SpringApplication.run(JavaMongoApplication.class, args);
21 }
22 @Override
23 public void run(String... args) throws Exception {
24 Scanner scan = new Scanner(System.in);
25 String response = "";
26 boolean running = true;
27 while(running){
28 System.out.println("What would you like to create? \n C: The Customer \n B: Bike? \n X:Close");
29 response = scan.nextLine();
30 if ("B".equals(response.toUpperCase())) {
31 String[] bikeInformation = new String[3];
32 System.out.println("Enter the information for the Bike");
33 System.out.println("Model Number");
34 bikeInformation[0] = scan.nextLine();
35 System.out.println("Color");
36 bikeInformation[1] = scan.nextLine();
37 System.out.println("Description");
38 bikeInformation[2] = scan.nextLine();
39
40 Bike bike = new Bike();
41 bike.setModelNumber(bikeInformation[0]);
42 bike.setColor(bikeInformation[1]);
43 bike.setDescription(bikeInformation[2]);
44
45 bike = bikeRepo.save(bike);
46 System.out.println(bike.toString());
47
48
49 } else if ("X".equals(response.toUpperCase())) {
50 System.out.println("Bye");
51 running = false;
52 } else {
53 System.out.println("Sorry nothing else works right now!");
54 }
55 }
56
57 }
58 }
@Autowired 注释允许自动依赖注入 BikeRepository 和 CustomerRepository bean。 您将使用这些类来持久化和收集数据库中的数据。
就是这样! 您已经创建了一个命令行应用程序,该应用程序连接到数据库,并且只需最少的代码即可执行 CRUD 操作。
结论
从编程语言概念(如对象和类)转换为调用以存储、检索或更改数据库中的数据对于构建应用程序至关重要。 Java 持久性 API (JPA) 是 Java 开发人员工具包中解决该挑战的重要工具。 您正在 Java 中探索哪些数据库? 请在评论中分享。
评论已关闭。