訪問數(shù)據(jù)庫的方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及計算機技術(shù)領(lǐng)域,特別地涉及一種訪問數(shù)據(jù)庫的方法和裝置。
【背景技術(shù)】
[0002] JDBC(JavaDataBaseConnectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語 句的JavaAPI,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接 口組成。JDBC提供了一種基準,據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能 夠編寫數(shù)據(jù)庫應用程序。目前極少有J2EE應用會直接以JDBC的方式進行數(shù)據(jù)庫訪問。畢 竟,用面向?qū)ο蟮某绦蛟O(shè)計語言來訪問關(guān)系數(shù)據(jù)庫,開發(fā)過程中的工作量很大。大部分時 候,J2EE應用都會以0RM框架來進行數(shù)據(jù)訪問,0RM(0bjectRelationalMapping)框架采 用元數(shù)據(jù)來描述對象一關(guān)系映射細節(jié),元數(shù)據(jù)一般采用XML格式,并且存放在專門的對象 一映射文件中。只要提供了持久化類與表的映射關(guān)系,0RM框架在運行時就能參照映射文 件的信息,把對象持久化到數(shù)據(jù)庫中。當前0RM框架主要有三種:Hibernate(Nhibernate), iBATIS,EclipseLink。在所有0RM框架中,Hibernate以其靈巧、輕便的封裝贏得了眾多開 發(fā)者的青睞。雖然Hibernate為開發(fā)者提供了便利的條件,但是原生的框架并不一定完全 滿足現(xiàn)實中的開發(fā)要求,在項目的規(guī)范制定上會有限制,不利于項目的后續(xù)升級和維護。因 此,如何對這些框架進行二次封裝,以滿足開發(fā)需要是一個關(guān)鍵問題,這個問題主要體現(xiàn)在 三方面內(nèi)容:一是符合項目本身的開發(fā)規(guī)范,二是要降低層次之間的耦合,三是提高系統(tǒng)性 能和開發(fā)效率。
[0003] 在目前的通常做法中,一般是以SpringI0C容器為核心,承上啟下。通過 Spring提供的如下三個工具類(或接口)來支持持久層的實現(xiàn):HibernateDaoSupPOrt、 HibernateTemplate、以及HibernateCallback。通過SpringIOC容器,將SessionFactory Bean注入DA0組件,一旦DA0組件獲得了SessionFactoryBean的引用,就可以完成實際的 數(shù)據(jù)庫訪問。
[0004] 實際開發(fā)過程中,通常會發(fā)現(xiàn)服務層和持久層的接口基本一樣,不同點就是服務 層會有一些業(yè)務邏輯的處理,事務的控制;持久層的接口則會直接調(diào)用框架的底層接口來 進行數(shù)據(jù)庫訪問,這些接口基本都是一樣的處理邏輯:增加、刪除、修改、查詢。每實現(xiàn)一個 業(yè)務,都需要調(diào)用相同的接口實現(xiàn)相似的功能,產(chǎn)生代碼重復的現(xiàn)象,這無形之中增加了開 發(fā)人員的工作量。并且開發(fā)人員需要頻繁的對持久對象(P0)和值對象(V0)進行轉(zhuǎn)化,不 但浪費工作量,而且非常耗內(nèi)存,影響系統(tǒng)性能。
[0005] 在解親方面,雖然通過SpringI0C實現(xiàn)了Bean的注入,看起來實現(xiàn)了低親合,但 實際上并沒有,因為持久層暴露的接口很多,基本每個業(yè)務都會有一系列接口,如果真的需 要對持久層調(diào)整,還是需要修改大量的代碼,也就是說,仍存在耦合性高的問題。
[0006] 此處,目前的通常做法還存在代碼規(guī)范性不易統(tǒng)一的問題。具體而言,Hibernate 提供的HQL語言雖然解決了跨數(shù)據(jù)庫的問題,但是Hibernate框架本身對HQL和SQL都支 持,如果不從框架上進行規(guī)范,很難實現(xiàn)接口一致性,對數(shù)據(jù)庫的升級替換也埋下隱患。
【發(fā)明內(nèi)容】
[0007] 有鑒于此,本發(fā)明提供一種訪問數(shù)據(jù)庫的方法和裝置,有助于提高系統(tǒng)性能和開 發(fā)效率,另外有助于解決接口規(guī)范性問題。
[0008] 為實現(xiàn)上述目的,根據(jù)本發(fā)明的一個方面,提供了一種訪問數(shù)據(jù)庫的方法。
[0009] 本發(fā)明的訪問數(shù)據(jù)庫的方法包括:接收持久層的公共接口類的類對象和值映射 表;所述類對象是將持久層抽象為一個公共接口類而得到的類對象;根據(jù)所述類對象獲取 值對象,并且根據(jù)所述值映射表和所述類對象,對該值對象進行父實體的填充;將完成所述 填充的值對象轉(zhuǎn)換為持久對象;將所述持久對象中的數(shù)據(jù)保存到數(shù)據(jù)庫中。
[0010] 可選地,將完成所述填充的所述值對象轉(zhuǎn)換為持久對象的步驟包括:對于完成所 述填充的值對象,采用BeanUtiIs工具將其轉(zhuǎn)換為持久對象。
[0011] 可選地,所述進行父實體的填充的步驟包括:通過會話工廠獲取所述類對象的元 數(shù)據(jù)信息;檢查所述類對象每個字段的類型,在檢查到的當前字段的類型為實體類型的情 況下,根據(jù)所述值映射表中的映射關(guān)系和外鍵查找到該當前字段對應的實體,然后將該實 體填充到所述值對象中。
[0012] 可選地,在需要進行數(shù)據(jù)庫更新操作的情況下,該方法還包括:接收持久層的公共 接口類的類對象和值映射表;根據(jù)所述值映射表和所述類對象對值對象進行父實體的填 充;查找所述類對象的元數(shù)據(jù)信息以獲得字段名稱;采用HQLBulider工具類,按照所述值 映射表拼裝出HQL語句;根據(jù)所述HQL語句生成Query對象,然后使用query.setParameter 工具設(shè)置所述HQL語句的參數(shù),再執(zhí)行所述HQL語句以更新所述數(shù)據(jù)庫。
[0013] 可選地,在需要進行數(shù)據(jù)庫查詢操作的情況下,該方法還包括:使用Query對象的 list方法獲取數(shù)據(jù)庫中的數(shù)據(jù),將該數(shù)據(jù)通過值映射表和值表進行包裝然后輸出。
[0014] 根據(jù)本發(fā)明的另一方面,提供了一種訪問數(shù)據(jù)庫的裝置。
[0015] 本發(fā)明的訪問數(shù)據(jù)庫的裝置包括:接收模塊,用于接收持久層的公共接口類的類 對象和值映射表;所述類對象是將持久層抽象為一個公共接口類而得到的類對象;獲取填 充模塊,用于根據(jù)所述類對象獲取值對象,并且根據(jù)所述值映射表和所述類對象,對該值對 象進行父實體的填充;轉(zhuǎn)換模塊,用于將完成所述填充的值對象轉(zhuǎn)換為持久對象;保存模 塊,用于將所述持久對象中的數(shù)據(jù)保存到數(shù)據(jù)庫中。
[0016] 可選地,所述轉(zhuǎn)換模塊還用于對于完成所述填充的值對象,采用BeanUtils工具 將其轉(zhuǎn)換為持久對象。
[0017] 可選地,還包括:獲取模塊,用于通過會話工廠獲取所述類對象的元數(shù)據(jù)信息;檢 查填充模塊,用于檢查所述類對象每個字段的類型,在檢查到的當前字段的類型為實體類 型的情況下,根據(jù)所述值映射表中的映射關(guān)系和外鍵查找到該當前字段對應的實體,然后 將該實體填充到所述值對象中。
[0018] 可選地,還包括:填充模塊,用于根據(jù)所述接收模塊接收到的用于更新數(shù)據(jù)庫的 值映射表和類對象,對值對象進行父實體的填充;查找模塊,用于查找所述類對象的元數(shù) 據(jù)信息以獲得字段名稱;拼裝模塊,用于采用HQLBulider工具類,按照所述值映射表拼 裝出HQL語句;更新操作模塊,用于根據(jù)所述HQL語句生成Query對象,然后使用query. setParameter工具設(shè)置所述HQL語句的參數(shù),再執(zhí)行所述HQL語句以更新所述數(shù)據(jù)庫。
[0019] 可選地,還包括查詢輸出模塊,用于使用Query對象的list方法獲取數(shù)據(jù)庫中的 數(shù)據(jù),將該數(shù)據(jù)通過值映射表和值表進行包裝然后輸出。
[0020] 根據(jù)本發(fā)明的技術(shù)方案,通過對Hibernate的封裝,將持久層隱藏,開發(fā)人員只需 關(guān)注業(yè)務邏輯,不用考慮持久層開發(fā),也不需要進行重復的代碼拷貝,大大提高了開發(fā)效 率。同時也保留了框架的原生接口訪問,為系統(tǒng)的擴展提供了更多的可能。通過對P0,V0 的封裝,將二者的轉(zhuǎn)化過程由框架實現(xiàn),減少了開發(fā)人員的工作量,也減少了內(nèi)存開銷,提 高了系統(tǒng)的性能。持久層向上層只暴露一個接口,在應用中只有一個工廠實例,降低了層次 之間的耦合,大大提高了系統(tǒng)的擴展性和彈性。所有數(shù)據(jù)庫操作都是通過HQL來完成,一方 面可以兼容多數(shù)據(jù)庫,另一方面保證了系統(tǒng)的規(guī)范性,同時也提供了SQL語句的訪問接口, 方便系統(tǒng)后續(xù)的擴展和維護。
【附圖說明】
[0021] 附圖用于更好地理解本發(fā)明,不構(gòu)成對本發(fā)明的不當限定。其中:
[0022] 圖1是用于實現(xiàn)對結(jié)果映射表的遍歷的核心類圖;
[0023] 圖2是根據(jù)本發(fā)明實施方式的對數(shù)據(jù)庫進行保存操作的基本步驟的示意圖;
[0024] 圖3是根據(jù)本發(fā)明實施方式的對數(shù)據(jù)庫進行更新操作的基本步驟的示意圖;
[0025] 圖4是根據(jù)本發(fā)明實施方式的執(zhí)行數(shù)據(jù)庫保存操作的一種具體流程的示意圖;
[0026] 圖5是根據(jù)本發(fā)明實施方式的執(zhí)行數(shù)據(jù)庫更新操作的一種具體流程的示意圖;
[0027] 圖6是根據(jù)本發(fā)明實施方式的用于實現(xiàn)數(shù)據(jù)庫查詢操作的核心類圖;
[0028] 圖7是根據(jù)本發(fā)明實施方式的實現(xiàn)HQLUtil實例的具體流程的示意圖;
[0029] 圖8是根據(jù)本發(fā)明實施方式的追加字符串和參數(shù)的方法的具體流程圖;
[0030] 圖9是基于本發(fā)明實施方式中的HQL拼裝工具類處理值對象的具體流程的示意 圖;
[0031] 圖10是根據(jù)本發(fā)明實施方式的關(guān)于服務層接口的類圖;
[0032] 圖11是根據(jù)本發(fā)明實施方式的訪問數(shù)據(jù)庫的裝置的主要模塊的示意圖。
【具體實施方式】
[0033] 以下結(jié)合附圖對本發(fā)明的示范性實施方式做出說明,其中包括本發(fā)明實施方式的 各種細節(jié)以助于理解,應當將它們認為僅僅是示范性的。因此,本領(lǐng)域普通技術(shù)人員應當認 識到,可以對這里