MyEclipse數(shù)據(jù)庫(kù)教程:使用Hibernate和Spring執(zhí)行數(shù)據(jù)庫(kù)操作(一)
在本教程中,您將學(xué)習(xí)如何:
連接到數(shù)據(jù)庫(kù)
將Hibernate和Spring添加到項(xiàng)目中
通過(guò)對(duì)數(shù)據(jù)庫(kù)表進(jìn)行逆向工程來(lái)生成實(shí)體
創(chuàng)建Spring Beans作為持久層和數(shù)據(jù)源
啟用Hibernate 3.x注釋支持
下載MyEclipse 購(gòu)買(mǎi)MyEclipse
1、設(shè)置樣本數(shù)據(jù)庫(kù)
本教程中的示例使用了一個(gè)帶有用戶表和數(shù)據(jù)的MySQL 5實(shí)例,用到了以下文件準(zhǔn)備樣本數(shù)據(jù)。在開(kāi)始本教程之前,您必須建立一個(gè)數(shù)據(jù)庫(kù)。
2、連接到數(shù)據(jù)庫(kù)
單擊打開(kāi)Database Explorer圖標(biāo) ,選擇MyEclipse數(shù)據(jù)庫(kù)瀏覽器。
在數(shù)據(jù)庫(kù)瀏覽器中,單擊,然后選擇新建。
從“Driver Template”下拉菜單中選擇“MySQL Connector/J”,在“Driver name field”字段中鍵入MySQL Connector/J,將
單擊添加JAR。導(dǎo)航到MySQL Connector/J JAR文件的位置,然后選擇文件?!癉river classname field”將自動(dòng)填充,然后點(diǎn)擊Finish。
在DB Explorer中選擇MySQL Connector/J,然后單擊 打開(kāi)鏈接。
3、創(chuàng)建一個(gè)啟用了Hibernate的項(xiàng)目
您可以為任何受支持的基礎(chǔ)項(xiàng)目(通常是Java或Web)啟用Hibernate和Spring。
選擇File>New>Project,展開(kāi)Java,選擇Java項(xiàng)目,然后單擊下一步。
在“Project name”字段中輸入HibernateSpringProject,然后單擊“完成”。系統(tǒng)將提示您切換到Java透視圖。選擇“Yes”。
右鍵單擊該項(xiàng)目,選擇 Configure Facets > Install Hibernate Facet。注意,這里需要選擇4.1作為Hibernate規(guī)范版本。
點(diǎn)擊下一步。MyEclipse將創(chuàng)建一個(gè)新的hibernate.cfg.xml文件。
單擊Java package字段旁邊的New為session factory class創(chuàng)建一個(gè)新的軟件包,并命名為com.myeclipse.hibernatespring,然后單擊“完成”。
單擊下一步,從數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序下拉列表中選擇MySQL Connector/J,輸入密碼,然后單擊完成。
現(xiàn)在,該項(xiàng)目包含所有Hibernate和JDBC庫(kù),并且hibernate.cfg.xml文件在“Configuration”編輯器中打開(kāi)。配置文件包含來(lái)自連接配置文件的連接信息。當(dāng)您對(duì)數(shù)據(jù)庫(kù)表進(jìn)行反向工程時(shí),實(shí)體將出現(xiàn)在配置文件的Mappings部分。
4、將Spring Facet添加到項(xiàng)目中
對(duì)于小型應(yīng)用程序來(lái)說(shuō),Spring并不太適用,但是當(dāng)您看到使用Spring通過(guò)簡(jiǎn)單地調(diào)整bean配置文件中的引用來(lái)交換代碼庫(kù)的整個(gè)部分有多么容易時(shí),您就會(huì)意識(shí)到該工具的功能真的很強(qiáng)大。最明顯的是,使用Spring來(lái)測(cè)試將會(huì)簡(jiǎn)單很多。例如,您可以交換一個(gè)持久性實(shí)現(xiàn),該實(shí)現(xiàn)將其所有調(diào)用都發(fā)送給嵌入式DBMS,或者記錄其所有活動(dòng)。然后,當(dāng)應(yīng)用程序部署到生產(chǎn)環(huán)境中時(shí),將持久性實(shí)現(xiàn)切換回使用主DBMS的代碼,這些代碼不使用日志記錄就能提高性能。
右鍵單擊該項(xiàng)目,然后選擇 Configure Facets > Install Spring Facet
接受默認(rèn)的Spring版本和目標(biāo)運(yùn)行時(shí),然后單擊Next。
MyEclipse將創(chuàng)建一個(gè)新的applicationContext.xml文件。點(diǎn)擊完成。
現(xiàn)在,這個(gè)項(xiàng)目就同時(shí)具有Hibernate和Spring功能。
5、逆向工程數(shù)據(jù)庫(kù)表
對(duì)數(shù)據(jù)庫(kù)表進(jìn)行反向工程時(shí),會(huì)在項(xiàng)目中生成Hibernate(Java)對(duì)象。由于該項(xiàng)目是Hibernate-Spring項(xiàng)目,所以MyEclipse在逆向工程期間提供的不僅僅是普通DAO,而是Spring DAO選項(xiàng)。這就意味著系統(tǒng)將自動(dòng)創(chuàng)建DAO Spring bean,這些bean的sessionFactory屬性已經(jīng)正確配置為對(duì)Hibernate SessionFactory的現(xiàn)有Spring引用。接下來(lái),我們將通過(guò)幾個(gè)步驟使用簡(jiǎn)單的逆向工程形式,讓向?qū)Й@取所有默認(rèn)值。但是,為了實(shí)現(xiàn)最大程度的控制,您可以使用“Nxt”按鈕,通過(guò)向?qū)б徊揭徊降貫g覽詳細(xì)信息,比如主鍵生成策略、對(duì)象名稱(chēng)、類(lèi)型等。
切換回?cái)?shù)據(jù)庫(kù)瀏覽器透視圖。
在數(shù)據(jù)庫(kù)瀏覽器中,將MySQL Connector/J擴(kuò)展到用戶表。
右鍵單擊用戶表,然后選擇“Hibernate Reverse Engineering”。
單擊Java src文件夾旁邊的瀏覽,展開(kāi) HibernateSpringProject > src,選擇com.myeclipse.hibernatespring,然后單擊確定。
選擇 Create POJO <> DB 表映射信息復(fù)選框,選擇Java數(shù)據(jù)對(duì)象復(fù)選框,再選擇Java數(shù)據(jù)訪問(wèn)對(duì)象(DAO)復(fù)選框,然后單擊完成。您將收到系統(tǒng)關(guān)于切換到Hibernate透視圖的提示,只需要單擊“Yes”即可。
將Hibernate類(lèi)生成到Java包中,并創(chuàng)建Spring Bean。
6、編寫(xiě) Hibernate-Spring 代碼
設(shè)置好項(xiàng)目后,就可以開(kāi)始編寫(xiě)代碼了。本過(guò)程需要兩段代碼:
業(yè)務(wù)邏輯:表示應(yīng)用程序代碼的主要方法。
持久層:這是業(yè)務(wù)邏輯應(yīng)用于數(shù)據(jù)庫(kù)功能的應(yīng)用程序的抽象部分。如果使用的所有業(yè)務(wù)邏輯都是持久性層,那么您可以在這一層后面隱藏它工作的一些細(xì)節(jié)。本例使用Spring將執(zhí)行數(shù)據(jù)庫(kù)操作所需的必要DAO引用填充到持久層,這樣做的好處是業(yè)務(wù)邏輯不需要了解任何相關(guān)信息。
將每個(gè)名為BusinessLogic.java和PersistenceLayer.java的類(lèi)添加到com.myeclipse.hibernatespring包。從持久性層開(kāi)始,因?yàn)樗挥趧倓偵傻乃写a和在業(yè)務(wù)邏輯層中編寫(xiě)的代碼之間。它是持久化技術(shù)(Hibernate)和由Spring管理的業(yè)務(wù)邏輯(main方法)之間的抽象。將以下代碼添加到PersistenceLayer類(lèi),這個(gè)類(lèi)的目的是獲得一個(gè)由Spring注入的UserDAO實(shí)例,然后使用該引用來(lái)實(shí)現(xiàn)save/find/update和delete操作(不需要調(diào)用代碼的)。這使您不用完全更改應(yīng)用程序的代碼就能輕松、快速地修改應(yīng)用程序中的持久性代碼。更具體地說(shuō),如果您想更改PersistenceLayer的實(shí)現(xiàn)方式,比如說(shuō)要更好地管理異常、事務(wù)或其他任何事情,可以通過(guò)編輯此類(lèi)來(lái)完成。只要所有方法標(biāo)簽保持不變,就不需要重構(gòu)整個(gè)應(yīng)用程序。
package com.myeclipse.hibernatespring; public class PersistenceLayer { private UserDAO userDAO; public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } public void addUser(User user) { userDAO.save(user); } public User findUserById(Integer id) { return userDAO.findById(id); } public void updateUser(User user) { userDAO.merge(user); } public void deleteUser(User user) { userDAO.delete(user); } }
另外,由于此抽象層與應(yīng)用程序代碼中的持久性代碼是松散地耦合的,可以輕松的使用Spring注入一個(gè)測(cè)試UserDAO實(shí)現(xiàn)。例如,該實(shí)現(xiàn)模擬數(shù)據(jù)庫(kù)操作,但實(shí)際上并不執(zhí)行這些操作?,F(xiàn)在您已經(jīng)實(shí)現(xiàn)了PersistenceLayer,接下來(lái)將以下業(yè)務(wù)邏輯(或主要方法實(shí)現(xiàn))代碼添加到BusinessLogic類(lèi)。業(yè)務(wù)邏輯(主要方法)利用抽象的持久層來(lái)添加/查找/更新以及從數(shù)據(jù)庫(kù)中刪除用戶。
package com.myeclipse.hibernatespring; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class BusinessLogic { public static void main(String[] args) { /* 1. Create a new user */ Integer id = new Integer(1); User user = new User(); user.setId(id); user.setUsername("jdoe"); user.setPassword("1234"); user.setFirstName("John"); user.setLastName("Doe"); user.setDateCreated(Long.valueOf(System.currentTimeMillis())); /* 2. Load the Spring bean configuration and create a bean factory */ ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); /* 3. Create instance of PersistenceLayer */ PersistenceLayer persistenceLayer = (PersistenceLayer) ctx.getBean("persistenceLayer"); /* 4. Save the new user to the database */ persistenceLayer.addUser(user); /* 5. Confirm that our user was saved */ User userLoadedFromDB = persistenceLayer.findUserById(id); System.out.println("User Loaded from DB [username=" + userLoadedFromDB.getUsername() + ", password=" + userLoadedFromDB.getPassword() + ", firstName=" + userLoadedFromDB.getFirstName() + ", lastName=" + userLoadedFromDB.getLastName() + "]"); /* 6. Update the user */ userLoadedFromDB.setFirstName("Johnathan"); persistenceLayer.updateUser(userLoadedFromDB); /* 7. Confirm that the update worked */ User userLoadedFromDBAgain = persistenceLayer .findUserById(id); System.out.println("User Loaded from DB Again [firstName=" + userLoadedFromDBAgain.getFirstName() + "]"); /* 8. Delete the user */ persistenceLayer.deleteUser(user); } }
這個(gè)代碼具有以下功能:
創(chuàng)建一個(gè)新用戶來(lái)插入數(shù)據(jù)庫(kù)。它使用MyEclipse在從數(shù)據(jù)庫(kù)逆向工程用戶表時(shí)生成的用戶POJO。
創(chuàng)建一個(gè)bean工廠。它的作用是讀入Spring bean配置文件,然后向“工廠”提供一個(gè)實(shí)例,該“工廠”可用于根據(jù)該文件中的規(guī)范獲取bean的實(shí)例。這是Spring的“入口點(diǎn)”。
創(chuàng)建PersistenceLayer實(shí)例,這樣就可以執(zhí)行數(shù)據(jù)庫(kù)操作了!注意,為了正確填充UserDAO引用,您必須使用bean工廠來(lái)獲取實(shí)例。
使用創(chuàng)建的PersistenceLayer實(shí)例將新用戶保存到數(shù)據(jù)庫(kù)。注意,由于所有調(diào)用都通過(guò)PersistenceLayer進(jìn)行,因此BusinessLogic類(lèi)不了解UserDAO類(lèi)或任何底層詳細(xì)信息。
在保存時(shí),分配給用戶的ID將從數(shù)據(jù)庫(kù)中重新加載用戶,通過(guò)這樣的方式來(lái)檢查并確保所有值都是正確的。
更新用戶名查看更新記錄是否有效。
重新從數(shù)據(jù)庫(kù)加載用戶,以確保修改的地方已完全更新。
從數(shù)據(jù)庫(kù)中刪除用戶。
更多“使用Hibernate和Spring執(zhí)行數(shù)據(jù)庫(kù)操作”的教程內(nèi)容,請(qǐng)點(diǎn)擊此處查看>>>
想進(jìn)一步了解MyEclips?【MyEclipse官方中文網(wǎng)】知你所需,解你所惑!
想與更多人聊MyEclips?加入MyEclipse中國(guó)(官方2):742336981暢所欲言吧!
想及時(shí)獲取MyEclips資訊?掃描下方二維碼,MyEclips信息跟你走!