萬福成,于洪志,何向真,吳志強(qiáng)
(西北民族大學(xué)中國民族語言文字信息技術(shù)國家民委—教育部重點(diǎn)實(shí)驗(yàn)室,蘭州730030)
隨著互聯(lián)網(wǎng)新興技術(shù)的發(fā)展,傳統(tǒng)的靜態(tài)頁面已經(jīng)不能滿足人們的需求,正因?yàn)槿绱耍赪eb的項(xiàng)目與數(shù)據(jù)庫的聯(lián)系才越來越密切。如何簡單、方便、快速地實(shí)現(xiàn)數(shù)據(jù)庫查詢分頁顯示,以及如何在眾多的不同類型數(shù)據(jù)庫中實(shí)現(xiàn)分頁成為Web項(xiàng)目要解決的問題。
傳統(tǒng)的基于Web服務(wù)器分頁適合數(shù)據(jù)量比較小的情況,數(shù)據(jù)量大時(shí)會(huì)影響Web服務(wù)器性能,占用過多的內(nèi)存,分頁速度也比較慢?;跀?shù)據(jù)庫服務(wù)器的分頁可以避免以上情況,但也會(huì)遇到不同類型的數(shù)據(jù)庫,如Mysql,Oracle等,不同的數(shù)據(jù)查詢分頁用到不同的SQL語句,語句繁多,不利于移植與維護(hù)。
本文基于URL參數(shù)傳遞方式,并采用當(dāng)前流行的Sturts和Hibernate框架技術(shù)來實(shí)現(xiàn)數(shù)據(jù)庫分頁顯示技術(shù),方法簡單、實(shí)用、快速。
采用典型的J2EE三層結(jié)構(gòu),J2EE技術(shù)的基礎(chǔ)就是核心Java平臺(tái)或Java2平臺(tái)的標(biāo)準(zhǔn)版,J2EE不僅鞏固了標(biāo)準(zhǔn)版中的許多優(yōu)點(diǎn),分為表現(xiàn)層、中間層(業(yè)務(wù)邏輯層)和數(shù)據(jù)服務(wù)層。三層體系將業(yè)務(wù)規(guī)則、數(shù)據(jù)訪問及合法性校驗(yàn)等工作放在中間層處理??蛻舳瞬恢苯优c數(shù)據(jù)庫交互,而是通過組件與中間層建立連接,再由中間層與數(shù)據(jù)庫交互。
表現(xiàn)層即Web層,就是MVC模式里面的“V”(view),展現(xiàn)給用戶的界面,可以使jsp,asp,html等,這里采用jsp技術(shù),jsp技術(shù)自1999年問世以來,經(jīng)過多年的發(fā)展,其廣泛的應(yīng)用和穩(wěn)定的表現(xiàn),為其作為表現(xiàn)層技術(shù)打下了堅(jiān)實(shí)的基礎(chǔ)。
中間層為了將控制層與數(shù)據(jù)服務(wù)層分離,即Web項(xiàng)目中的業(yè)務(wù)邏輯Service層。
Service層負(fù)責(zé)實(shí)現(xiàn)業(yè)務(wù)邏輯。業(yè)務(wù)邏輯層以DAO層為基礎(chǔ),通過對DAO組件的封裝,完成系統(tǒng)所要求的業(yè)務(wù)邏輯。這一層屬于接口層,由ServiceImpl實(shí)現(xiàn)層來實(shí)現(xiàn)具體的業(yè)務(wù)邏輯。
DAO層負(fù)責(zé)與持久化對象交互。該層封裝了數(shù)據(jù)的增、刪、查、改的操作。
PO,也叫bean層持久化對象。通過實(shí)體關(guān)系映射工具將關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)映射成對象,很方便地實(shí)現(xiàn)以面向?qū)ο蠓绞讲僮鲾?shù)據(jù)庫,系統(tǒng)采用Hibernate作為ORM框架。Hibernate為持久層提供支持,將具體的bean持久到數(shù)據(jù)庫中。系統(tǒng)中的所有類,都要持久化到數(shù)據(jù)庫中,與數(shù)據(jù)庫中的表相對應(yīng),類中的所有屬性也要與表中的各個(gè)字段相對應(yīng),每個(gè)類都會(huì)生成相應(yīng)的實(shí)體類hbm.xml文件,即Hibernate的映射文件,Hibernate與數(shù)據(jù)庫關(guān)系如圖1所示。
圖1 Hibernate與數(shù)據(jù)庫關(guān)系圖
分頁基本信息類PageInfo是涉及和分頁有關(guān)的信息的Java類,成員變量包含當(dāng)前頁碼cur,總頁數(shù)total,每頁顯示記錄數(shù)size。
類內(nèi)生成setter和getter方法,這樣一個(gè)完整的分頁基本信息類已經(jīng)完成,作為生成對象的模板。
分頁構(gòu)造類PageMaker是以PageInfo的對象和URL作為參數(shù)來構(gòu)造,構(gòu)造函數(shù)為makelist(PageInfo pageInfo,String URL),返回一個(gè)一個(gè)字符串對象用來做前臺(tái)的顯示。
分頁構(gòu)造中采用了URL作為構(gòu)造參數(shù),在URL中我們可以傳遞cur這個(gè)參數(shù)作為某個(gè)頁的頁碼,這樣我們便可以方便地查詢到指定頁的記錄,而不必將所有記錄都查詢出來,從而可以提高服務(wù)器的性能。
以學(xué)生基本信息student為例,具體實(shí)現(xiàn)數(shù)據(jù)庫查詢分頁技術(shù)。
bean類即PO類,普通的Java實(shí)體類,以學(xué)生類student為例,成員變量包括用戶名username,密碼password,郵箱email等。
DAO即數(shù)據(jù)訪問對象,用來訪問數(shù)據(jù)庫,student類對應(yīng)的為studentDAO,實(shí)現(xiàn)為studentDAOImpl,在studentDAO中以 HibernateTemplate作為成員變量,通過HibernateTemplate進(jìn)行對數(shù)據(jù)庫的增刪改查操作。
Service層是業(yè)務(wù)處理層,用來滿足用戶的需求,student類對應(yīng)的為studentService,實(shí)現(xiàn)為studentServiceImpl,以面向借口進(jìn)行編程。
action為控制層,查詢所有學(xué)生信息,并分頁顯示,對應(yīng)的action為listAllStudentsAction,在action中調(diào)用分頁信息,從而實(shí)現(xiàn)真正數(shù)據(jù)庫分頁顯示。
在listAllStudentAction中封裝了studentService,即以studentService作為成員變量,student-ServiceImpl中又以studentDAO作為成員變量,studentDAOImpl以HibernateTemplate作為成員變量,從而訪問數(shù)據(jù)庫,這樣層次很清晰,易于維護(hù)。
實(shí)現(xiàn)查詢所有學(xué)生,首先在數(shù)據(jù)庫中查詢所有學(xué)生記錄的個(gè)數(shù),通過studentService.getRows()來得到所有學(xué)生記錄個(gè)數(shù),將pageInfo的total設(shè)置為該值,在URL中傳入當(dāng)前頁ppp,將pageInfo的cur值設(shè)置為URL傳入的當(dāng)前頁的值,每頁顯示記錄的個(gè)數(shù)可以預(yù)先指定,也可以通過傳參形式指定,這樣我們要查詢的涉及到所有分頁基本信息都已經(jīng)賦值,構(gòu)造分頁信息pageMaker.makeList(pageInfo,URL),將分頁基本信息和 URL,當(dāng)前頁信息傳入,這樣就成功構(gòu)造了分頁信息??傮w流程如下圖2所示。
圖2 分頁流程控制圖
在前臺(tái)jsp頁面中的顯示分頁信息需要Struts2的標(biāo)簽支持,用來得到分頁類的信息,具體標(biāo)簽代碼為<s:porperty value=”pager”/>,將查詢到的學(xué)生信息存入student_list這樣一個(gè)表中,通過迭代取出相應(yīng)頁的學(xué)生信息。這樣涉及到數(shù)據(jù)庫查詢,分頁的設(shè)計(jì)便已經(jīng)實(shí)現(xiàn)。
不同的數(shù)據(jù)庫,都可以將Hibernate作為框架,從而隱藏了不同數(shù)據(jù)庫不同的查詢語句的弊端,HibernateTemplate提供非常多的常用方法來完成基本的操作,比如通常的增加、刪除、修改、查詢等操作,Spring 2.0更增加對命名SQL查詢的支持,也增加對分頁的支持。大部分情況下,使用Hibernate的常規(guī)用法,就可完成大多數(shù)DAO對象的CRUD操作。
HibernateTemplate還提供一種更加靈活的方式來操作數(shù)據(jù)庫,通過這種方式可以完全使用Hibernate的操作方式。HibernateTemplate的靈活訪問方式是通過這個(gè)方法execute(HibernateCallback action),方法中需要一個(gè) HibernateCallback的實(shí)例,HibernateCallback實(shí)例可在任何有效的Hibernate數(shù)據(jù)訪問中使用。程序開發(fā)者通過Hibernate-Callback,可以完全使用Hibernate靈活的方式來訪問數(shù)據(jù)庫,解決Spring封裝Hibernate后靈活性不足的缺陷。HibernateCallback是一個(gè)接口,該接口只有一個(gè)方法doInHibernate(org.hibernate.Session session),該方法只有一個(gè)參數(shù)Session。
通常,程序中采用實(shí)現(xiàn)HibernateCallback的匿名內(nèi)部類來獲取HibernateCallback的實(shí)例,方法doInHibernate的方法體就是Spring執(zhí)行的持久化操作。項(xiàng)目中具體代碼如下(使用了HQL查詢語句):
HibernateTemplate也同樣支持?jǐn)?shù)據(jù)庫連接池,利于數(shù)據(jù)庫的優(yōu)化,對于不同的數(shù)據(jù)庫對于Web項(xiàng)目來說,只是添加的不同的數(shù)據(jù)庫驅(qū)動(dòng)不同而已,這樣利于項(xiàng)目的維護(hù)與移植。
通過在URL傳遞參數(shù),實(shí)現(xiàn)數(shù)據(jù)庫分頁查詢,不僅簡單、方便,而且在其中用到了當(dāng)前流行的Struts、Hibernate技術(shù)作為支持,更使得項(xiàng)目更清晰,利于維護(hù),此外在項(xiàng)目中也可以加入Spring技術(shù),基于切面編程和依賴注入或使得項(xiàng)目更加整潔,也更加清晰。
[1]劉啟文,周大海,夏秀峰.Web應(yīng)用中可擴(kuò)展分頁技術(shù)的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用,2006(s2):179-181.
[2]高文鵬.Java Web分頁技術(shù)與實(shí)現(xiàn)[J].電腦編程技巧與維護(hù),2010(8):82-84.
[3]李政.JAVA數(shù)據(jù)庫數(shù)據(jù)分頁技術(shù)[J].電腦編程技巧與維護(hù),2004(4):38-39.
[4]陳丹桂,任周.基于JSP分頁技術(shù)的研究[J].計(jì)算機(jī)與數(shù)字工程,2009(6):98-100.
[5]周作建,惠志婷,徐穎.JSP分頁技術(shù)[J].電腦編程技巧與維護(hù),2007(8):13-17.
[6]閻冰潔,萬亮,肖敏.高性能查詢分頁技術(shù)的研究與應(yīng)用[J].電腦知識與技術(shù),2006(14):82-83.
[7]翟高粵.基于Struts和Hibernate的文本按行分頁技術(shù)[J].計(jì)算機(jī)時(shí)代,2009(8):40-41.
[8]付文平,羅鍵.基于Web的分頁技術(shù)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)時(shí)代,2007(10):57-59.
長春工程學(xué)院學(xué)報(bào)(自然科學(xué)版)2012年1期