




已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
jsp中的數(shù)據(jù)庫編程 來源:網(wǎng)絡(luò)編輯 | 作者:佚名 | 時(shí)間:2009-04-05 14:07 | 瀏覽: 人次 CMS建站網(wǎng)-資源編輯組感謝謝你看這篇文章,希望看完后能給你帶來收獲,如果文章中有什么不對的地方,可以給我們指出。信息來源均來至互聯(lián)網(wǎng)和網(wǎng)友投稿.Java數(shù)據(jù)庫連接(JDBC)由一組用Java編程語言編寫的類和接口組成。JDBC為工具/數(shù)據(jù)庫開發(fā)人員提供了一個(gè)標(biāo)準(zhǔn)的API,使他們能夠用純JavaAPI來編寫數(shù)據(jù)庫應(yīng)用程序。然而各個(gè)開發(fā)商的接口并不完全相同,所以開發(fā)環(huán)境的變化會帶來一定的配置變化。本文主要集合了不同數(shù)據(jù)庫的連接方式。 一、連接各種數(shù)據(jù)庫方式速查表 下面羅列了各種數(shù)據(jù)庫使用JDBC連接的方式,可以作為一個(gè)手冊使用。 1、Oracle8/8i/9i數(shù)據(jù)庫(thin模式) Class.forName(oracle.jdbc.driver.OracleDriver).newInstance(); Stringurl=jdbc:oracle:thin:localhost:1521:orcl;/orcl為數(shù)據(jù)庫的SID Stringuser=test; Stringpassword=test; Connectionconn=DriverManager.getConnection(url,user,password); 2、DB2數(shù)據(jù)庫 Class.forName(com.ibm.db2.jdbc.app.DB2Driver).newInstance(); Stringurl=jdbc:db2:/localhost:5000/sample;/sample為你的數(shù)據(jù)庫名 Stringuser=admin; Stringpassword=; Connectionconn=DriverManager.getConnection(url,user,password); 3、SqlServer7.0/2000數(shù)據(jù)庫 Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver).newInstance(); Stringurl=jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=mydb; /mydb為數(shù)據(jù)庫 Stringuser=sa; Stringpassword=; Connectionconn=DriverManager.getConnection(url,user,password); 4、Sybase數(shù)據(jù)庫 Class.forName(com.sybase.jdbc.SybDriver).newInstance(); Stringurl=jdbc:sybase:Tds:localhost:5007/myDB;/myDB為你的數(shù)據(jù)庫名 PropertiessysProps=System.getProperties(); SysProps.put(user,userid); SysProps.put(password,user_password); Connectionconn=DriverManager.getConnection(url,SysProps); 5、Informix數(shù)據(jù)庫 Class.forName(rmix.jdbc.IfxDriver).newInstance(); Stringurl=jdbc:informix-sqli:/9:1533/myDB:INFORMIXSERVER=myserver; user=testuser;password=testpassword;/myDB為數(shù)據(jù)庫名 Connectionconn=DriverManager.getConnection(url); 6、MySQL數(shù)據(jù)庫 Class.forName(org.gjt.mm.mysql.Driver).newInstance(); Stringurl=jdbc:mysql:/localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1 /myDB為數(shù)據(jù)庫名 Connectionconn=DriverManager.getConnection(url); 7、PostgreSQL數(shù)據(jù)庫 Class.forName(org.postgresql.Driver).newInstance(); Stringurl=jdbc:postgresql:/localhost/myDB/myDB為數(shù)據(jù)庫名 Stringuser=myuser; Stringpassword=mypassword; Connectionconn=DriverManager.getConnection(url,user,password); 8、access數(shù)據(jù)庫直連用ODBC的 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); Stringurl=jdbc:odbc:Driver=MicroSoftAccessDriver(*.mdb);DBQ=+application.getRealPath(/Data/ReportDemo.mdb); Connectionconn=DriverManager.getConnection(url,); StatementstmtNew=conn.createStatement(); 二、JDBC連接MySql方式 下面是使用JDBC連接MySql的一個(gè)小的教程 1、查找驅(qū)動程序 MySQL目前提供的java驅(qū)動程序?yàn)镃onnection/J,可以從MySQL官方網(wǎng)站下載,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驅(qū)動程序?yàn)榧僯ava驅(qū)動程序,不需做其他配置。 2、動態(tài)指定classpath 如果需要執(zhí)行時(shí)動態(tài)指定classpath,就在執(zhí)行時(shí)采用cp方式。否則將上面的.jar文件加入到classpath環(huán)境變量中。 3、加載驅(qū)動程序 try Class.forName(com.mysql.jdbc.Driver); System.out.println(SuccessloadingMysqlDriver!); catch(Exceptione) System.out.println(ErrorloadingMysqlDriver!); e.printStackTrace(); 4、設(shè)置連接的url jdbc:mysql:/localhost/databasename?pa=vapa=va 三、以下列出了在使用JDBC來連接Oracle數(shù)據(jù)庫時(shí)可以使用的一些技巧 這些技巧能夠使我們更好地發(fā)揮系統(tǒng)的性能和實(shí)現(xiàn)更多的功能。 1、在客戶端軟件開發(fā)中使用Thin驅(qū)動程序 在開發(fā)Java軟件方面,Oracle的數(shù)據(jù)庫提供了四種類型的驅(qū)動程序,二種用于應(yīng)用軟件、applets、servlets等客戶端軟件,另外二種用于數(shù)據(jù)庫中的Java存儲過程等服務(wù)器端軟件。在客戶機(jī)端軟件的開發(fā)中,我們可以選擇OCI驅(qū)動程序或Thin驅(qū)動程序。OCI驅(qū)動程序利用Java本地化接口(JNI),通過Oracle客戶端軟件與數(shù)據(jù)庫進(jìn)行通訊。Thin驅(qū)動程序是純Java驅(qū)動程序,它直接與數(shù)據(jù)庫進(jìn)行通訊。為了獲得最高的性能,Oracle建議在客戶端軟件的開發(fā)中使用OCI驅(qū)動程序,這似乎是正確的。但我建議使用Thin驅(qū)動程序,因?yàn)橥ㄟ^多次測試發(fā)現(xiàn),在通常情況下,Thin驅(qū)動程序的性能都超過了OCI驅(qū)動程序。 2、關(guān)閉自動提交功能,提高系統(tǒng)性能 在第一次建立與數(shù)據(jù)庫的連接時(shí),在缺省情況下,連接是在自動提交模式下的。為了獲得更好的性能,可以通過調(diào)用帶布爾值false參數(shù)的Connection類的setAutoCommit()方法關(guān)閉自動提交功能,如下所示: conn.setAutoCommit(false); 值得注意的是,一旦關(guān)閉了自動提交功能,我們就需要通過調(diào)用Connection類的commit()和rollback()方法來人工的方式對事務(wù)進(jìn)行管理。 3、在動態(tài)SQL或有時(shí)間限制的命令中使用Statement對象 在執(zhí)行SQL命令時(shí),我們有二種選擇:可以使用PreparedStatement對象,也可以使用Statement對象。無論多少次地使用同一個(gè)SQL命令,PreparedStatement都只對它解析和編譯一次。當(dāng)使用Statement對象時(shí),每次執(zhí)行一個(gè)SQL命令時(shí),都會對它進(jìn)行解析和編譯。這可能會使你認(rèn)為,使用PreparedStatement對象比使用Statement對象的速度更快。然而,我進(jìn)行的測試表明,在客戶端軟件中,情況并非如此。因此,在有時(shí)間限制的SQL操作中,除非成批地處理SQL命令,我們應(yīng)當(dāng)考慮使用Statement對象。 此外,使用Statement對象也使得編寫動態(tài)SQL命令更加簡單,因?yàn)槲覀兛梢詫⒆址B接在一起,建立一個(gè)有效的SQL命令。因此,我認(rèn)為,Statement對象可以使動態(tài)SQL命令的創(chuàng)建和執(zhí)行變得更加簡單。 4、利用helper函數(shù)對動態(tài)SQL命令進(jìn)行格式化 在創(chuàng)建使用Statement對象執(zhí)行的動態(tài)SQL命令時(shí),我們需要處理一些格式化方面的問題。例如,如果我們想創(chuàng)建一個(gè)將名字OReilly插入表中的SQL命令,則必須使用二個(gè)相連的“”號替換OReilly中的“”號。完成這些工作的最好的方法是創(chuàng)建一個(gè)完成替換操作的helper方法,然后在連接字符串心服用公式表達(dá)一個(gè)SQL命令時(shí),使用創(chuàng)建的helper方法。與此類似的是,我們可以讓helper方法接受一個(gè)Date型的值,然后讓它輸出基于Oracle的to_date()函數(shù)的字符串表達(dá)式。 5、利用PreparedStatement對象提高數(shù)據(jù)庫的總體效率 在使用PreparedStatement對象執(zhí)行SQL命令時(shí),命令被數(shù)據(jù)庫進(jìn)行解析和編譯,然后被放到命令緩沖區(qū)。然后,每當(dāng)執(zhí)行同一個(gè)PreparedStatement對象時(shí),它就會被再解析一次,但不會被再次編譯。在緩沖區(qū)中可以發(fā)現(xiàn)預(yù)編譯的命令,并且可以重新使用。在有大量用戶的企業(yè)級應(yīng)用軟件中,經(jīng)常會重復(fù)執(zhí)行相同的SQL命令,使用PreparedStatement對象帶來的編譯次數(shù)的減少能夠提高數(shù)據(jù)庫的總體性能。如果不是在客戶端創(chuàng)建、預(yù)備、執(zhí)行PreparedStatement任務(wù)需要的時(shí)間長于Statement任務(wù),我會建議在除動態(tài)SQL命令之外的所有情況下使用PreparedStatement對象。 6、在成批處理重復(fù)的插入或更新操作中使用PreparedStatement對象 如果成批地處理插入和更新操作,就能夠顯著地減少它們所需要的時(shí)間。Oracle提供的Statement和CallableStatement并不真正地支持批處理,只有PreparedStatement對象才真正地支持批處理。我們可以使用addBatch()和executeBatch()方法選擇標(biāo)準(zhǔn)的JDBC批處理,或者通過利用PreparedStatement對象的setExecuteBatch()方法和標(biāo)準(zhǔn)的executeUpdate()方法選擇速度更快的Oracle專有的方法。要使用Oracle專有的批處理機(jī)制,可以以如下所示的方式調(diào)用setExecuteBatch(): PreparedStatementpstmt3Dnull; try (OraclePreparedStatement)pstmt).setExecuteBatch(30); . pstmt.executeUpdate(); 調(diào)用setExecuteBatch()時(shí)指定的值是一個(gè)上限,當(dāng)達(dá)到該值時(shí),就會自動地引發(fā)SQL命令執(zhí)行,標(biāo)準(zhǔn)的executeUpdate()方法就會被作為批處理送到數(shù)據(jù)庫中。我們可以通過調(diào)用PreparedStatement類的sendBatch()方法隨時(shí)傳輸批處理任務(wù)。 7、使用Oraclelocator方法插入、更新大對象(LOB) Oracle的PreparedStatement類不完全支持BLOB和CLOB等大對象的處理,尤其是Thin驅(qū)動程序不支持利用PreparedStatement對象的setObject()和setBinaryStream()方法設(shè)置BLOB的值,也不支持利用setCharacterStream()方法設(shè)置CLOB的值。只有l(wèi)ocator本身中的方法才能夠從數(shù)據(jù)庫中獲取LOB類型的值??梢允褂肞reparedStatement對象插入或更新LOB,但需要使用locator才能獲取LOB的值。由于存在這二個(gè)問題,因此,我建議使用locator的方法來插入、更新或獲取LOB的值。 8、使用SQL92語法調(diào)用存儲過程 在調(diào)用存儲過程時(shí),我們可以使用SQL92或OraclePL/SQL,由于使用OraclePL/SQL并沒有什么實(shí)際的好處,而且會給以后維護(hù)你的應(yīng)用程序的開發(fā)人員帶來麻煩,因此,我建議在調(diào)用存儲過程時(shí)使用SQL92。 9、使用ObjectSQL將對象模式轉(zhuǎn)移到數(shù)據(jù)庫中 既然可以將Oracle的數(shù)據(jù)庫作為一種面向?qū)ο蟮臄?shù)據(jù)庫來使用,就可以考慮將應(yīng)用程序中的面向?qū)ο竽J睫D(zhuǎn)到數(shù)據(jù)庫中。目前的方法是創(chuàng)建Javabean作為偽裝的數(shù)據(jù)庫對象,將它們的屬性映射到關(guān)系表中,然后在這些bean中添加方法。盡管這樣作在Java中沒有什么問題,但由于操作都是在數(shù)據(jù)庫之外進(jìn)行的,因此其他訪問數(shù)據(jù)庫的應(yīng)用軟件無法利用對象模式。如果利用Oracle的面向?qū)ο蟮募夹g(shù),可以通過創(chuàng)建一個(gè)新的數(shù)據(jù)庫對象類型在數(shù)據(jù)庫中模仿其數(shù)據(jù)和操作,然后使用JPublisher等工具生成自己的Javabean類。如果使用這種方式,不但Java應(yīng)用程序可以使用應(yīng)用軟件的對象模式,其他需要共享你的應(yīng)用中的數(shù)據(jù)和操作的應(yīng)用軟件也可以使用應(yīng)用軟件中的對象模式。 10、利用SQL完成數(shù)據(jù)庫內(nèi)的操作 我要向大家介紹的最重要的經(jīng)驗(yàn)是充分利用SQL的面向集合的方法來解決數(shù)據(jù)庫處理需求,而不是使用Java等過程化的編程語言。 如果編程人員要在一個(gè)表中查找許多行,結(jié)果中的每個(gè)行都會查找其他表中的數(shù)據(jù),最后,編程人員創(chuàng)建了獨(dú)立的UPDATE命令來成批地更新第一個(gè)表中的數(shù)據(jù)。與此類似的任務(wù)可以通過在set子句中使用多列子查詢而在一個(gè)UPDATE命令中完成。當(dāng)能夠在單一的SQL命令中完成任務(wù),何必要讓數(shù)據(jù)在網(wǎng)上流來流去的?我建議用戶認(rèn)真學(xué)習(xí)如何最大限度地發(fā)揮SQL的功能。Statement stmt=con.getStatement(游標(biāo)類型, 記錄更新權(quán)限);游標(biāo)類型:ResultSet.TYPE_FORWORD_ONLY:只可以向前移動ResultSet.TYPE_SCROLL_INSENSITIVE:可卷動。但是不受其他用戶對數(shù)據(jù)庫更改的影響。ResultSet.TYPE_SCROLL_SENSITIVE:可卷動。當(dāng)其他用戶更改數(shù)據(jù)庫時(shí)這個(gè)記錄也會改變。記錄更新權(quán)限:ResultSet.CONCUR_READ_ONLY,只讀ResultSet.CONCUR_UPDATABLE,可更新 getStatement()缺省參數(shù):getStatement(ResultSet.TYPE_FORWORD_ONLY, ResultSet.CONCUR_READ_ONLY)2,如果ResultSet是可卷動的,以下函數(shù)可以使用:rs.absolute()/絕對位置,負(fù)數(shù)表示從后面數(shù)rs.first()第一條rs.last()最后一條rs.previoust()前一條rs.next()后一條rs.beforeFirst()第一條之前rs.afterLast()最后之后rs.isFirst(),rs.isLast(),rs.isBeforeFirst(),rs.isAfterLast注意,剛打開的時(shí)候是處于第一條記錄之前的六,更新數(shù)據(jù)庫1,stmt.executeUpdate(strSql),strSql是一條sql更新語句。update,insert,delete返回影響到的條數(shù)2,stmt.execute()方法在不知道sql語句是查詢還是更新的時(shí)候用。如果產(chǎn)生一條以上的對象時(shí),返回true,此時(shí)可用 stmt.getResultSet()和stmt.getUpdateCount()來獲取execute結(jié)果,如果不返回ResultSet對象則返回false.3,除了Statement的executeUpdate之外還可以用ResultSet:rs.updateInt(1,10);rs.updateString(2,sfafd);rs.updateRow();七,使用預(yù)編譯PreparedStatementPreparedStatement對象和Statement對象類似,都可以用來執(zhí)行SQL語句。不同在于,數(shù)據(jù)庫會對PreparedStatement的SQL語句進(jìn)行預(yù)編譯,而且仍舊能輸入?yún)?shù)并重復(fù)執(zhí)行編譯好的查詢速度比未編譯的要快。PreparedStatement stmt=con.preparedStatement(Insert Into users(userid, username) values(?,?);stmt.clearParameters();stmt.setInt(1,2);stmt.setString(2,Big);stmt.executeUpdate();八,執(zhí)行存儲過程1,JDBC調(diào)用存儲過程,并使用存儲過程的返回值。這樣可以將處理工作分為服務(wù)端和客戶端兩部分,并大大加快系統(tǒng)的設(shè)計(jì)和開發(fā)的時(shí)間。比如可以重復(fù)使用服務(wù)器上的組件。使用存儲過程之后大量諸計(jì)算工作可以交給數(shù)據(jù)庫服務(wù)器來處理,這將降低Web服務(wù)器的負(fù)載,從而提高整個(gè)系統(tǒng)的性能。2,有兩個(gè)表UserMainUserID,UserName,UserType,UserRefBrefID, UserID, UserBrief下面的存儲過程可以接受jdbc傳來的參數(shù),新增內(nèi)容到UserMain和UserRef,并輸出一個(gè)OutUserID.CREATE PROCEDURE ap_adduser(OutUserID int output, /此為輸出參數(shù),output標(biāo)記UserName varchar(25), /參數(shù)表示方法:XXX為變量名,變量名 類型 outputUserType tinyint,UserBrief varchar(255),)ASDeclare UserID int /定義局部變量insert into UserMain(UserName, UserType)values(UserName,UserType)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第一次學(xué)騎自行車的經(jīng)歷記作文(12篇)
- 2025年電子商務(wù)師(高級)電子商務(wù)數(shù)據(jù)分析工具與應(yīng)用技能鑒定試卷
- 2025年電梯安裝改造維修作業(yè)特種作業(yè)操作證考試試卷(電梯安裝改造施工質(zhì)量控制難點(diǎn)攻克篇)
- 2025年保育員(一級)兒童教育政治學(xué)研究方法實(shí)驗(yàn)考試試卷
- 2025年消防安全知識培訓(xùn)考試題庫:消防法律法規(guī)精解消防安全培訓(xùn)評估報(bào)告試題
- 2025年春季煙花爆竹安全作業(yè)操作證考試試卷(安全操作規(guī)范應(yīng)用與培訓(xùn))
- 2025年壓痕機(jī)項(xiàng)目規(guī)劃申請報(bào)告
- 語文課本中的一處美景寫景作文(12篇)
- 中考道德與法治二輪復(fù)習(xí) 熱點(diǎn)專題:捍衛(wèi)國家利益維護(hù)國家安全 課件
- 正式工作履歷及崗位證明函(7篇)
- 石英晶體諧振器培訓(xùn)資料
- 醫(yī)療衛(wèi)生機(jī)構(gòu)6S常態(tài)化管理打分表
- 幾種常用潛流人工濕地剖面圖
- 先進(jìn)成圖技術(shù)教與學(xué)智慧樹知到課后章節(jié)答案2023年下青島濱海學(xué)院
- 初級會計(jì)師考試 經(jīng)濟(jì)法基礎(chǔ)課件
- 稀土生產(chǎn)工藝流程圖礦的開采技術(shù)
- (15.1.1)-緒論2思想政治教育概念的歷史演變
- 高速鐵路接觸網(wǎng)壓接式電連接安裝工法CREC-01-2018-60
- 上海交通大學(xué)畢業(yè)生思想政治品德情況表
- 人教版(2023版)初中語文九年級上冊全冊同步練習(xí)+單元綜合訓(xùn)練+專項(xiàng)訓(xùn)練+期中期未測試合集(含答案)【可編輯可打印】
- 23秋國家開放大學(xué)《EXCEL在財(cái)務(wù)中的應(yīng)用》形考作業(yè)1-4參考答案
評論
0/150
提交評論