

摘 要:面對(duì)龐大而又復(fù)雜的高校一卡通數(shù)據(jù),設(shè)計(jì)一套完整高效的數(shù)據(jù)查詢(xún)系統(tǒng)對(duì)于分析這些數(shù)據(jù)具有重大意義。本文從解決數(shù)據(jù)查詢(xún)編程問(wèn)題出發(fā),考慮到數(shù)據(jù)安全,提出以MVC框架模式為基礎(chǔ),利用Hibernate框架優(yōu)化數(shù)據(jù)查詢(xún)結(jié)構(gòu),對(duì)數(shù)據(jù)訪問(wèn)程序設(shè)計(jì)具有很高的應(yīng)用參考價(jià)值。
關(guān)鍵詞:MVC模式;數(shù)據(jù)查詢(xún);優(yōu)化設(shè)計(jì);Hibernate
1 MVC框架模式
MVC(Model-View-Controller)框架模式通過(guò)模型、視圖、控制器,分別對(duì)程序的輸入、處理和輸出進(jìn)行控制,三者相互獨(dú)立,不會(huì)因?yàn)槠渲幸豁?xiàng)的改變而影響其他內(nèi)容的變化。其中,模型可以為視圖提供數(shù)據(jù),同時(shí)進(jìn)行業(yè)務(wù)邏輯關(guān)系的處理;視圖用于接收命令和顯示相應(yīng)的數(shù)據(jù);控制器則專(zhuān)門(mén)控制用戶(hù)的輸入和輸出。如圖1所示:
2 數(shù)據(jù)查詢(xún)?cè)O(shè)計(jì)
原始的Web程序開(kāi)發(fā)以服務(wù)器端開(kāi)發(fā)為主,在程序設(shè)計(jì)中,以獨(dú)立編寫(xiě)的SQL命令語(yǔ)句直接對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢(xún),這種命令語(yǔ)句直接編寫(xiě)在頁(yè)面代碼中,甚至數(shù)據(jù)庫(kù)的賬戶(hù)密碼都暴露給程序閱讀者,很容易被他人所用,給程序的安全性造成很大的隱患。
JAVA提供的Web開(kāi)發(fā)JSP+Servlet+JavaBean可以在一定程度上解決上述問(wèn)題,它是用JavaBean來(lái)封裝邏輯程序、用戶(hù)參 數(shù)及賬戶(hù)密碼,以JSP顯示程序輸出結(jié)果,大大提高了程序設(shè)計(jì)的安全性。其實(shí)現(xiàn)方式及對(duì)應(yīng)的MVC模式如圖2所示:
如上圖所示,以Servlet控制用戶(hù)請(qǐng)求、顯示響應(yīng)結(jié)果,在接受用戶(hù)請(qǐng)求時(shí),以參數(shù)作為用戶(hù)請(qǐng)求的載體,將參數(shù)的安全性驗(yàn)證設(shè)計(jì)到業(yè)務(wù)邏輯中,即在JavaBean中內(nèi)置變量,其方法中的變量userpassWord即用戶(hù)輸入的密碼驗(yàn)證程序如下:
String userpassWord;
public void setUserpassWord(String s)
{
userpassWord=s;
}
public String getUserpassWord()
{
return userpassWord;
}
sql.executeQuery(\"select * from user WHERE userpassword='\"+userpassWord+\"'\");
用戶(hù)名及其他參數(shù)類(lèi)同,這種通過(guò)Servlet只調(diào)取JSP中的參數(shù),在封裝的JavaBean中進(jìn)行參數(shù)處理,然后對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢(xún)進(jìn)而核對(duì)參數(shù)正確性的驗(yàn)證方法,在很大程度上保障了程序和數(shù)據(jù)庫(kù)的安全性。
3 數(shù)據(jù)優(yōu)化設(shè)計(jì)
在對(duì)龐大的高校一卡通數(shù)據(jù)進(jìn)行查詢(xún)功能設(shè)計(jì)中會(huì)面臨諸多難題:其中最為常見(jiàn)的就是為了數(shù)據(jù)序列的一致性,需要分析數(shù)據(jù)對(duì)象持久性;要處理好以上問(wèn)題,就要借助MVC框架模式來(lái)進(jìn)行程序優(yōu)化設(shè)計(jì),同時(shí)借助Hibernate的作用,Hibernate包含6個(gè)核心接口:Session、SessionFactory、Transaction、Criteria、Query和Configuration,這6個(gè)核心接口應(yīng)用甚廣,可以把數(shù)據(jù)對(duì)象進(jìn)行模型化存儲(chǔ),將數(shù)據(jù)信息儲(chǔ)存到本地磁盤(pán)后,根據(jù)實(shí)體類(lèi)進(jìn)行數(shù)據(jù)關(guān)系映射,對(duì)持久化對(duì)象進(jìn)行存取,從而能夠保證在處理數(shù)據(jù)對(duì)象時(shí)保證數(shù)據(jù)序列的一致性。
例如應(yīng)用程序通過(guò)Hibernate保存java.sql.Clob實(shí)例時(shí),必須包含兩個(gè)步驟:(1)保存一個(gè)空的Clob實(shí)例在數(shù)據(jù)庫(kù)事務(wù)中,(2)鎖定此記錄,更新保存的Clob實(shí)例,把長(zhǎng)文本數(shù)據(jù)寫(xiě)入Clob實(shí)例中,其代碼如下:
…
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Customer customer = new Customer();
customer.setDescription(Hibernate.createClob(\"\")); //先保存一個(gè)空 的clob
session.save(customer);
session.flush();
//鎖定此記錄
session.refresh(customer,LockMode.UPGRADE);
oracle.sql.CLOB clob = (oracle.sql.CLOB) customer.getDescription();
java.io.Writer pw = clob.getCharacterOutStream();
pw.write(longText);//longText為長(zhǎng)文本字符串
pw.close();
tx.commit();
session.close();
在處理數(shù)據(jù)類(lèi)型的問(wèn)題上,Hibernate通過(guò)內(nèi)置的映射類(lèi)型和客戶(hù)化映射類(lèi)型來(lái)實(shí)現(xiàn),內(nèi)置映射類(lèi)型可以將一些常見(jiàn)的JAVA類(lèi)型映射到相應(yīng)的SQL類(lèi)型,用戶(hù)還可以實(shí)現(xiàn)UserType和CompositeUserType接口,從而靈活地定制客戶(hù)所需映射類(lèi)型。
通過(guò)以上實(shí)例可以看出,Hibernate主要是作為數(shù)據(jù)持久性框架來(lái)使用,其對(duì)應(yīng)MVC模式中的模型,它的主要作用是處理事務(wù)流程,把數(shù)據(jù)庫(kù)中的關(guān)系表通過(guò)ORM映射為對(duì)象,將常用的數(shù)據(jù)查詢(xún)程序?qū)?yīng)到一個(gè)控制器,從而達(dá)到封裝和優(yōu)化的目的。
參考文獻(xiàn):
[1]丁振凡,吳根斌.Spring 3.x MVC模型的數(shù)據(jù)校驗(yàn)國(guó)際化處理[J].計(jì)算機(jī)時(shí)代,2012(08).
[2]王哲.基于MVC的系統(tǒng)架構(gòu)設(shè)計(jì)探究[J].數(shù)字技術(shù)與應(yīng)用,2012(01).