咱们经过为自行车商店构建示例应用程序来学习如何使用 JPA。java
对应用开发者来讲,Java 持久化 API(JPA)是一项重要的 java 功能,须要透彻理解。它为 Java 开发人员定义了如何将对象的方法调用转换为访问、持久化及管理存储在 NoSQL 和关系型数据库中的数据的方案。linux
本文经过构建自行车借贷服务的教程示例来详细研究 JPA。此示例会使用 Spring Boot 框架、MongoDB 数据库(已经不开源)和 Maven 包管理来构建一个大型应用程序,而且构建一个建立、读取、更新和删除(CRUD)层。这儿我选择 NetBeans 11 做为个人 IDE。git
此教程仅从开源的角度来介绍 Java 持久化 API 的工做原理,不涉及其做为工具的使用说明。这全是关于编写应用程序模式的学习,但对于理解具体的软件实现也很益处。能够从个人 GitHub 仓库来获取相关代码。github
Java 是一门面向对象的编程语言,自 1996 年发布初版 Java 开发工具(JDK)起,已经变化了不少不少。要了解其各类发展及其虚拟机自己就是一堂历史课。简而言之,和 Linux 内核很类似,自发布以来,该语言已经向多个方向分支发展。有对社区免费的标准版本、有针对企业的企业版本及由多家供应商提供的开源替代品。主要版本每六个月发布一次,其功能每每差别很大,因此确认选用版本前得先作些研究。spring
总而言之,Java 的历史很悠久。本教程重点介绍 Java 11 的开源实现 JDK 11。因其是仍然有效的长期支持版本之一。mongodb
POM.xml
文件来管理包及其依赖项。若是你使用过 NPM 的话,可能会很是熟悉包管理器的功能。此外 Maven 也用来进行项目构建及生成功能报告。咱们会用这组工具为一个虚构自行车商店建立一个简单的应用程序。会实现对 Customer
和 Bike
对象集合的的插入操做。docker
导航到 Spring Initializr 页面。该网站能够生成基于 Spring Boot 和其依赖项的基本项目。选择如下选项:数据库
com.stephb
这样的。* 你能够保留 Artifact 名字为 “Demo”。
复制代码
* Spring Data MongoDB
* Lombok
复制代码
点击 下载,而后用你的 IDE(例如 NetBeans) 打开此新项目。编程
在项目里面,模型表明从数据库里取出的信息的具体对象。咱们关注两个对象:Customer
和 Bike
。首先,在 src
目录建立 dto
目录;而后,建立两个名为 Customer.java
和 Bike.java
的 Java 类对象文件。其结构以下示:api
package com.stephb.JavaMongo.dto;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Id;
/** * * @author stephon */
@Getter @Setter
public class Customer {
private @Id String id;
private String emailAddress;
private String firstName;
private String lastName;
private String address;
}
复制代码
Customer.Java
package com.stephb.JavaMongo.dto;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Id;
/** * * @author stephon */
@Getter @Setter
public class Bike {
private @Id String id;
private String modelNumber;
private String color;
private String description;
@Override
public String toString() {
return "This bike model is " + this.modelNumber + " is the color " + this.color + " and is " + description;
}
}
复制代码
Bike.java
如你所见,对象中使用 Lombok 注解来为定义的属性/特性生成 getters/setters 方法。若是你不想对该类的全部特性都生成 getters/setters 方法,能够在属性上专门定义这些注解。这两个类会变成容器,里面携带有数据,不管在何处想显示信息均可以使用。
我使用 Mongo Docker 容器来进行这次测试。若是你的系统上已经安装了 MongoDB,则没必要运行 Docker 实例。你也能够登陆其官网,选择系统信息,而后按照安装说明来安装 MongoDB。
安装后,就可使用命令行、GUI(例如 MongoDB Compass)或用于链接数据源的 IDE 驱动程序来与新的 MongoDB 服务器进行交互。到目前为止,能够开始定义数据层了,用来拉取、转换和持久化数据。须要设置数据库访问属性,请导航到程序中的 applications.properties
文件,而后添加以下内容:
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=BikeStore
复制代码
数据访问层(DAL)中的数据访问对象(DAO)定义了与数据库中的数据的交互过程。使人惊叹的就是在使用 spring-boot-starter
后,查询数据库的大部分工做已经完成。
让咱们从 Customer
DAO 开始。在 src
下的新目录 dao
中建立一个接口文件,而后再建立一个名为 CustomerRepository.java
的 Java 类文件,其内容以下示:
package com.stephb.JavaMongo.dao;
import com.stephb.JavaMongo.dto.Customer;
import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
/**
*
* @author stephon
*/
public interface CustomerRepository extends MongoRepository<Customer, String>{
@Override
public List<Customer> findAll();
public List<Customer> findByFirstName(String firstName);
public List<Customer> findByLastName(String lastName);
}
复制代码
这个类是一个接口,扩展或继承于 MongoRepository
类,而 MongoRepository
类依赖于 DTO (Customer.java
)和一个字符串,它们用来实现自定义函数查询功能。由于你已继承自此类,因此你能够访问许多方法函数,这些函数容许持久化和查询对象,而无需实现或引用本身定义的方法函数。例如,在实例化 CustomerRepository
对象后,你就能够直接使用 Save
函数。若是你须要扩展更多的功能,也能够重写这些函数。我建立了一些自定义查询来搜索个人集合,这些集合对象是我自定义的元素。
Bike
对象也有一个存储源负责与数据库交互。与 CustomerRepository
的实现很是相似。其实现以下所示:
package com.stephb.JavaMongo.dao;
import com.stephb.JavaMongo.dto.Bike;
import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
/**
*
* @author stephon
*/
public interface BikeRepository extends MongoRepository<Bike,String>{
public Bike findByModelNumber(String modelNumber);
@Override
public List<Bike> findAll();
public List<Bike> findByColor(String color);
}
复制代码
如今,你已经有了一种结构化数据的方式,能够对数据进行提取、转换和持久化,而后运行这个程序。
找到 Application.java
文件(有可能不是此名称,具体取决于你的应用程序名称,但都会包含有 “application” )。在定义此类的地方,在后面加上 implements CommandLineRunner
。这将容许你实现 run
方法来建立命令行应用程序。重写 CommandLineRunner
接口提供的 run
方法,并包含以下内容用来测试 BikeRepository
:
package com.stephb.JavaMongo;
import com.stephb.JavaMongo.dao.BikeRepository;
import com.stephb.JavaMongo.dao.CustomerRepository;
import com.stephb.JavaMongo.dto.Bike;
import java.util.Scanner;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class JavaMongoApplication implements CommandLineRunner {
@Autowired
private BikeRepository bikeRepo;
private CustomerRepository custRepo;
public static void main(String[] args) {
SpringApplication.run(JavaMongoApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
Scanner scan = new Scanner(System.in);
String response = "";
boolean running = true;
while(running){
System.out.println("What would you like to create? \n C: The Customer \n B: Bike? \n X:Close");
response = scan.nextLine();
if ("B".equals(response.toUpperCase())) {
String[] bikeInformation = new String[3];
System.out.println("Enter the information for the Bike");
System.out.println("Model Number");
bikeInformation[0] = scan.nextLine();
System.out.println("Color");
bikeInformation[1] = scan.nextLine();
System.out.println("Description");
bikeInformation[2] = scan.nextLine();
Bike bike = new Bike();
bike.setModelNumber(bikeInformation[0]);
bike.setColor(bikeInformation[1]);
bike.setDescription(bikeInformation[2]);
bike = bikeRepo.save(bike);
System.out.println(bike.toString());
} else if ("X".equals(response.toUpperCase())) {
System.out.println("Bye");
running = false;
} else {
System.out.println("Sorry nothing else works right now!");
}
}
}
}
复制代码
其中的 @Autowired
注解会自动依赖注入 BikeRepository
和 CustomerRepository
Bean。咱们将使用这些类来从数据库持久化和采集数据。
已经好了。你已经建立了一个命令行应用程序。该应用程序链接到数据库,而且可以以最少的代码执行 CRUD 操做
从诸如对象和类之类的编程语言概念转换为用于在数据库中存储、检索或更改数据的调用对于构建应用程序相当重要。Java 持久化 API(JPA)正是为 Java 开发人员解决这一难题的重要工具。你正在使用 Java 操纵哪些数据库呢?请在评论中分享。
via: opensource.com/article/19/…
做者:Stephon Brown 选题:lujun9972 译者:runningwater 校对:wxy