使用 Java 持久化 API

Stephon Brown發表於2019-12-27

我們通過為自行車商店構建示例應用程式來學習如何使用 JPA。

對應用開發者來說,Java 持久化 APIJava Persistence 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 的版本更新而更新。

我們會用這組工具為一個虛構自行車商店建立一個簡單的應用程式。會實現對 CustomerBike 物件集合的的插入操作。

釀造完美

導航到 Spring Initializr 頁面。該網站可以生成基於 Spring Boot 和其依賴項的基本專案。選擇以下選項:

  1. 專案: Maven 工程
  2. 語言: Java
  3. Spring Boot: 2.1.8(或最穩定版本)
  4. 專案後設資料: 無論你使用什麼名字,其命名約定都是像 com.stephb 這樣的。
    • 你可以保留 Artifact 名字為 “Demo”。
  5. 依賴項: 新增:
    • Spring Data MongoDB
    • Lombok

點選 下載,然後用你的 IDE(例如 NetBeans) 開啟此新專案。

模型層概要

在專案裡面,模型model代表從資料庫裡取出的資訊的具體物件。我們關注兩個物件:CustomerBike。首先,在 src 目錄建立 dto 目錄;然後,建立兩個名為 Customer.javaBike.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 註解來為定義的屬性properties/特性attributes生成 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

定義資料訪問物件/資料訪問層

資料訪問層data access layer(DAL)中的資料訪問物件data access objects(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 註解會自動依賴注入 BikeRepositoryCustomerRepository Bean。我們將使用這些類來從資料庫持久化和採集資料。

已經好了。你已經建立了一個命令列應用程式。該應用程式連線到資料庫,並且能夠以最少的程式碼執行 CRUD 操作

結論

從諸如物件和類之類的程式語言概念轉換為用於在資料庫中儲存、檢索或更改資料的呼叫對於構建應用程式至關重要。Java 持久化 API(JPA)正是為 Java 開發人員解決這一難題的重要工具。你正在使用 Java 操縱哪些資料庫呢?請在評論中分享。


via: https://opensource.com/article/19/10/using-java-persistence-api

作者:Stephon Brown 選題:lujun9972 譯者:runningwater 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

使用 Java 持久化 API

訂閱“Linux 中國”官方小程式來檢視

相關文章