使用 Java 持久化 API

咱們經過爲自行車商店構建示例應用程序來學習如何使用 JPA。java

對應用開發者來講,Java 持久化 APIJava Persistence API(JPA)是一項重要的 java 功能,須要透徹理解。它爲 Java 開發人員定義瞭如何將對象的方法調用轉換爲訪問、持久化及管理存儲在 NoSQL 和關係型數據庫中的數據的方案。linux

本文經過構建自行車借貸服務的教程示例來詳細研究 JPA。此示例會使用 Spring Boot 框架、MongoDB 數據庫(已經不開源)和 Maven 包管理來構建一個大型應用程序,而且構建一個建立、讀取、更新和刪除(CRUD)層。這兒我選擇 NetBeans 11 做爲個人 IDE。git

此教程僅從開源的角度來介紹 Java 持久化 API 的工做原理,不涉及其做爲工具的使用說明。這全是關於編寫應用程序模式的學習,但對於理解具體的軟件實現也很益處。能夠從個人 GitHub 倉庫來獲取相關代碼。github

Java: 不只僅是「豆子」

Java 是一門面向對象的編程語言,自 1996 年發佈初版 Java 開發工具(JDK)起,已經變化了不少不少。要了解其各類發展及其虛擬機自己就是一堂歷史課。簡而言之,和 Linux 內核很類似,自發布以來,該語言已經向多個方向分支發展。有對社區免費的標準版本、有針對企業的企業版本及由多家供應商提供的開源替代品。主要版本每六個月發佈一次,其功能每每差別很大,因此確認選用版本前得先作些研究。spring

總而言之,Java 的歷史很悠久。本教程重點介紹 Java 11 的開源實現 JDK 11。因其是仍然有效的長期支持版本之一。mongodb

  • 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 對象集合的的插入操做。docker

釀造完美

導航到 Spring Initializr 頁面。該網站能夠生成基於 Spring Boot 和其依賴項的基本項目。選擇如下選項:數據庫

  1. 項目: Maven 工程
  2. 語言: Java
  3. Spring Boot: 2.1.8(或最穩定版本)
  4. 項目元數據: 不管你使用什麼名字,其命名約定都是像 com.stephb 這樣的。
* 你能夠保留 Artifact 名字爲 「Demo」。
複製代碼
  1. 依賴項: 添加:
* Spring Data MongoDB
* Lombok
複製代碼

點擊 下載,而後用你的 IDE(例如 NetBeans) 打開此新項目。編程

模型層概要

在項目裏面,模型model表明從數據庫裏取出的信息的具體對象。咱們關注兩個對象:CustomerBike。首先,在 src 目錄建立 dto 目錄;而後,建立兩個名爲 Customer.javaBike.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 註解來爲定義的屬性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: opensource.com/article/19/…

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

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

相關文章
相關標籤/搜索