咱們經過爲自行車商店構建示例應用程序來學習如何使用 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