1. 程式人生 > >使用XML封裝資料庫操作語句的實現

使用XML封裝資料庫操作語句的實現

在專案開發的過程當中,專案組開發成員的程式設計風格差異和資料庫操作語句SQL的靈活性給專案組帶來了越來越多的操作和維護難度。比如:從user表中取出所有資料,有的人會寫成 ’ select * from user’ ,有的人會寫成 ‘select all from user’,雖然在操作中不會有任何的錯誤,但在其他人讀程式的過程時就會產生不好的感覺。如果這種程式差異在專案中的數量級很多,那麼在開發的過程當中程式就會出現各種各樣的風格,在維護的過程中就會拼命的撓頭並詛咒那些當初寫程式的人(呵呵,至少我會毫不客氣的罵人的)。為了整篇文章的舉例,現在我們在資料庫中建立如下表TBL_USERUSERID BIGINTUSERNAME VARCHAR(20)PASSWORD VARCHAR(20)CREATETIME DATETBL_USER_INFOUSERID BIGINTEMAIL VARCHAR(64)MOBILE VARCHAR(13)一:分析A) 分析select語句於是使用XML來封裝資料庫操作語句成為專案規範化操作的第一步驟。在這個步驟中,我們將舉幾個例子來逐步實現封裝的目的。比如 “ SELECT USERNAME, PASSWORD FROM TBL_USER ” 這個語句,分析成XML檔案時可以有各種各樣的寫法,我們現在使用如下的表達方式:分析1)1 <dbtrans name=”selectUser” table=”TBL_USER” method=”select”>2 <get>3 <property name=”username” type=”string”/>4 <property name=”password” type=”string”/>5 </get>6 </dbtrans>在第一行的句子中使用 dbtrans 為節點名稱,屬性name為這個交易的名稱,這裡為”selectUser”, 屬性table為索取表的名稱,這裡為”TBL_USER”,屬性method為操作資料庫的方法,這裡為”select”,子節點<get></get>意思為從資料庫讀取資料。子節點<property />為讀取的資料庫欄位,其中:屬性name為欄位的名字,屬性type 為欄位的型別,這裡設定型別在後面的程式中可以體現出來。對於” SELECT USERNAME, PASSWORD FROM TBL_USER WHERE USERID=123 “語句,我們根據上訴的分析,則可將XML描繪為:分析2)1. <dbtrans name=”selectUserByKey” table=”TBL_USER” method=”select”>2. <key>3 <property name=”userid” type=”long”/>4 </key>5 <get>6 <property name=”username” type=”string”/>7 <property name=”password” type=”string”/>8 </get>9 </dbtrans>如果使用的是like操作,我們可以將第3句描述成為<property name=”username” type=”string” match=”like”/>對於” SELECT USERNAME, PASSWORD FROM TBL_USER ORDER BY USERNAME DESC “這個語句,XML如下分析分析3)1. <dbtrans name=”selectUser” table=”TBL_USER” method=”select”>2 <get>3 <property name=”username” type=”string”/>4 <property name=”password” type=”string”/>5 </get>6 <order name="respcode" match="desc" />6 </dbtrans>這樣的語句分析基本上可以完成了絕大部分的普通資料庫的select語句的操作,但是畢竟還是會有一些我們無法預料的資料庫操作語句會出現,比如“SELECT USERNAME, PASSWORD FROM TBL_USER WHERE CREATETIME >’2003-7-16’ AND CREATETIME<’2003-9-16’時,同時出現了CREATETIME在 <key>之中,這時我們可以將XML描繪成為<key><property name=”starttime” column=”createtime” type=”date” match=”>”><property name=”endtime” column=”createtime” type=”date” match=”<”> </key>但即使使用了以上的變通方法,還是會有很多的特殊語句是無法完成的,比如 “ SELECT COUNT(*) FROM TBL_USER “, 這時的操作會出現使用XML語句無法描繪的時候,這個時候我們就可以引入了special這個屬性,例如:分析4)1. <dbtrans name=”selectUser” table=”TBL_USER” method=”select” special=”select count(*) from tbl_user”>2 </dbtrans>這個屬性的意思是將所有的特殊交易都特殊表現出來。B)分析INSERT語句INSERT 語句在關係型資料庫中操作可以說是最麻煩的一條語句了,因為如果你需要在TBL_USER和TBL_USER_INFO表中建立一條對應的資料時,你需要知道插入資料庫的主鍵的值,在JDBC3.0中可以使用Statement.RETURN_GENERATED_KEYS來獲取,但是如果為了相容性考慮,我們在操作過程之中決定採用另一種辦法來實現。我們在資料庫中建立一個表,名為:TSYS_PRIMARYKEY,其中包括三個欄位,如下:TSYS_PRIMARYKEYKEYID BIGINTTABLENAME VARCHAR(64)PRIMARYKEY VARCHAR(30)其中TABLENAME儲存表名,PRIMARYKEY儲存主鍵的名稱,KEYID儲存主鍵的值,這樣的做法目的是在insert語句操作前,先取到現在主鍵的值,並將該值加1,成為現有的主鍵,然後進行insert操作,操作完成之後我們還需要update一下TSYS_PRIMARYKEY這個表,確保資料的同步。現在我們開始分析 INSERT語句了, INSERT INTO TBL_USER ( USERID, USERNAME, PASSWORD ) VALUES ( 100, ‘test’, ‘test’ )INSERT INTO TBL_USER_INFO ( USERID, EMAIL, MOBILE ) VALUES ( 100, ‘
[email protected]
’, ‘1234567890’ )描繪為XML檔案時我們可以描繪如下分析5)1. <dbtrans name=”insertUser” table=”TBL_USER” method=”insert”>2 <primarykey name=”userid” >3 <set>4 <property name=”username” type=”string”/>5 <property name=”password” type=”string”/>6 </set>7 </dbtrans>以及1. <dbtrans name=”insertUserInfo” table=”TBL_USER_INFO” method=”insert”>2 <set>3 <property name=”userid” type=”long”/>4 <property name=”email” type=”string”/>5 <property name=”mobile” type=”string”/>6 </set>7 </dbtrans>C) 分析DELETE語句Delete語句最常用的可以分為兩種,一種是按照鍵值刪除,一種是全部刪除,為此我們將此操作劃分為兩種型別,delete和clear對於delete型別,舉例為:DELETE FROM TBL_USER_INFO WHERE USERID=123描述為:分析6)1. <dbtrans name=”deleteUserInfo” table=”TBL_USER_INFO” method=”delete”>2 <key>3 <property name=”userid” type=”long” />4 </key>5 </dbtrans>對於clear型別,舉例為:DELETE FROM TBL_USER_INFO描述為:分析7)1. <dbtrans name=”clearUserInfo” table=”TBL_USER_INFO” method=”clear”>2 </dbtrans>D)分析UPDATE語句從update通常的操作我們可以知道使用XML表述時將會出現兩種tag,包括<key>和<set>,比如:UPDATE TBL_USER_INFO SET EMAIL=’
[email protected]
’ WHERE USERID=123描述稱XML為:分析8)1. <dbtrans name=”updateUserInfo” table=”TBL_USER_INFO” method=”update”>2 <key>3 <property name=”userid” type=”long” />4 </key>5 <set>6 <property name=”email” type=”string” />7 </set>8 </dbtrans>二:程式設計好的,在分析了XML檔案之後需要我們進入到程式的設計上來了。從以上實現的分析我們可以清楚的看到要實現以上操作,我們必須要做到以下幾步:1:讀取XML檔案2:定位相應的交易節點3:拼SQL 語句4:資料庫操作5:取資料6:返回資料其中針對第一步的讀取檔案,我們可以封裝所有的XML parse語句以及前期的操作封裝進入一個類之中,這裡我們命名為 XMLLoadFile。交易處理的過程包括2,5,6三個步驟,可以封裝成XMLTransaction類中。當然返回資料這個操作可以單獨抽出來作為一個相應的返回類,如果這樣是為了在返回的資料報文做處理,比如可以返回XML,Vector或者Hashtable或Map等。這裡暫定返回資料為Vector型別,所以將第6步封裝進來。拼裝SQL語句,獨立建立一個類(XMLCombine),當然也可以分為多個,比如SelectCombine,insertCombine等,這裡我們進行統一封裝。資料庫操作單獨封裝成一個類,XMLExecuteSQL。以上所有的類統一了一個出口類,這裡為XMLUtils。這個類提供的幾個方法為外部資料操作的主要方法,比如select, insert, delete, update等,還有提供外部程式存取資料的幾個方法,比如:setTransNode(設定交易節點),setTransValue(設定交易資料值), setTransKeyValue(設定交易鍵值資料值) 三:外部程式呼叫對於select語句,分析1)所需編寫的程式如下XMLUtils util = new XMLUtils();util.setTransNode(“selectUser”);Vector vRtn = util.select( con );分析2)為XMLUtils util = new XMLUtils();util.setTransNode(“selectUserByKey”);util.setTransKeyValue(“userid”, 123 );Vector vRtn = util.select( con );對於insert語句,分析5)程式如下XMLUtils util = new XMLUtils();util.setTransNode(“insertUser”);util.setTransValue(“username”, “test” );util.setTransValue(“password”, “test” );Vector vRtn = util.insert( con ); //假設操作成功long userid = ((Long)((Hashtable)vRtn.elementAt(0)).get(“userid”)).longValue();util.setTransNode(“insertUserInfo”);util.setTransValue(“userid”, userid );util.setTransValue(“email”, “
[email protected]
” );util.setTransValue(“mobile”, “1234567890” );Vector vRtn = util.insert( con ); 對於 delete語句 分析 6)程式如下XMLUtils util = new XMLUtils();util.setTransNode(“deleteUser”);util.setTransKeyValue(“userid”, 100);util.delete( con ); 對於update語句,分析 8)程式如下XMLUtils util = new XMLUtils();util.setTransNode(“updateUserInfo”);util.setTransKeyValue(“userid”, 123);util.setTransValue(“email”, “[email protected]”);util.update( con ); 大家在看這些SQL的操作時,是不是覺得很工整,也很舒服呢?這樣做的好處很多,程式設計師可以不必太多的去拼寫SQL 語句,封裝的操作可以使所有程式設計師的程式都可以寫的很工整,並有統一的風格。Good Luck, Enjoy.Keli [email protected] word文件放置於此