




已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)庫(kù)連接和數(shù)據(jù)庫(kù)操作1.數(shù)據(jù)庫(kù)連接ZCF連接數(shù)據(jù)庫(kù)是通過(guò)從連接池中獲取已經(jīng)在database.xml文件中配置好的連接來(lái)實(shí)現(xiàn)的。連接配置比較簡(jiǎn)單,都是在配置文件database.xml中進(jìn)行配置,詳細(xì)配置說(shuō)明請(qǐng)參看數(shù)據(jù)庫(kù)連接池。執(zhí)行數(shù)據(jù)庫(kù)操作的時(shí)候默認(rèn)是取name=”Default”配置的連接。如果想獲得其他連接可以通過(guò)以下代碼(代碼摘自附件DBConnExample.java.)實(shí)現(xiàn):DataAccessda=newDataAccess(DBConnPool.getConnection(example);使用以上方法請(qǐng)注意關(guān)閉數(shù)據(jù)庫(kù)連接,標(biāo)準(zhǔn)用法代碼示例:/取得配置連接名字為example的連接DataAccessda=newDataAccess(DBConnPool.getConnection(example);/構(gòu)造QueryBuilder實(shí)例QueryBuilderqb=newQueryBuilder(select*fromzcexample);/將QueryBuilder實(shí)例置入取得連接的da,這樣數(shù)據(jù)庫(kù)進(jìn)行sql查詢(xún)的時(shí)候使用的是example連接,執(zhí)行查詢(xún)后得到DataTable.DataTabledt=da.executeDataTable(qb);/輸出dtSystem.out.println(dt);/輸出dt中列名為Name的所有值for(inti=0;idt.getRowCount();i+)System.out.println(姓名:+dt.getString(i,Name);/最后關(guān)閉數(shù)據(jù)庫(kù)連接if(da!=null)tryda.close();catch(Exceptione)e.printStackTrace();/TODO:handleexception結(jié)果圖如下:圖:數(shù)據(jù)庫(kù)連接程序運(yùn)行結(jié)果演示中使用默認(rèn)連接配置如下:MYSQLlocalhost3306澤元開(kāi)發(fā)框架root1030110000ZDMaxNo2.數(shù)據(jù)庫(kù)操作2.1數(shù)據(jù)庫(kù)操作系統(tǒng)概述Web應(yīng)用中數(shù)據(jù)持久化的首選當(dāng)屬關(guān)系型數(shù)據(jù)庫(kù),所以J2EE開(kāi)發(fā)人員大部分的開(kāi)發(fā)時(shí)間會(huì)花費(fèi)在數(shù)據(jù)庫(kù)操作上,但使用JDBC直接操作數(shù)據(jù)庫(kù)存在很多不便之處,因此需要對(duì)JDBC進(jìn)行進(jìn)一步的封裝,以更為合理的方式使數(shù)據(jù)庫(kù)操作與業(yè)務(wù)邏輯接合。一般而言,數(shù)據(jù)庫(kù)操作需要考察以下幾個(gè)問(wèn)題:1)能不能不修改程序自動(dòng)支持多種數(shù)據(jù)庫(kù)?2)能不能對(duì)數(shù)據(jù)庫(kù)連接進(jìn)行有效的監(jiān)控以防止連接泄漏?3)能不能不需要開(kāi)發(fā)人員手工管理連接的關(guān)閉?4)能不能一條語(yǔ)句就得到想要的數(shù)據(jù)集?5)得到數(shù)據(jù)集后能不能便利地按行、按列、按字段名找到指定值?6)得到數(shù)據(jù)集后能不能對(duì)行、列進(jìn)行增、刪、改操作?7)得到數(shù)據(jù)集后能不能進(jìn)行排序、篩選等操作?8)能不能方便地分頁(yè)提取數(shù)據(jù)集?9)一張數(shù)據(jù)表通常代表著一個(gè)業(yè)務(wù)實(shí)體,有沒(méi)有一種面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù),使得開(kāi)發(fā)人員不需要小心翼翼地拼寫(xiě)字段名稱(chēng)?10)能不能方便地使用事務(wù)?11)數(shù)據(jù)經(jīng)常需要進(jìn)行修改、刪除等對(duì)業(yè)務(wù)邏輯有著重要影響的操作,如何保存數(shù)據(jù)的歷史版本,以便于錯(cuò)誤操作之后進(jìn)行恢復(fù)?12)SQL注入是Web應(yīng)用最為主要的安全問(wèn)題,能不能提供一種統(tǒng)一的方法防止SQL注入?各個(gè)軟件開(kāi)發(fā)機(jī)構(gòu)數(shù)據(jù)庫(kù)操作的開(kāi)發(fā)框架一般只對(duì)上述問(wèn)題中的某幾個(gè)給出肯定答案,對(duì)于其它方面則需要開(kāi)發(fā)人員手工解決,而ZvingFramework通過(guò)一個(gè)輕量級(jí)的數(shù)據(jù)庫(kù)操作API,在保持與直接操作JDBC同等性能的情況下對(duì)全部問(wèn)題給出了肯定答案。2.2數(shù)據(jù)庫(kù)連接池通過(guò)修改類(lèi)文件根目錄下(WEB應(yīng)用是WEB-INF/classes)的database.xml中的databaeses節(jié)點(diǎn)來(lái)配置連接池,配置文件示例如下:MYSQL83306platformrootpassword10000ZDMaxNoORACLE81521orclzcmspassword10000ZDMaxNoJNDIRefMDMaxNo其中databaeses節(jié)點(diǎn)下可以有多個(gè)database子節(jié)點(diǎn),每個(gè)子節(jié)點(diǎn)對(duì)應(yīng)著一個(gè)連接池,name=”Default”的節(jié)點(diǎn)為默認(rèn)連接池,各config子節(jié)點(diǎn)含義如下:name=Type:數(shù)據(jù)庫(kù)類(lèi)型,目前支持Oracle、DB2、Mssql、Mysql;name=ServerAddress:數(shù)據(jù)庫(kù)服務(wù)器域名或IP地址;name=Port:數(shù)據(jù)庫(kù)服務(wù)器端聽(tīng)的端口;name=Name:數(shù)據(jù)庫(kù)用戶(hù)名稱(chēng);name=Password:數(shù)據(jù)庫(kù)用戶(hù)密碼;name=MaxConnCount:連接池允許的最大連接數(shù);name=InitConnCount:連接池初始化時(shí)建立的連接數(shù)量;name=TestTable:用來(lái)測(cè)試連接是否有效的數(shù)據(jù)庫(kù)表名。也可以通過(guò)配置Ref項(xiàng)使用中間件的連接池,其中JNDIRef表示中間件連接池在JNDI中的名稱(chēng)。3.一般數(shù)據(jù)庫(kù)操作3.1執(zhí)行SQL語(yǔ)句通過(guò)使用QueryBuilder類(lèi),可以方便地在數(shù)據(jù)庫(kù)中執(zhí)行SQL語(yǔ)句。QueryBuilder需要給定一個(gè)參數(shù)化的SQL語(yǔ)句,并設(shè)置它的參數(shù),然后指定相應(yīng)的操作方法即可操作數(shù)據(jù)庫(kù),而不需要手工管理Connection、Statement、ResultSet等對(duì)象,之所以使用參數(shù)化的SQL語(yǔ)句,而不是直接用字符串拼接SQL,是由于以下幾點(diǎn)原因:1)用字符串拼接SQL會(huì)引入外部參數(shù)中不安全的SQL邏輯,從而受到SQL注入攻擊(請(qǐng)參考SQL注入相關(guān)資料);2)QueryBuilder內(nèi)部調(diào)用PreparedStatement處理參數(shù)化SQL,能夠有效地避免SQL注入攻擊;3)參數(shù)化SQL使得代碼具有良好的可讀性和可維護(hù)性。QueryBuilder有兩類(lèi)構(gòu)造函數(shù):1)帶一個(gè)String參數(shù),即指定的SQL語(yǔ)句;2)帶二或三個(gè)參數(shù),第一個(gè)參數(shù)為指定的參數(shù)化SQL語(yǔ)句,第二、第三個(gè)參數(shù)可以是int、long、String或者Object。通常的參數(shù)化SQL語(yǔ)句參數(shù)個(gè)數(shù)小于2個(gè),所以通常使用第二類(lèi)構(gòu)造函數(shù),直接指定參數(shù)。有的SQL語(yǔ)句參數(shù)個(gè)數(shù)大于2個(gè),則需要使用第一類(lèi)構(gòu)造函數(shù),先指定SQL語(yǔ)句,然后通過(guò)add方法設(shè)置參數(shù)。參數(shù)設(shè)置后,可以通過(guò)set方法進(jìn)行修改。QueryBuilder擁有executePagedDataTable方法,以提供分頁(yè)查詢(xún)的能力。QueryBuilder自動(dòng)針對(duì)當(dāng)前數(shù)據(jù)庫(kù)類(lèi)型形成分頁(yè)SQL語(yǔ)句,使得只有當(dāng)前頁(yè)的數(shù)據(jù)載入內(nèi)存,從而獲得良好的性能。以下是代碼示例:簡(jiǎn)單SQL查詢(xún):QueryBuilderqb=newQueryBuilder(select*fromuserwhereuserid=?,userid);DataTabledt=qb.executeDataTable();多參數(shù)SQL查詢(xún):QueryBuilderqb=newQueryBuilder(select*fromuserwhereuserid=?andaddtime=?andlastlogintime=?);qb.add(userid);qb.add(DateUtil.parse(2006-01-01);qb.add(newDate();DataTabledt=qb.executeDataTable();分頁(yè)查詢(xún):DataTabledt=newQueryBuilder(select*fromuserwhereuserid=?,userid).executePagedDataTable(15,0);刪除、修改操作:newQueryBuilder(deletefromuserwhereuserid=?,userid).executeNoQuery();批量操作:QueryBuilderqb=newQueryBuilder(updateusersetmobile=?,email=?Whereusername=?);qb.add(0086;qb.add();qb.addBatch();qb.add(0086;qb.add();qb.addBatch();qb.add(0086;qb.add();qb.addBatch();qb.executeNoQuery();/批量更新3條數(shù)據(jù),這比分別更新3條數(shù)據(jù)性能要好返回單個(gè)值:Objectcount=newQueryBuilder(selectcount(*)fromuser).executeOneValue();除了上述方法,QueryBuilder還提供了簡(jiǎn)寫(xiě)Q,以及fetch()方法。詳情請(qǐng)查閱API文檔。3.2DataTable類(lèi)通過(guò)QueryBuilder類(lèi)的executeDataTable或者executePagedDataTable方法,可以得到一個(gè)DataTable實(shí)例。DataTable是對(duì)ResultSet的封裝,提供了眾多ResultSet不具備的功能:1)不需要移動(dòng)當(dāng)前位置,直接存取任意一行數(shù)據(jù);2)直接存取任意一行的任意一列(通過(guò)列索引或列名);3)直接修改任意一行的任意一列(通過(guò)列索引或列名)的值;4)可以對(duì)DataTable的行進(jìn)行增、刪、改等操作(只在內(nèi)存中操作,以便于利用數(shù)據(jù),不反饋到數(shù)據(jù)庫(kù));5)可以對(duì)DataTable的列進(jìn)行增、刪、改等操作(只在內(nèi)存中操作,以便于利用數(shù)據(jù),不反饋到數(shù)據(jù)庫(kù));6)可以合并兩個(gè)DataTable,如果這兩個(gè)DataTable列相同的話;7)可以篩選掉不符合條件的列,得到一個(gè)新的DataTable;8)支持按Comparable排序;9)可以將所有行的某一列轉(zhuǎn)成數(shù)組;10)可以將某一行轉(zhuǎn)成以字段名為key的HashMap。以下是代碼示例:獲取值:Objectobj=dt.get(3,4);/取第4行,第5列的值,下標(biāo)從0開(kāi)始Stringstr=dt.getString(0,username);/取第1行username列的值設(shè)置值(設(shè)置的值不反饋回?cái)?shù)據(jù)庫(kù),但可以用get方法取到,以便于數(shù)據(jù)利用):dt.set(0,0,TRUE);/將第1行第1列的值設(shè)為字符串TRUEdt.set(0,username,mike);/將第1行username列的值設(shè)為mike行操作:ObjectrowValue=newObjectjohn,password,2008-01-11,4;dt.insertRow(rowValue);/在DataTable最后追加一行,各列數(shù)據(jù)按rowValue中的值依次填充dt.insertRow(rowValue,0);/在DataTable最前面插入一行dt.deleteRow(9);/刪除第10行DataRowdr=dt.getDataRow(0);/得到第1行的DataRow實(shí)例,DataRow是對(duì)一行數(shù)據(jù)的封裝Stringusername=dr.getString(username);/從dr中取username的值;dr.fill(map);/將map中的值按字段名匹配(不區(qū)分大小寫(xiě))到行的字段中dt.getDataRow(0).toMapx();/將第1行轉(zhuǎn)成Mapx列操作:dt.insertColumn(FirstName);/增加FirstName列dt.insertColumn(newDataColumn(Age,DataColumn.INTEGER);/增加Age列,類(lèi)型為intdt.deleteColumn(4);/刪除第5列dt.deleteColumn(FristName);/刪除FirstName列ObjectcolumnValues=dt.getColumnValues(0);/得到全部行的第一列的值組成的數(shù)組dt.getDataColumn(0).setColumnName(UserName);/將第一列的列名修改為UserName其他操作:dt.clone();/Cloneabledt.union(anotherDataTable);/兩個(gè)DataTable合并dt.getColCount();/返回列數(shù)dt.getRowCount();/返回行數(shù)dt.filter(newFilter()/過(guò)濾掉Age18的記錄publicbooleanfilter(Objectobj)DataRowdr=(DataRow)obj;if(Integer.parseInt(dr.getString(Age)18)returnfalse;returntrue;);dt.sort(newComparator()/按Age列排序publicintcompare(Objectobj1,Objectobj2)DataRowdr1=(DataRow)obj1;DataRowdr2=(DataRow)obj2;returnInteger.parseInt(dr1.getString(Age)-Integer.parseInt(dr2.getString(Age););4.ORM數(shù)據(jù)操作數(shù)據(jù)庫(kù)中的一張表往往對(duì)應(yīng)著一個(gè)業(yè)務(wù)實(shí)體,以數(shù)據(jù)集的方式來(lái)處理不夠便利,如果能夠?qū)?shù)據(jù)庫(kù)表以面向?qū)ο蟮姆绞竭M(jìn)行操作,則符合一般的思維模式。ZvingFramework通過(guò)解析ZDM文件格式(ZvingDataModel),自動(dòng)生成相應(yīng)的DAO類(lèi),提供了輕量級(jí)、零配置的ORM實(shí)現(xiàn)。4.1DAO的生成修改ZDM文件時(shí),開(kāi)發(fā)插件會(huì)自動(dòng)在com.zving.schema下生成DAO類(lèi)。DAO類(lèi)的名稱(chēng)和表名相同,表User則會(huì)生成User.java。除了DAO外,框架還提供了DAOSet類(lèi),調(diào)用DAO類(lèi)的query()方法可得到記錄的集合。DAO對(duì)應(yīng)表的一行記錄,表中的每個(gè)字段DAO都有對(duì)應(yīng)的Getter和Setter方法,DAOSet對(duì)應(yīng)記錄的集合。4.2DAO的使用DAO對(duì)應(yīng)著數(shù)據(jù)表中的一行完整的記錄,DAO類(lèi)提供了對(duì)記錄進(jìn)行操作的眾多方法,示例如下:取數(shù)據(jù):ZDUseruser=newZDUser();/new一個(gè)DAO實(shí)例user.setUserName(alex);/設(shè)置字段UserName的值user.fill();/根據(jù)主鍵值從數(shù)據(jù)庫(kù)中取所有字段,如果主鍵值未set,則報(bào)錯(cuò)user.getMobile();/取得Mobile字段的值user.getEmail();/取得Email字段的值插入數(shù)據(jù):ZDUseruser=newZDUser();/new一個(gè)DAO實(shí)例user.setUserName(test);user.setPassword(StringUtil.md5Hex(password);user.setMobile(0086;user.setEmail();user.setAddUser(admin);user.setAddTime(newDate();user.insert();/插入記錄到數(shù)據(jù)庫(kù);更新數(shù)據(jù):ZDUseruser=newZDUser();/new一個(gè)Schema實(shí)例user.setUserName(alex);user.setMobile(0086;user.setEmail();booleanflag=user.update();/更新用戶(hù)alex的Mobile和Email兩個(gè)字段刪除數(shù)據(jù):ZDUseruser=newZDUser();/new一個(gè)Schema實(shí)例user.setUserName(alex);booleanflag=user.delete();/刪除用戶(hù)alex其他操作:user.toDataRow();/轉(zhuǎn)換成DataRowuser.toMapx();/轉(zhuǎn)換成Mapxuser.setValue(dr);/將DataRow中的數(shù)據(jù)按字段名稱(chēng)匹配到Schema中user.setValue(map);/將Mapx中的數(shù)據(jù)按字段名稱(chēng)匹配到Schema中user.clone();/Cloneableuser.getColumnCount();/返回列數(shù)user.getV(0);/取第1個(gè)字段的值4.3DAOSet的使用DAOSet對(duì)應(yīng)著數(shù)據(jù)表中的多條記錄,DAOSet類(lèi)提供了對(duì)記錄集進(jìn)行操作的方法,示例如下:取記錄集:ZDUseruser=newZDUser();user.setAddUser(admin);DAOSetset=user.query();/查詢(xún)所有由admin添加的用戶(hù)for(inti=0;iset.size();i+)ZDUseru=set.get(i);System.out.println(u.getUserName();添加新的DAO到DAOSet中:ZDUseralex=newZDUser();alex.setUserName(alex);alex.fill();/查詢(xún)出alex的所有字段set.add(alex);/將alex加入到set中記錄集反饋回?cái)?shù)據(jù)庫(kù):set.insert();/將記錄集插入數(shù)據(jù)庫(kù)set.update();/將記錄集更新到數(shù)據(jù)庫(kù)set.delete();/從數(shù)據(jù)庫(kù)中刪除記錄集set.backup();/備份記錄集到B表set.deleteAndBackup();/刪除記錄集同時(shí)備份到B表set.deleteAndInsert();/插入記錄,插入之前先刪除己有的記錄,以避免可能的主鍵沖突其他操作:set.clear();/清空Set中的所有Schemaset.clone();/Cloneableset.toDataTable();/轉(zhuǎn)換成DataTable;set.filter(newFilter()/只要Email是hotmail郵箱的用戶(hù)publicbooleanfilter(Objectobj)ZDUserSchemauser=(ZDUserSchema)obj;if(user.getEmail().endsWith()returntrue;returnfalse;);set.sort(“UserName”);set.sort(newComparator()/按添加時(shí)間排序publicintcompare(Objectobj1,Objectobj2)ZDUseruser1=(ZDUser)obj1;ZDUseruser2=(ZDUser)obj2;returnuser1.getAddTime().compareTo(user2.getAddTime(););Dao更詳細(xì)的說(shuō)明,請(qǐng)參見(jiàn)集合DAO-DataTable。5.事務(wù)支持ZvingFramework支持傳統(tǒng)型事務(wù)和非阻塞事務(wù)兩種事務(wù)模式。5.1傳統(tǒng)型事務(wù)傳統(tǒng)型事務(wù)即JDBC本身提供的事務(wù)支持,在這種事務(wù)模式下,一開(kāi)始便打開(kāi)數(shù)據(jù)連接,然后執(zhí)行Java業(yè)務(wù)邏輯,在Java邏輯中不時(shí)執(zhí)行數(shù)據(jù)庫(kù)操作,但這些操作并不立刻改變數(shù)據(jù)庫(kù)中的數(shù)據(jù),而是等最后執(zhí)行commit動(dòng)作時(shí)才一次性寫(xiě)入數(shù)據(jù)庫(kù)。ZvingFramework針對(duì)這種類(lèi)型的事務(wù)提供了DataAccess類(lèi),代碼示例如下:DataAccessda=newDataAccess();tryda.setAutoCommit(false);da.executeNoQuery(newQueryBuilder(deletefromzduserwhereusername=test);da.insert(user);da.delete(alex);mit();da.setAutoCommit(true);catch(SQLExceptione)tryda.rollback();catch(SQLExceptione1)e1.printStackTrace();e.printStackTrace();finallytr
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 采購(gòu)專(zhuān)員崗位面試問(wèn)題及答案
- 太空站物資管理師崗位面試問(wèn)題及答案
- 湖北省十堰市張灣區(qū)東風(fēng)高中2025屆高二化學(xué)第二學(xué)期期末達(dá)標(biāo)檢測(cè)試題含解析
- 2025屆山東省煙臺(tái)市萊州市一中化學(xué)高一下期末學(xué)業(yè)水平測(cè)試試題含解析
- 供電公司計(jì)劃管理辦法
- 農(nóng)村鄉(xiāng)鎮(zhèn)街區(qū)管理辦法
- 老年護(hù)理服務(wù)優(yōu)化-洞察及研究
- 團(tuán)青志愿服務(wù)管理辦法
- 民航企業(yè)準(zhǔn)入管理辦法
- 杭州企業(yè)年金管理辦法
- 《就業(yè)指導(dǎo)與禮儀》課件
- 數(shù)學(xué)競(jìng)賽輔導(dǎo):《高中數(shù)學(xué)競(jìng)賽輔導(dǎo)班》教案
- 眼視光醫(yī)學(xué)病例解析與現(xiàn)代治療技術(shù)
- 外協(xié)件檢驗(yàn)流程
- 2025四川成都市新都區(qū)事業(yè)單位招聘歷年管理單位筆試遴選500模擬題附帶答案詳解
- 2024年國(guó)家電網(wǎng)招聘之通信類(lèi)題庫(kù)及參考答案(考試直接用)
- 甘肅省平?jīng)鍪嗅轻紖^(qū)2023-2024學(xué)年八年級(jí)下學(xué)期期末數(shù)學(xué)試題
- 廣東深圳市南山區(qū)機(jī)關(guān)事業(yè)單位面向高校畢業(yè)生招聘編外人員104人歷年重點(diǎn)基礎(chǔ)提升難、易點(diǎn)模擬試題(共500題)附帶答案詳解
- 放化療相關(guān)口腔黏膜炎預(yù)防及護(hù)理課件
- 北京市海淀區(qū)2025屆高一下生物期末檢測(cè)模擬試題含解析
- 2024四川廣元市檢察機(jī)關(guān)招聘聘用制書(shū)記員22人筆試備考題庫(kù)及答案解析
評(píng)論
0/150
提交評(píng)論