MyEclipse數(shù)據(jù)庫教程:使用Java項(xiàng)目查看JPA工作方式
1、建立一個項(xiàng)目
一般情況,JPA Facet將被添加到Java或Web項(xiàng)目中。在本教程中,您將使用一個簡單的Java項(xiàng)目來查看JPA的工作方式。
注意:您可以下載本教程中開發(fā)的項(xiàng)目,然后導(dǎo)入到您的工作區(qū)中。
單擊下拉箭頭,然后選擇Java Project。
在“Project Name”字段中輸入SampleJPAProject,選擇默認(rèn)選項(xiàng),然后單擊“完成”。
單擊,選擇MyEclipse Database Explorer打開透視圖。
在數(shù)據(jù)庫瀏覽器中,選擇MyEclipse Derby連接,然后單擊。
注意:在建立數(shù)據(jù)庫連接之前,無法添加JPA Facet,因?yàn)樾枰x擇要使用的連接。
切換回MyEclipse Java Enterprise透視圖,右鍵單擊項(xiàng)目,然后選擇MyEclipse > Project Facets > Install JPA Facet。
在目標(biāo)運(yùn)行時下拉列表中選擇MyEclipse通用Java運(yùn)行時,然后單擊下一步。
從平臺下拉列表中選擇一個平臺,如果JPA實(shí)現(xiàn)類型默認(rèn)為用戶庫,則選擇與所選平臺相對應(yīng)的庫。如果未列出任何庫,可單擊下載適當(dāng)?shù)膸臁?/p>
在“Connection”字段中選擇MyEclipse Derby,選中“Add driver library to build path”和“Override default schema”復(fù)選框,然后從“Schema”下拉列表中選擇CLASSICCARS。單擊完成。
現(xiàn)在,項(xiàng)目中已添加了完全配置的JPA Facet,其中包括JPA配置信息/DB連接信息以及添加到項(xiàng)目構(gòu)建路徑中的所有必需的JDBC和JPA庫。如果這是一個Web項(xiàng)目,則在將項(xiàng)目部署到應(yīng)用程序服務(wù)器上并在其中運(yùn)行時,所有構(gòu)建路徑的附加內(nèi)容都將準(zhǔn)備好進(jìn)行部署。
2、創(chuàng)建一個Java包
在下一個步驟中,對數(shù)據(jù)庫表中的數(shù)據(jù)進(jìn)行反向工程,并為項(xiàng)目生成實(shí)體。在進(jìn)行逆向工程之前,需要創(chuàng)建一個Java包,并在其中放置這些實(shí)體。
展開項(xiàng)目,右鍵單擊src文件夾,然后選擇New > Package。
在“Name”字段中輸入com.myeclipseide.jpa,然后單擊“完成”。
3、逆向工程數(shù)據(jù)庫表
現(xiàn)在已經(jīng)建立了項(xiàng)目,可以將PRODUCTLINE表反向工程到項(xiàng)目中,并開始使用所生成的實(shí)體。
右鍵單擊該項(xiàng)目,然后選擇JPA Tools > Generate Entities & DAOs。
注意:您可以選擇使用MyEclipse逆向工程工具或DALI實(shí)體生成器。選擇,單擊“確定”,然后完成向?qū)А1窘坛淌褂肕yEclipse逆向工程工具。
選擇PRODUCTLINE表,單擊添加,然后單擊下一步。
在“Java Package”字段中,單擊“ Browse”,然后選擇先前創(chuàng)建的com.myeclipseide.jpa程序包。選中以下復(fù)選框:
Entity Bean Generation:讓MyEclipse生成注釋為用作JPA實(shí)體的普通Java類。
Create abstract class;如果您希望自定義生成的類,而不必每次都覆蓋更改,則MyEclipse可以生成基本抽象類以及您可以自定義和使用的具體子類。每次進(jìn)行反向工程時,MyEclipse只會覆蓋抽象基類,并在具體子類中保留更改。
Update persistence.xml:與Hibernate類似,您可以在JPA配置文件中列出正在使用的所有JPA實(shí)體。
Java Data Access Generation:讓MyEclipse生成DAO實(shí)用程序類,讓您可以立即從數(shù)據(jù)庫中保存/查找/更新/刪除實(shí)體。此代碼包含了JPA實(shí)體管理器,使得使用實(shí)體和數(shù)據(jù)庫變得非常容易。
Generate Precise findBy Methods:讓MyEclipse生成findByXXX方法,其中XXX與反轉(zhuǎn)的實(shí)體上的每個屬性有關(guān)。這樣一來,可以使用任何屬性作為查找實(shí)體的方法,輕松地從數(shù)據(jù)庫訪問實(shí)體。
Generate Java Interfaces:選擇此選項(xiàng)將創(chuàng)建帶有相應(yīng)DAO實(shí)現(xiàn)類的接口類。取消選擇此選項(xiàng)僅生成DAO實(shí)現(xiàn)類,而沒有用于定義接口的單獨(dú)類。
單擊完成。查看通過展開com.myeclipseide.jpa包生成的MyEclipse資源。
生成的實(shí)體描述如下:
EntityManagerHelper:使用直接JPA時,開發(fā)人員需要使用EntityManager class。EntityManager通過提供用于訪問管理器的靜態(tài)方法以及易于調(diào)用的最常用操作,此生成的幫助程序類讓使用EntityManager的過程變得更加容易。
IProductline:定義相應(yīng)DAO實(shí)現(xiàn)類的接口的類。
Productline:此類是表示數(shù)據(jù)庫表PRODUCTLINE的JPA實(shí)體(POJO)。該P(yáng)OJO包含PRODUCTLINE表的字段,并表示數(shù)據(jù)庫中的一行。
ProductlineDAO:此類包含EntityManagerHelper以便為我們提供易于使用的方法,專門用于在數(shù)據(jù)庫中添加/查找/更新和刪除產(chǎn)品。
注意:逆向工程完成后,您可以打開“Persistence”透視圖,使用某些持久性和數(shù)據(jù)源工具來分析數(shù)據(jù)庫和項(xiàng)目中的數(shù)據(jù)。
4、編寫應(yīng)用程序
由于MyEclipse生成了許多代碼,所以您可以快速將精力放在“Business Logic”上,或更具體地說是“實(shí)際完成工作的代碼”。在本部分中,您將編寫一個具有main方法的Java類,該方法將Productline插入數(shù)據(jù)庫,對其進(jìn)行檢索、更新并刪除。使用此代碼,您會發(fā)現(xiàn)在應(yīng)用程序中使用JPA實(shí)體是多么容易!
4.1 創(chuàng)建一個類
右鍵單擊com.myeclipseide.jpa軟件包,然后選擇New Class。
在“Name”字段中鍵入RunJPA,選中Public static void main復(fù)選框,然后單擊“Finish”。
在構(gòu)建新類和main方法之后,需要編寫代碼來操作Productline實(shí)例。
注意:以下代碼看起來很長而且很復(fù)雜,這是因?yàn)槲覀冊噲D在一個代碼塊中顯示四個不同的示例。如果您查看每個操作(保存、加載、更新、刪除),就會發(fā)現(xiàn)它們都不由幾行代碼組成。
將以下代碼添加到main方法中,然后按CTRL + S保存。
/* 1. Create a reference to our ID */ String productLineID = "Men's Shoes"; /* 2. Create a new Productline instance */ Productline newProductline = new Productline( productLineID, "Shoes for men.", "Men's Shoes", null); /* 3. Create a DAO instance to use */ ProductlineDAO dao = new ProductlineDAO(); /* 4. Store our new product line in the DB */ EntityManagerHelper.beginTransaction(); dao.save(newProductline); EntityManagerHelper.commit(); /* 5. Now retrieve the new product line, using the ID we created */ Productline loadedProductline = dao.findById(productLineID); /* 6. Print out the product line information */ System.out.println("*NEW* Product Line [productLine=" + loadedProductline.getProductline() + ", textDescription=" + loadedProductline.getTextdescription() + ", image=" + loadedProductline.getImage() + "]"); /* * 7. Now let's change same value on the product line, and save the * change */ loadedProductline.setTextdescription("Product line for men's shoes."); EntityManagerHelper.beginTransaction(); dao.save(loadedProductline); EntityManagerHelper.commit(); /* * 8. Now let's load the product line from the DB again, and make sure * it text description changed */ Productline secondLoadedProductline = dao.findById(productLineID); System.out.println("*REVISED* Product Line [" + "productLine=" + secondLoadedProductline.getProductline() + ", textDescription=" + secondLoadedProductline.getTextdescription() + ", image=" + secondLoadedProductline.getImage() + "]"); /* 9. Now let's delete the product line from the DB */ EntityManagerHelper.beginTransaction(); dao.delete(secondLoadedProductline); EntityManagerHelper.commit(); /* * 10. To confirm the deletion, try and load it again and make sure it * fails */ Productline deletedProductline = dao.findById(productLineID); /* * We use a simple inlined IF clause to test for null and print * SUCCESSFUL/FAILED */ System.out.println("Productline deletion: " + (deletedProductline == null ? "SUCCESSFUL" : "FAILED"));
上面的代碼看起來很復(fù)雜,但它做了很多簡單的事情。例如,如果您只對在數(shù)據(jù)庫中存儲新項(xiàng)目感興趣,則只需要程序中第1-3步中的代碼,這相當(dāng)于(減去注釋)三行代碼。以下是每個編號部分的細(xì)分:
PRODUCTLINE表使用產(chǎn)品線的名稱作為主鍵。為了使本教程更容易理解,我們在字符串中定義了產(chǎn)品線名稱,并在代碼中多次運(yùn)用(創(chuàng)建和存儲產(chǎn)品線,然后檢索兩次)。
這將創(chuàng)建由MyEclipse生成的Productline POJO的新實(shí)例,并將其插入數(shù)據(jù)庫中。對于本教程而言,這些值并不重要,所以我們只使用示例信息。
這將創(chuàng)建要使用的DAO實(shí)例。數(shù)據(jù)庫訪問需要DAO(這也是由MyEclipse生成的)。
這讓DAO將新的產(chǎn)品系列存儲在數(shù)據(jù)庫中。因?yàn)橐驍?shù)據(jù)庫中寫入一些內(nèi)容,所以將save調(diào)用包含在事務(wù)中。
為了確保使用第1步中定義的ID正確存儲了產(chǎn)品系列,我們要求DAO獲取產(chǎn)品系列,并將結(jié)果分配給一個全新的對象,以完全確保從數(shù)據(jù)庫中加載了什么。(我們可以將值分配回newProductline,但是出于本教程的目的,我們必須清楚地知道對象來源,并且加載的實(shí)例之前在代碼中不存在)。
這將從已加載的實(shí)體中打印出值,以確保它只是存儲在數(shù)據(jù)庫中的值。
這將更改剛剛加載的POJO的值,以顯示更新記錄的工作方式。然后,使用DAO將更改提交回?cái)?shù)據(jù)庫。同樣的,此操作被包含在事務(wù)中,以確保安全地更改數(shù)據(jù)庫。
與步驟5一樣,使用在步驟1中定義的ID從數(shù)據(jù)庫中重新加載記錄,以確保更新操作有效。然后打印出POJO值,以確保新描述已保存到數(shù)據(jù)庫中。
這顯示了如何從數(shù)據(jù)庫刪除記錄。同樣的,由于這需要更改數(shù)據(jù)庫,因此該代碼被包含在事務(wù)中。
與第8步和第5步類似,為了證明刪除有效,我們嘗試使用給定的ID從數(shù)據(jù)庫加載實(shí)體。因?yàn)槲覀円呀?jīng)刪除了Productline,所以這個操作應(yīng)該是失敗的。從DAO獲得結(jié)果后,將使用嵌入式IF子句打印一條語句,以確保結(jié)果為null。
4.2運(yùn)行應(yīng)用程序
右鍵單擊項(xiàng)目,然后選擇Run As > Java Application。
選擇RunJPA應(yīng)用程序,然后單擊“確定”。
輸出顯示在Console視圖中。
紅色文本是來自MyEclipse中生成的DAO和EntityHelper類的默認(rèn)日志消息。黑色文本是代碼中用于跟蹤進(jìn)度的System.out.println文本。如您所見,第6步中的第一個打印輸出和第8步中的更新打印輸出都按預(yù)期工作。并且查詢沒有返回Productline,證明刪除也很成功。
5、資源
慧都16周年·技術(shù)服務(wù)月,軟件商城優(yōu)惠券不限量免費(fèi)領(lǐng)取,購MyEclipse享折上折,查看詳情>>>
想進(jìn)一步了解MyEclipse?【MyEclipse官方中文網(wǎng)】知你所需,解你所惑!
想與更多人聊MyEclipse?加入MyEclipse中國(官方2):742336981暢所欲言吧!
想及時獲取MyEclipse資訊?掃描下方二維碼,MyEclips信息跟你走!