iBATIS DAO入門基礎(chǔ)教程
iBATIS DAO的學(xué)習(xí)首先我們要介紹下iBATIS DAO,在核心J2EE模式中是這樣介紹iBATIS DAO模式的:為了建立一個(gè)健壯的J2EE應(yīng)用,應(yīng)該將所有對(duì)數(shù)據(jù)源的訪問(wèn)操作抽象封裝在一個(gè)公共API中。用程序設(shè)計(jì)的語(yǔ)言來(lái)說(shuō),就是建立一個(gè)接口,接口中定義了此應(yīng)用程序中將會(huì)用到的所有事務(wù)方法。在這個(gè)應(yīng)用程序中,當(dāng)需要和數(shù)據(jù)源進(jìn)行交互的時(shí)候則使用這個(gè)接口,并且編寫一個(gè)單獨(dú)的類來(lái)實(shí)現(xiàn)這個(gè)接口在邏輯上對(duì)應(yīng)這個(gè)特定的數(shù)據(jù)存儲(chǔ)。
比如考慮在iBATIS: SQL Maps中的應(yīng)用例子。這是一個(gè)Struts應(yīng)用答應(yīng)對(duì)一個(gè)關(guān)系表執(zhí)行SELECT, INSERT, UPDATE和DELETE的SQL請(qǐng)求。在這個(gè)應(yīng)用中,使用SQL Maps做持續(xù)性框架。現(xiàn)在我們要修改這個(gè)應(yīng)用,將這個(gè)關(guān)系表儲(chǔ)存在一個(gè)XML文件中而不是存在關(guān)系數(shù)據(jù)庫(kù)中,或者使用Hibernate來(lái)實(shí)現(xiàn)SELECT請(qǐng)求,而用SQL Map來(lái)執(zhí)行其他請(qǐng)求,因?yàn)镠ibernate提供了對(duì)高速緩存更好的支持。這樣的修改很難實(shí)現(xiàn),或者即使我們能修改而實(shí)現(xiàn)了這個(gè)功能,也會(huì)是很混亂的解決方案。
對(duì)于這類問(wèn)題更好的解決方法是建立一個(gè)ContactDAO接口,在這個(gè)接口中定義處理SELECT, INSERT, UPDATE, 和DELETE 請(qǐng)求的事務(wù)方法。然后根據(jù)不同的事務(wù)邏輯建立不同的類實(shí)現(xiàn)各個(gè)方法。所以可能會(huì)有一個(gè)類處理使用SQL Maps同關(guān)系表進(jìn)行交互的情況,而另外一個(gè)類處理用XML文件存放關(guān)系表而不是關(guān)系數(shù)據(jù)庫(kù)的情況,等等。在項(xiàng)目中,根據(jù)實(shí)際的需要從不同的ContactDAO中選擇相應(yīng)的實(shí)現(xiàn)。這種關(guān)系見(jiàn)圖1:
圖1. ContactDAO 接口及實(shí)現(xiàn)
iBATIS DAO是由Apache主持的開(kāi)源框架項(xiàng)目,主要目標(biāo)是為了解決這類問(wèn)題。它答應(yīng)在工程中以DAO模式為基礎(chǔ)建立應(yīng)用。這就意味著可以建立一個(gè)XML文件,并聲明XMLContactDAO.Java是ContactDAO的實(shí)現(xiàn)類,這個(gè)類知道如何從XML文件中讀寫數(shù)據(jù)。SQLMapContactDAO則知道如何用SQL Maps作為持續(xù)化框架與關(guān)系表進(jìn)行交互。在工程中,假如向iBATIS DAO框架提交一個(gè)需要XML的ContactDAO請(qǐng)求,框架則會(huì)返回一個(gè)XMLContactDAO對(duì)象。同樣的DAO框架提供了唯一的接口處理事務(wù)治理,這個(gè)接口能實(shí)現(xiàn)與數(shù)據(jù)的存儲(chǔ)方式無(wú)關(guān)。它同樣考慮了底層連接治理細(xì)節(jié)和初始化存儲(chǔ)框架。
這篇文章是關(guān)于如何一步一步的在項(xiàng)目中應(yīng)用iBATIS DAO框架的基礎(chǔ)指導(dǎo)。我們將由如何把SQL Maps一文中的應(yīng)用實(shí)例改為應(yīng)用DAO框架入手。然后,我們要討論DAO框架的構(gòu)造。再下一步,我們關(guān)注事務(wù)治理是如何在DAO框架中得到支持的。***一部分是關(guān)于如何建立自己的事務(wù)治理模塊。
示例應(yīng)用
首先,我們將SQL Maps一文中的例子改為應(yīng)用iBATIS DAO框架。
1.將iBATIS-dao-2.jar文件復(fù)制到WEB-INF/lib目錄下。
2.在Java源程序的目錄里新建一個(gè)如下的DAOMap.xml文件
清單1:
- "com/sample/contact/dao/sqlmap/SqlMapConfig.xml"/>
- implementation=
- "com.sample.contact.dao.sqlmap.SQLMapContactDAO"/>
DAOMap.xml是發(fā)布iBATIS DAO框架的配置文件。是根元素,每個(gè)元素描述了一種存儲(chǔ)機(jī)制。在這個(gè)例子中只使用了SQL Maps來(lái)存儲(chǔ),所以我們這里只有一個(gè)元素。每種存儲(chǔ)機(jī)制必須包含一個(gè)元素,這個(gè)元素描述連接它后面的數(shù)據(jù)存儲(chǔ)所用的治理器,并且標(biāo)記事務(wù)的界限。我們將在稍后再討論transactionManager。
元素還包括一組DAO用于描述其他的存儲(chǔ)治理機(jī)制。在這個(gè)例子中,我們將生成一個(gè)使用SQL Maps存儲(chǔ)的ContactDAO,所以在配置文件中添加一個(gè)ie標(biāo)記來(lái)定義SQLMapContactDAO。
3.建立ContactDAO.java,如下:
單2:
- public interface ContactDAO extends DAO {
- public int insertContact(Contact contact);
- public int updateContact(Contact contact);
- public Contact selectContact(int contactId);
- public int deleteContact(int contactId);
- }
ContactDAO.java定義了用戶和一個(gè)關(guān)系表進(jìn)行交互所需要用到的所有事務(wù)處理方法。請(qǐng)注重到ContactDAO.java中的所有方法都將一個(gè)Contact對(duì)象作為參數(shù),這是一個(gè)用來(lái)攜帶數(shù)據(jù)的數(shù)據(jù)傳遞對(duì)象。
4.建立一個(gè)SQLMapContactDAO.java文件,如下
清單3:
- public class SQLMapContactDAO extends
- SqlMapDaoTemplate implements ContactDAO {
- public SQLMapContactDAO(DaoManager arg0) {
- super(arg0);
- }
- public int deleteContact(int contactId) {
- return super.delete("deleteContact",
- new Integer(contactId));
- }
- public int insertContact(Contact contact) {
- Integer contactId =(Integer)super.insert
- ("insertContact",contact);
- return contact.getContactId();
- }
- public Contact selectContact(int contactId) {
- return (Contact)super.queryForObject("getContact",
- new Integer(contactId));
- }
- public int updateContact(Contact contact) {
- return super.update("updateContact",contact);
- }
- }
SQLMapContactDAO是ContactDAO接口的具體實(shí)現(xiàn),它用SQL Maps作為存儲(chǔ)治理機(jī)制。注重到我們并沒(méi)有寫任何代碼來(lái)或者初始化SQL Maps,或得到一個(gè)連接,或者在類中標(biāo)注一個(gè)事務(wù)的界限。相反,我們繼續(xù)SqlMapDaoTemplate.java類,它幫我們處理下層的、反復(fù)的操作。我們?cè)赟QLMapContactDAO類中需要考慮的唯一的事情就是事務(wù)處理邏輯。
5.修改ContactSelectAction.java類中的execute()方法,如下:
清單4:
- Contact contactForm = (Contact) form;
- Reader reader=
- Resources.getResourceAsReader("DAOMap.xml");
- DaoManager daoManager =
- DaoManagerBuilder.buildDaoManager(reader);
- ContactDAO contactDAO =
- (ContactDAO) daoManager.getDao(
- ContactDAO.class,"sqlmap");
- request.setAttribute("contactDetail",
- contactDAO.selectContact(
- contactForm.getContactId()));
***一步是修改ContactSelectAction類中的execute()方法,使它使用iBATIS DAO框架。為了初始化DAO框架,我們需要一個(gè)為DAOMap.xml 預(yù)備一個(gè)Reader對(duì)象。iBATIS框架為我們提供了方法Resources.getResourceAsReader()來(lái)讀取資源。一旦有了Reader對(duì)象來(lái)讀取DAOMap.xml,就能將它們讀取至DAOManagerBuilder.buildDaoManager(),返回一個(gè)DaoManager實(shí)例,將來(lái)用于與iBATIS DAO框架進(jìn)行交互。從理論上來(lái)說(shuō),應(yīng)該在項(xiàng)目啟動(dòng)的時(shí)候初始化iBATIS DAO框架,在我們這個(gè)程序中,可以將這個(gè)模塊放入Struts插件中,但是為了簡(jiǎn)化這個(gè)例子,我們將初始化模塊放入execute方法中。
有了DaoManager實(shí)例后,可以調(diào)用相應(yīng)的接口和存儲(chǔ)實(shí)現(xiàn)類(在元素中的id屬性值)的getDao()方法。在我們的例子中,需要一個(gè)SQLMapContactDAO的實(shí)例,所以以ContactDAO為接口名稱,“sqlmap”為存儲(chǔ)機(jī)制。一旦實(shí)現(xiàn)了SQLMapContactDAO實(shí)例,就可以在調(diào)用其中的事務(wù)方法。
iBATIS DAO的相關(guān)介紹就到這里,在其他的文章中還會(huì)在涉及iBATIS DAO的其他方面。
【編輯推薦】