使用 Java 持久化 API
我們通過為自行車商店構建示例應用程式來學習如何使用 JPA。
對應用開發者來說,Java 持久化 API(JPA)是一項重要的 java 功能,需要透徹理解。它為 Java 開發人員定義瞭如何將物件的方法呼叫轉換為訪問、持久化及管理儲存在 NoSQL 和關係型資料庫中的資料的方案。
本文通過構建自行車借貸服務的教程示例來詳細研究 JPA。此示例會使用 Spring Boot 框架、MongoDB 資料庫(已經不開源)和 Maven 包管理來構建一個大型應用程式,並且構建一個建立、讀取、更新和刪除(CRUD)層。這兒我選擇 NetBeans 11 作為我的 IDE。
此教程僅從開源的角度來介紹 Java 持久化 API 的工作原理,不涉及其作為工具的使用說明。這全是關於編寫應用程式模式的學習,但對於理解具體的軟體實現也很益處。可以從我的 GitHub 倉庫來獲取相關程式碼。
Java: 不僅僅是“豆子”
Java 是一門物件導向的程式語言,自 1996 年釋出第一版 Java 開發工具(JDK)起,已經變化了很多很多。要了解其各種發展及其虛擬機器本身就是一堂歷史課。簡而言之,和 Linux 核心很相似,自發布以來,該語言已經向多個方向分支發展。有對社群免費的標準版本、有針對企業的企業版本及由多家供應商提供的開源替代品。主要版本每六個月釋出一次,其功能往往差異很大,所以確認選用版本前得先做些研究。
總而言之,Java 的歷史很悠久。本教程重點介紹 Java 11 的開源實現 JDK 11。因其是仍然有效的長期支援版本之一。
- Spring Boot 是由 Pivotal 公司開發的大型 Spring 框架的一個模組。Spring 是 Java 開發中一個非常流行的框架。它支援各種框架和配置,也為 WEB 應用程式及安全提供了保障。Spring Boot 為快速構建各種型別的 Java 專案提供了基本的配置。本教程使用 Spring Boot 來快速編寫控制檯應用程式並針對資料庫編寫測試用例。
- Maven 是由 Apache 開發的專案/包管理工具。Maven 通過
POM.xml
檔案來管理包及其依賴項。如果你使用過 NPM 的話,可能會非常熟悉包管理器的功能。此外 Maven 也用來進行專案構建及生成功能報告。 - Lombok 是一個庫,它通過在物件檔案裡面新增註解來自動建立 getters/setters 方法。像 C# 這些語言已經實現了此功能,Lombok 只是把此功能引入 Java 語言而已。
- 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 類物件檔案。其結構如下示:
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: https://opensource.com/article/19/10/using-java-persistence-api
作者:Stephon Brown 選題:lujun9972 譯者:runningwater 校對:wxy
訂閱“Linux 中國”官方小程式來檢視
相關文章
- SpringCloud使用Sentinel,Sentinel持久化,Sentinel使用nacos持久化SpringGCCloud持久化
- Java emoji持久化mysqlJava持久化MySql
- RDD持久化,不使用RDD持久化的問題的工作原理持久化
- Redis資料持久化—RDB持久化與AOF持久化Redis持久化
- Java學習筆記:Redis的持久化Java筆記Redis持久化
- ElasticSearch Java API使用ElasticsearchJavaAPI
- ZooKeeper 使用 Java APIJavaAPI
- EasyExcel Java API 使用ExcelJavaAPI
- redis系列:RDB持久化與AOF持久化Redis持久化
- 【許曉笛】EOS 資料庫與持久化 API —— 架構資料庫持久化API架構
- 【許曉笛】EOS 資料庫與持久化 API —— 實戰資料庫持久化API
- Java Redis系列2 (redis的安裝與使用+redis持久化的實現))JavaRedis持久化
- java api使用ElastichSearch指南JavaAPIAST
- 使用 Java API 操作 elasticsearchJavaAPIElasticsearch
- redisaof持久化Redis持久化
- redis持久化Redis持久化
- Docker 持久化Docker持久化
- Redis 持久化Redis持久化
- [Redis]持久化Redis持久化
- Redis - 持久化Redis持久化
- MVVM的資料持久化(二)——ROOM的使用MVVM持久化OOM
- 歡迎使用開源持久化框架 MyBatis Enhance持久化框架MyBatis
- Debian使用iptables-persistent持久化iptables規則持久化
- Redis在.net中的使用(5)Redis持久化Redis持久化
- 容器雲對接持久化儲存並使用持久化
- Redis:持久化篇Redis持久化
- redis-持久化Redis持久化
- redis 之 持久化Redis持久化
- 可持久化trie持久化
- Redis 七 持久化Redis持久化
- Redis 持久化方案Redis持久化
- redis ——AOF持久化Redis持久化
- redis 持久化策略Redis持久化
- Redis的持久化Redis持久化
- Redis 持久化(Persistence)Redis持久化
- Redis 的持久化Redis持久化
- Java資料持久層Java
- 使用Spring Data JPA實現持久化層的簡化開發Spring持久化