Java Persistence API:快速入門

各位讀者好! 在我的一些朋友提出無數請求之后,我決定寫一篇關于Java Persistence API的簡短文章。 面向對象的編程范式是當??今最流行和使用最廣泛的模型,它具有無縫建模現實生活實體的能力,因此它勝過大多數其他范式。 但是,在開發諸如學生數據庫或員工數據庫等中型數據導向的應用程序時,人們只是打破了面向對象模型并將數據庫連接直接鏈接到前端GUI。 但這不是一個好的編程習慣。 當我剛開始構建面向數據庫的小型應用程序時,我是一名頑固的OOP迷,有點擔心不使用OOP模型。 良好的編程習慣是擁有一個Solid Object模型并擁有一個數據存儲區來保存數據,然后是一個GUI。 所以模型基本上是這樣的

但是我偶然發現了另一個問題。 如何鏈接對象和數據庫。 對象中的數據與關系數據庫中的數據存儲方式不同。 關系數據庫不支持許多對我們的對象模型至關重要的OOP概念。 因此,我想到了釀造自己的類,以將數據從數據庫傳輸到對象,然后再傳輸回來。 但是我面臨很多困難和絆腳石。 然后休息了! 我遇到了Java Persistence的東西,這些東西使我可以在程序的生命周期之外保留或保存對象的數據。 這意味著,您現在可以將對象存儲到關系數據庫或XML文件等數據存儲中,而無需編寫復雜的代碼來轉換格式和管理CRUD操作。

這篇小文章將向您介紹這個很棒的功能,并且您將可以開始在項目中實現Persistence。 我不想在本文中涉及復雜的主題。 因此,我決定使用ObjectDB數據庫。 使用ObjectDB的優點是,它不需要JPA通常需要的復雜配置和映射文件。 我們將使用流行的Eclipse IDE 。 我將提供一個簡單的示例程序,該程序將存儲和處理Employee詳細信息(名稱和薪水)。 好吧,讓我們開始吧…………!

持久性服務由許多提供程序提供,我們將使用ObjectDB的實現。 因此,請下載其DB和API文件 。 現在讓我們通過一些基礎知識。 然后,我們將看到如何實現這些以創建程序……

一,實體類:

要使用持久性,您需要將其對象存儲在數據庫中的類。 這些類稱為實體類,除了一些額外的注釋外,它們與POJO(普通的舊Java對象)相同。 您需要定義此類中必須保留的字段(保存在db中)。 實體類必須在類上方具有“ @Entity ”注釋。 現在定義該類的所有字段和方法。 瞧,我們為自己準備了實體課! 現在,您可以向實體類添加其他功能。 例如,您可以使用該字段上方的“ @Id ”注釋來指示哪個字段用作主鍵。 您還可以使用“ @GeneratedValue(strategy = GenerationType.AUTO) ”批注使ObjectDB為持久存入數據庫的對象生成主鍵值。 還有更多注釋,功能和構造。 但是我們現在不需要了解它們。 這是我們將用作實體類的類。

package employeeDB;import javax.persistence.*;@Entity
publicclass Employee {@Id String name;Double salary;public Employee(){}public Employee (String name, Double Salary){this.name=name;this.salary=Salary;}publicvoid setSalary(Double Salary){this.salary=Salary;}publicString toString(){return"Name: "+name+"\nSalary: "+salary ;}}

如您所見,我們通過@Entity注釋標識了Entity類。 然后,將員工姓名作為主鍵。 并且您需要在實體類中有一個不帶參數的默認構造函數。

在其他JPA實現中,您可能必須在單獨的XML文件中提供有關實體類的詳細信息。 但是ObjectDB不需要這樣做。

二。 連接到數據庫

在JPA中,數據庫連接由EntityManager接口表示。 為了訪問和使用ObjectDB數據庫,我們需要一個EntityManager實例。 我們可以使用EntityManagerFactory實例獲得EntityManager的實例,該實例是使用EntityManagerFactory類的靜態createEntityManagerFactory方法創建的。 您需要指定數據庫文件的存儲位置,作為createEntityManagerFactory方法的參數。 例:

EntityManagerFactory emf=Persistence.createEntityManagerFactory("empDB.odb");
EntityManager em=emf.createEntityManager();

現在我們有了一個EntityManager,它將我們的應用程序連接到數據庫。 通常,在一個程序中創建幾個EntityManager,但是僅創建一個EntityManagerfactory實例。 大多數JPA實現都需要稱為“持久性單元”的XML映射文件作為創建EntityManagerFactory實例的參數。 但是ObjectDB具有僅接受數據庫位置的規定。 如果數據庫已經存在,它將被打開,否則將為我們創建一個新的數據庫。

可以如下關閉EntityManagerFactory和EntityManager,

em.close();
emf.close();

對于每個類(負責某些數據庫活動)或在多線程應用程序的情況下,每個線程都有一個單獨的EntityManager是一個好習慣。 現在讓我們看看如何使用數據庫進行交易…。

三, 執行交易

為了對數據庫執行任何操作或對數據庫執行任何操作,我們必須首先啟動事務。 只有使用EntityManager啟動事務后,才能執行任何操作。 我們可以使用以下電話開始交易。

em.getTransaction().begin();

現在,我們可以執行各種事務,例如創建新的Record(對象),從數據庫中刪除,更新和檢索數據。 在執行任何CRUD操作之前,我們需要將數據添加到數據庫中。 在JPA中,將對象插入數據庫稱為“持久”對象。 可以使用em.persist(Object)方法執行此操作。 現在,此對象變為“托管”對象,但變為EntityManager(em)。 這意味著對該對象所做的任何更改都將反映在數據庫文件的副本中。 要從數據庫中刪除任何對象,我們可以使用em.remove(Object)方法。 我們可以使用em.find(Class,primaryKeyValue)方法使用對象的主鍵從數據庫中檢索對象。 您需要將Entity類的Class實例和主鍵傳遞給此方法,它將返回一個“ Object”,該對象必須轉換為Entity Class。 最后,執行交易后,我們必須使用結束交易,

em.getTransaction().commit();

只有在提交事務后,對內存中對象的更改才會反映在數據庫文件中的對象上。 以下代碼將持久存儲一個Employee對象,然后搜索一個Employee對象并對其進行修改。

Employee emp1=new Employee ("Gugan",50000);em.getTransaction().begin();//Persist (store) emp1 object into Database
em.persist(emp1);//Search for Gugan
Employee gugan=(Employee) em.find(Employee.class,"Gugan");
gugan.setSalary(100000);em.getTransaction().commit();

我們還可以使用SQL之類的查詢(稱為JPQL)來執行CRUD操作。

JPA中有兩種查詢類型。 普通查詢和TypedQueries。 普通查詢是非類型安全查詢。 (即)查詢不知道將要檢索或使用的對象的類型。 但是TypedQuery是類型安全的查詢。 為了創建類型化查詢,您需要指定將要使用的類的類型,并將類的Class實例作為參數以及查詢字符串傳遞。 TypedQueries是使用數據庫的標準方法,因此我們將僅使用它們。 可以使用以下語法創建它們,

TypedQuery  q=em.createQuery(queryString,EntityClass.class);

如果查詢僅返回一個對象或結果,例如查找條目數(計數),則可以使用q.getSingleResult()方法。 另一方面,如果您的查詢將返回對象的集合,例如從數據庫中檢索雇員列表,則可以使用q.getResultList()方法,它將返回創建時指定類型的List對象。 TypedQuery。 下面的代碼首先將找到那里有多少雇員,然后將從數據庫中檢索所有雇員對象。

em.getTransaction().begin();//find number of Employees
TypedQuery  count=em.createQuery("Select count(emp) from Employee emp",Employee.class);
System.out.println("\n"+count.getSingleResult()+" employee record(s) Available in Database!\n");//Retrieve All Employee Objects in the database
TypedQuery  e=em.createQuery("Select emp from Employee emp", Employee.class);
List  employees=e.getResultList();em.getTransaction().commit();

JPQL與SQL查詢非常相似。 唯一的區別是您使用類名和對象名而不是表名。 JPQL還支持查詢中的參數。 例如。 如果要查找名稱為“ Steve”的Employee,并且僅在運行時知道名稱“ Steve”,則可以使用以下查詢樣式。

String name=scannerObj.nextLine();
TypedQuery<employee> query = em.createQuery("SELECT e FROM Employee e WHERE e.name = :name", Employee.class);
query.setParameter("name", name);
Employee emp=query.getSingleResult();

這用給定的“ name”變量替換“:name”參數。 除了這些查詢外,還有許多其他查詢。 有關JPQL的完整教程,您可以閱讀有關JPQL的ObjectDB手冊 。

IV。 使用Eclipse進行ObjectDB JPA實現

Eclipse是Java AFAIK的最佳IDE。 因此,我建議使用Eclipse開發應用程序。 從此處下載最新的Eclipse Indigo。 如果您已經擁有Eclipse Indigo或更舊的版本,那么它就很好了。 使用文件菜單創建一個新的Java項目。 然后在新的項目對話框中,為您的項目輸入一個項目名稱,然后選擇要在其中存儲項目的目錄,然后選擇下一步。 按下一步后,將為您提供幾個選項,現在在此窗口中選擇庫選項卡。 然后選擇“添加外部罐子”按鈕,這將打開一個新對話框。 現在瀏覽到您提取ObjectDB API文件的位置,然后轉到其中的bin文件夾并選擇“ objectdb.jar”文件。 按打開,將添加庫。 現在按完成以創建您的項目。

現在我們已經創建了項目,我們需要向其添加類。 現在,在Eclipse IDE窗口左側的Project Explorer窗格中,右鍵單擊您的項目名稱,然后選擇New-> Class。 現在將打開“新類”對話框。 在其中,輸入要創建的類名稱,然后也輸入包名稱。 所有其他選項都不必干預……! 在示例程序中,我們將使用兩個類。 一個用于雇員實體,另一個用于容納應用程序的主要方法和關鍵功能。 確保兩個類都在同一個程序包中。 要查看創建的類,請在“項目資源管理器”窗格中展開您的“項目”,然后從節點列表中展開src,然后您將在其中看到您的包。 展開它,您將看到這些類。

五,范例程序

既然您已經掌握了JPA的基本概念,那么我將介紹一個示例控制臺應用程序,該應用程序將從數據庫中存儲,修改和刪除員工。如果您已閱讀上述內容,則可以輕松地遵循以下程序。 我在需要使程序更清晰的地方提供了注釋。

使用上一節中告訴您的方法創建一個名為Employee的類,并使用employeeDB作為包名,并粘貼本教程第一節中給出的Employee Entity類的代碼。

現在,在同一軟件包employeeDB下創建另一個名為Main的類,并將以下代碼放入其中。

package employeeDB;import javax.persistence.*;
import java.util.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {/*** Displays all Employees in the Database*/private static void displayAll(){em.getTransaction().begin();TypedQuery  e=em.createQuery(displayAllQuery, Employee.class);List <Employee> employees=e.getResultList();if(employees.size()>0){for(Employee temp:employees){System.out.println(temp);System.out.println();}System.out.println(employees.size()+" Employee Records Available...!");}elseSystem.out.println("Database is Empty!");em.getTransaction().commit();}/*** Insets an Employee into the Database.*/private static void insert(){System.out.print("Enter the number of Employees to be inserted: ");n=input.nextInt();em.getTransaction().begin();for(int i=0;i<n;i++){ System.out.println("Enter the details of Employee "+(i+1)+": ");System.out.print("Name: ");//I use BufferedReader to read String and hence I need to // Catch the IOException that it may throwtry{name=bufferedReader.readLine();}catch (IOException e){e.printStackTrace();}System.out.print("Salary: ");Salary=input.nextDouble();Employee emp=new Employee(name,Salary);em.persist(emp);                                //Store emp into Database}em.getTransaction().commit();System.out.println("\n"+n+" employee record(s) Created!\n");TypedQuery  count=em.createQuery(countQuery,Employee.class);System.out.println("\n"+count.getSingleResult()+" employee record(s) Available in Database!\n");}/*** Deletes the specified Employee from the database*@param name*/private static void delete(String name){em.getTransaction().begin();Employee e=(Employee) em.find(Employee.class, name);         //Find Object to be deletedem.remove(e);                                                //Delete the Employee from databaseSystem.out.printf("Employee %s removed from Database....",e.name);em.getTransaction().commit();//Display Number of Employees leftTypedQuery  count=em.createQuery(countQuery,Employee.class);System.out.println("\n"+count.getSingleResult()+" employee record(s) Available in Database!\n");}/*** Changes salary of the specified employee to passed salary*@param name*@param Salary*/private static void modify(String name,Double Salary){em.getTransaction().begin();Employee e=(Employee) em.find(Employee.class, name);  //Find Employee to be modifiede.setSalary(Salary);                                  //Modify the salaryem.getTransaction().commit();System.out.println("Modification Successful!\n");}public static void main(String arg[]){System.out.println("Welcome to the Employee Database System!\n\n");do{    System.out.print("Menu: \n 1. View DB\n2. Insert \n3. Delete \n4. Modify\n5. Exit\nEnter Choice...");int ch=input.nextInt();try{switch(ch){case 1:displayAll();break;case 2:insert();break;case 3:System.out.print("Name of Employee to be Deleted2: ");name=bufferedReader.readLine();delete(name);break;case 4:System.out.print("Name of Employee to be Modified: ");name=bufferedReader.readLine();System.out.print("New Salary: ");Salary=input.nextDouble();modify(name,Salary);break;case 5:if(em!=null) em.close();        //Close EntityManagerif(emf!=null) emf.close();        //Close EntityManagerFactoryexit=true;break;}}catch (IOException e){e.printStackTrace();}}while(!exit);}static EntityManagerFactory emf=Persistence.createEntityManagerFactory("empDB.odb");static EntityManager em=emf.createEntityManager();static Scanner input=new Scanner(System.in);static BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));static int n;static String name;static Double Salary;static boolean exit=false;//Query Repositorystatic String countQuery="Select count(emp) from Employee emp";static String displayAllQuery="Select emp from Employee emp";}

現在保存您的項目,然后按運行按鈕或按Ctrl + F11。 現在該程序應該運行了,您可以在底部窗格的“控制臺”部分中看到輸出。 這只是一個控制臺應用程序。 我鼓勵您為此開發一個GUI!

VI。 ObjectDB資源管理器工具

在結束之前,我想向您介紹ObjectDB提供的一個非常有用的工具。 它稱為ObjectDB Explorer,可用于查看數據庫文件包含的內容。 (即)您可以瀏覽數據庫而無需編寫代碼來訪問它。 這對于了解您的應用程序和進行調試非常有用。 您可以在Object DB的bin目錄(您在其中提取ObjectDB文件)中找到資源管理器。 運行explorer.exe。 現在,您可以使用File-> Open Local選項打開數據庫。 當您訪問服務器中存儲的數據庫時,將完成“打開遠程”。 現在瀏覽并選擇數據庫并打開它。 現在,雙擊左側“持久性支持的類”窗格中顯示的數據庫。 現在,對象瀏覽器將顯示您的數據庫。 您可以展開數據庫中的每個對象以查看其內容。 相當整潔吧?

以下是插入后我的數據庫的樣子……

該資源管理器還提供了許多其他選項。 隨意探索它們!

我想您會對JPA有一個生動的想法。 我已經解釋了使用ObjectDB實現的JPA的基本知識。 為了了解更多信息并增加知識,您可以參考ObjectDB手冊 ,該手冊提供了有關帶有ObjectDB的JPA的詳盡詳盡的文本。 這是Java真正有用的功能,將對您有很大幫助。 對我有很大幫助! 因此,嘗試更多地了解它。

您可以從此處下載源代碼

參考: Java持久性API:一個快速的介紹......從我們JCG伙伴史蒂夫·羅賓遜在襤褸“N”科技博客。

相關文章:
  • GWT 2 Spring 3 JPA 2 Hibernate 3.5教程
  • JBoss 4.2.x Spring 3 JPA Hibernate教程
  • DataNucleus 3.0與Hibernate 3.5
  • Spring和AspectJ的領域驅動設計
  • 提升您的休眠引擎
  • 依賴注入–手動方式

翻譯自: https://www.javacodegeeks.com/2011/08/java-persistence-api-quick-intro.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374705.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374705.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374705.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

線性回歸、梯度下降(Linear Regression、Gradient Descent)

轉載請注明出自BYRans博客&#xff1a;http://www.cnblogs.com/BYRans/ 實例 首先舉個例子&#xff0c;假設我們有一個二手房交易記錄的數據集&#xff0c;已知房屋面積、臥室數量和房屋的交易價格&#xff0c;如下表&#xff1a; 假如有一個房子要賣&#xff0c;我們希望通過上…

力扣35. 搜索插入位置

給定一個排序數組和一個目標值&#xff0c;在數組中找到目標值&#xff0c;并返回其索引。如果目標值不存在于數組中&#xff0c;返回它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的算法。 二分搜索法 class Solution {public int searchInsert(int[] nums…

@Resource和@Autowired作用和區別

區別&#xff1a; 1&#xff0c;Resource&#xff08;JSR-250標準注解&#xff0c;推薦使用它來代替Spring專有的Autowired注解&#xff09; 2&#xff0c;Spring 不但支持自己定義的Autowired注解&#xff0c;還支持幾個由JSR-250規范定義的注解&#xff0c;它們分別是Resourc…

使用Oracle WebLogic對應用程序外部的EJB的引用

在之前的文章中&#xff0c;我們對EJB v。3.0及其為您提供的用于構建Java EE應用程序的可移植機制進行了概述。 由于Java EE規范都是關于可移植性的&#xff0c;因此冒著重復自己的風險&#xff0c;我們經常強調EJB v。3.0規范上仍然存在最重要的可移植性限制&#xff1a;沒有在…

基于verilog的分頻器設計(奇偶分頻原理及其電路實現:上)

在一個數字系統中往往需要多種頻率的時鐘脈沖作為驅動源&#xff0c;這樣就需要對FPGA的系統時鐘&#xff08;頻率太高&#xff09;進行分頻。分頻器主要分為奇數分頻&#xff0c;偶數分頻&#xff0c;半整數分頻和小數分頻&#xff0c;在對時鐘要求不是很嚴格的FPGA系統中&…

Java判斷布爾類型是否相等

public class Solution{public static void main(String args[]){boolean x1 true;boolean x2 false;boolean x3 true;if(x1!x2){System.out.println("布爾類型變量判斷是否相等可以用!");}if(x1x3){System.out.println("布爾類型變量判斷是否相等可以用&quo…

mysql 中文亂碼解決方法

最近在.NET 項目中用EF連接mysql&#xff0c;插入中文數據時老是顯示亂碼&#xff0c;在創建表時都已將編碼指定了&#xff0c;但是還是出現亂碼&#xff0c;折騰了一陣子才發現在連接字符串里面也要加上指定編碼 Character Setutf8(serverXXXXX;user idXXXX;passwordXXXXX;Cha…

提升您的休眠引擎

是否想知道如何調整基于Hibernate的應用程序以獲得無縫的可伸縮性和最佳性能&#xff1f; 本文探討了基于Hibernate的應用程序的調整技術&#xff0c;重點是有效但文獻記載不足的調整主題&#xff0c;例如繼承映射&#xff0c;二級緩存和增強的序列標識符生成器。 它還提供了一…

力扣53. 最大子序和

給定一個整數數組 nums &#xff0c;找到一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 思路&#xff1a;每個循環中&#xff0c;sum表示以nums[i]結尾的最大子序和&#xff0c;res表示目前得到的最大子序和。當循環結…

Swift中的延遲加載(懶加載)

Swift方式的延遲加載 而在Swift中&#xff0c;你只需一行代碼即可實現此機制&#xff1a; lazy var players String[]() 簡單、簡潔&#xff0c;直入主題。 但你得記住&#xff0c;你必須使用var關鍵字來定義延遲加載的屬性&#xff0c;不能使用let關鍵字&#xff0c;因為常量…

Spring,Quartz和JavaMail集成教程

Quartz是一個作業調度框架&#xff0c;用于調度要在指定的時間表上執行的作業。JavaMail是一個用于從Java應用程序發送/接收電子郵件的API。 Spring具有集成點&#xff0c;可以集成Quartz和JavaMail&#xff0c;從而使這些API易于使用。 讓我們創建一個小型演示應用程序&#x…

Java_Web三大框架之Hibernate操作數據庫(三)

使用Hibernate操作數據庫需要七個步驟&#xff1a;&#xff08;1&#xff09;讀取并解析配置文件Configuration conf newConfiguration().configure(); &#xff08;2&#xff09;讀取并解析映射信息&#xff0c;創建SessionFactorySessionFactory sf conf.buildSessionFacto…

android布局1

第二類&#xff1a;屬性值必須為id的引用名“id/id-name” 僅RelativeLayout中有效 android:layout_below 在某元素的下方 android:layout_above 在某元素的的上方 android:layout_toLeftOf 在某元素的左邊 android:layout_toRightOf 在某元素的右…

Spring MVC開發–快速教程

這是我們的JCG合作伙伴之一&#xff0c;來自Manoj的有關使用Spring開發Web應用程序的簡短教程&#xff0c; 網址為“ The Khangaonkar Report ”。 &#xff08;注意&#xff1a;對原始帖子進行了少量編輯以提高可讀性&#xff09; Spring MVC使用基于模型視圖控制器體系結構&…

spring mvc controller間跳轉 重定向 傳參

url&#xff1a;http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ 1. 需求背景 需求&#xff1a;spring MVC框架controller間跳轉&#xff0c;需重定向。有幾種情況&#xff1a;不帶參數跳轉&#xff0c;帶參數拼接url形式跳轉&#xff0c;帶參數不拼接參…

尋找數組的中心索引

給你一個整數數組 nums &#xff0c;請計算數組的 中心下標 。 數組 中心下標 是數組的一個下標&#xff0c;其左側所有元素相加的和等于右側所有元素相加的和。 如果中心下標位于數組最左端&#xff0c;那么左側數之和視為 0 &#xff0c;因為在下標的左側不存在元素。這一點…

STL sector 應用

1 #include <iostream>2 #include <string>3 #include <vector>4 #include <cstdio>5 using namespace std;6 int n;7 vector<int> pile[30];8 9 //找到a所在pile和height&#xff0c;以應用的形式返回調用者&#xff0c; 10 void find_block(in…

將Jersey與Spring整合

Spring提供了很多好處&#xff0c;并通過其依賴項注入機制&#xff0c;應用程序生命周期管理和Hibernate支持&#xff08;僅舉幾例&#xff09;促進了最佳實踐。 另外&#xff0c;當您想擁有干凈的類似于REST的服務器端JSON Api時&#xff0c;我發現Jersey非常方便。 本文簡要介…

JAVAWEB 生成excel文字在一格顯示兩位不變成#號

在用java生成excel的時候會發現這種問題&#xff0c; 如果是人家給的模板還好&#xff0c;如果不是模板&#xff0c;而是通過代碼生成的話&#xff0c; 就需要進行處理了&#xff0c; 一個小單元格&#xff0c;如果是一位的話&#xff0c;如1-9顯示沒有問題&#xff0c;一旦是兩…

力扣面試題 01.07. 旋轉矩陣

給你一幅由 N N 矩陣表示的圖像&#xff0c;其中每個像素的大小為 4 字節。請你設計一種算法&#xff0c;將圖像旋轉 90 度。 不占用額外內存空間能否做到&#xff1f; 代碼一 思路&#xff1a;對于矩陣中第 ii 行的第 jj 個元素&#xff0c;在旋轉后&#xff0c;它出現在倒數…