摘要:大量的計算機軟件的開發(fā)離不開數(shù)據(jù)庫的使用,利用數(shù)據(jù)庫框架實現(xiàn)數(shù)據(jù)庫的應用具有多方面的優(yōu)勢。該文設計和實現(xiàn)了一個微型數(shù)據(jù)庫應用框架,并將該框架應用于實際的軟件開發(fā)過程中,從而驗證了該框架的可用性。該框架適用于小型軟件系統(tǒng)的開發(fā),提高了系統(tǒng)的可擴展性。
關鍵詞:Java數(shù)據(jù)庫技術;數(shù)據(jù)庫框架;框架模型;框架實現(xiàn)
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2009)36-10184-03
The Research and Development of Database Application Framework on Java
WANG Xiang-zhong
(Software and Art Design Department Nanjing Institute of Railway Technology, Nanjing 210015, China)
Abstract: Many developments of computer software can do without the application of database, it has a lot of advantages in database application using database framework. It designs and realizes a micro-type database application framework, and uses the framework in software development; as a result it confirms that this framework is usable. The framework can apply to the development of small software system, and it can increase the extendibility of the system.
Key words: Java database technology; database framework; framework model; framework realize
隨著人類社會對軟件需求的不斷增加,計算機軟件的開發(fā)和應用也越來越廣泛,已經(jīng)深入到社會生活的各個方面,而其中基于數(shù)據(jù)庫開發(fā)的應用系統(tǒng)也越來越多。研究在軟件開發(fā)中數(shù)據(jù)庫技術的使用和實現(xiàn)尤其必要。
如果每個程序員都通過實現(xiàn)自己的類來使用數(shù)據(jù)庫,一方面,將增加程序員本身的工作量,增加軟件開發(fā)中潛在的錯誤;另一方面,無法降低開發(fā)人員對數(shù)據(jù)庫操作的隨意性,無法實現(xiàn)代碼復用。這些都不符合面向?qū)ο蟮能浖_發(fā)思想,為了又好又快地開發(fā)我們所需的應用系統(tǒng),隨著面向?qū)ο箝_發(fā)技術的不斷發(fā)展,基于框架的軟件開發(fā)已經(jīng)成為一種軟件開發(fā)的趨勢,并在實際的軟件開發(fā)中得到了廣泛的應用,其中數(shù)據(jù)庫技術的應用也不例外。
1 框架技術
目前,大量的軟件開發(fā)實踐證明,幾乎所有的軟件開發(fā)都不是從零開始的,而是在一定的已有代碼、組件、框架的基礎上進行的二次開發(fā),基于框架的軟件開發(fā)事實上已經(jīng)成為業(yè)界軟件開發(fā)的一種共識,在數(shù)據(jù)庫應用開發(fā)中也是如此。
使用數(shù)據(jù)庫框架至少有三個方面的優(yōu)勢。第一,可以隱藏數(shù)據(jù)庫操作的復雜性,為處理復雜任務提供一套標準的操作程序。第二,可以在開發(fā)人員和數(shù)據(jù)庫之間構(gòu)建一個經(jīng)過反復試驗的穩(wěn)固的中間層,降低風險。第三,可以讓執(zhí)行任務的方式具有一致性??蚣艿氖褂脼樘幚韽碗s任務提供的標準,如圖1所示。
目前,在Java開發(fā)中也使用了大量的數(shù)據(jù)庫框架,其中最流行的是Hibernate框架。但Hibernate框架更適合于大型軟件系統(tǒng)的開發(fā),并且需要一定是時間的學習。為了在小型軟件系統(tǒng)的開發(fā)中也使用數(shù)據(jù)庫框架,本文實現(xiàn)了一個的數(shù)據(jù)庫應用框架。
2 Java數(shù)據(jù)庫技術
JDBC(Java Database Connectivity)是由Sun公司及其合作伙伴共同制定的一種基于JAVA語言訪問數(shù)據(jù)庫的技術。JDBC提供了訪問數(shù)據(jù)庫的接口(即標準),而具體實現(xiàn)由數(shù)據(jù)庫廠商提供,而程序員編程時都是針對接口進行編程的。
JDBC為了使程序員方便地操作數(shù)據(jù)庫,提供了五個重要的接口,它們分別是Connection、Statement、PreparedStatement、CallableStatement和ResultSet,其相互關系如圖2所示。
其中:
1)Connection:用于保存特定的數(shù)據(jù)庫連接(會話),在連接上下文中執(zhí)行SQL語句并返回其結(jié)果。
2)Statement:用于執(zhí)行靜態(tài)SQL語句并返回其所生成的結(jié)果對象。
3)PreparedStatement:表示預編譯的SQL語句對象。
4)CallableStatement:用于執(zhí)行SQL存儲過程。
5)ResultSet:表示數(shù)據(jù)庫結(jié)果集的數(shù)據(jù)表,通常通過執(zhí)行查詢數(shù)據(jù)庫的語句生成。
利用JDBC訪問數(shù)據(jù)庫的一般流程如下:
1)加載數(shù)據(jù)庫驅(qū)動程序;
2)建立與數(shù)據(jù)庫的連接;
3)執(zhí)行SQL語句;
4)處理結(jié)果;
5)釋放數(shù)據(jù)庫連接。
3 數(shù)據(jù)庫框架模型
本文實現(xiàn)的數(shù)據(jù)庫模型的類圖如圖3所示。
該數(shù)據(jù)庫框架由四個類和一個接口構(gòu)成。
1)Parser接口:定義了一個解析器的標準,其中包含如下兩個方法。
public DatabaseConfigInfor parse(String filename);
public DatabaseConfigInfor parse(File file);
parse()方法實現(xiàn)對一個數(shù)據(jù)庫的配置文件進行解析,并使用DatabaseConfigInfor對象對數(shù)據(jù)庫的配置信息進行包裝,以便于數(shù)據(jù)庫配置信息的傳輸。
2)ParserAdapter類:是實現(xiàn)了Parser接口的一個抽象類,對Parser接口中的兩個方法分別進行空實現(xiàn),即這兩個方法從邏輯上而言,什么事也沒干。將其定義為抽象類是防止程序員創(chuàng)建該類的對象。
3)XMLParser類:承繼于ParserAdapter類的非抽象類,實現(xiàn)對XML配置文件的解析。
4)DatabaseConfigInfor類:是一個JavaBean類,用于存儲數(shù)據(jù)庫的配置信息。
5)DBConnection類:實現(xiàn)數(shù)據(jù)庫驅(qū)動程序的加載,創(chuàng)建數(shù)據(jù)庫連接對象,用于對數(shù)據(jù)庫的操作。
4 數(shù)據(jù)庫框架實現(xiàn)
本數(shù)據(jù)庫框架的實現(xiàn)涉及到多個類的實現(xiàn),由于篇幅的限制,本文僅介紹XML配置文件的解析器ParserAdapter類和DBConnection類的實現(xiàn)過程。
1)ParserAdapter類
public class XMLParser extends ParserAdapter
{
private DatabaseConfigInfor dc=1;
public DatabaseConfigInfor parse(String filename)
{
dc=new DatabaseConfigInfor(); //創(chuàng)建保存數(shù)據(jù)庫配置信息的對象
try
{ //創(chuàng)建文檔解析器的工廠類對象
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//在解析XML文件時,不考慮空白結(jié)點
factory.setIgnoringElementContentWhitespace(true);
//創(chuàng)建文檔解析器對象
DocumentBuilder builder=factory.newDocumentBuilder();
//解析XML文件
Document doc=builder.parse(new FileInputStream(filename));
Element element=doc.getDocumentElement();
//提取XML文件中的數(shù)據(jù)庫配置信息,并存入DatabaseConfigInfor對象
NodeList nodes=element.getChildNodes();
for(int i=0;i { Node currentNode=nodes.item(i); String tagName=currentNode.getNodeName(); String tagValue=currentNode.getFirstChild().getNodeValue(); if(tagName.equals(\"driver\")) { dc.setDriver(tagValue); } else if(tagName.equals(\"url\")) { dc.setUrl(tagValue); } else if(tagName.equals(\"databasename\")) { dc.setDatabasename(tagValue); } else if(tagName.equals(\"user\")) { dc.setUser(tagValue); } else if(tagName.equals(\"password\")) { dc.setPassword(tagValue); }}} catch(ParserConfigurationException pce) {pce.printStackTrace();} catch(FileNotFoundException fnfe) {fnfe.printStackTrace();} catch(org.xml.sax.SAXException saxe) {saxe.printStackTrace();} catch(IOException ioe) {ioe.printStackTrace();} return dc; }} 2)DBConnection類 public class DBConnection { public Connection getConnection(Parser parser) { //利用解析器解析數(shù)據(jù)庫框架的配置文件 DatabaseConfigInfor dc=parser.parse(\"dataBaseConfiger.xml\"); Connection conn=1; try { Class.forName(dc.getDriver());//加載數(shù)據(jù)庫驅(qū)動程序 //創(chuàng)建數(shù)據(jù)庫連接對象 conn=DriverManager.getConnection(dc.getUrl()+\";databasename=\"+ dc.getDatabasename(),dc.getUser(),dc.getPassword()); } catch(ClassNotFoundException cnfe) {cnfe.printStackTrace();} catch(SQLException sqle) {sqle.printStackTrace();} return conn; }} 5 結(jié)論 該文給出了數(shù)據(jù)庫框架的設計和開發(fā)過程,可以將其應用基于數(shù)據(jù)庫的應用系統(tǒng)開發(fā),以避免開發(fā)者重復編寫操作數(shù)據(jù)庫的代碼。經(jīng)過作者的實踐,此數(shù)據(jù)庫可以運用于Java應用系統(tǒng)的開發(fā)。在應用該數(shù)據(jù)庫框架時,需要編寫相應的DAO(數(shù)據(jù)訪問對象類),也可以通過繼承ParserAdapter類實現(xiàn)自己新的數(shù)據(jù)庫配置文件解析器,而不需要修改其他的源代碼,從而實現(xiàn)框架的擴展。 參考文獻: [1] 殷兆麟.UML及其建模工具的使用[M].北京:清華大學出版社,北京交通大學出版社,2008. [2] 何克清,應時,田中茂,等.業(yè)務應用軟件框架的一種分析方法[J].軟件學報,2001,12(7):1007-1014. [3] Cay S.Horstmann,Gary Cornell[美] .Java2核心技術卷II,高級特性[M].北京:機械工業(yè)出版社,2006. [4] 王國仁.XML數(shù)據(jù)管理技術[M].北京:電子工業(yè)出版社,2007.