




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第2章 JDBC 主要內(nèi)容JDBC簡(jiǎn)介JDBC操作運(yùn)用PreparedStatement事務(wù)運(yùn)用銜接池訪問數(shù)據(jù)庫(kù)2JDBC 簡(jiǎn)介JDBC中主要接口 java.sql.DriverManager:處置驅(qū)動(dòng)程序的調(diào)入和管理java.sql.Connection:擔(dān)任銜接數(shù)據(jù)庫(kù) java.sql.Statement:擔(dān)任執(zhí)行數(shù)據(jù)庫(kù) SQL 語(yǔ)句 java.sql.ResultSet:擔(dān)任存放查詢結(jié)果3JDBC 簡(jiǎn)介針對(duì)不同類型的數(shù)據(jù)庫(kù),JDBC 機(jī)制中提供了驅(qū)動(dòng)程序的的概念。對(duì)于不同的數(shù)據(jù)庫(kù),程序只需求運(yùn)用不同的驅(qū)動(dòng)廠商驅(qū)動(dòng)銜接數(shù)據(jù)庫(kù)4運(yùn)用廠商驅(qū)動(dòng)進(jìn)展數(shù)據(jù)庫(kù)銜接常見數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序稱號(hào)和 url 如
2、下 MS SQL Server:驅(qū)動(dòng)程序?yàn)椋篶om.microsoft.jdbc.sqlserver.SQLServerDriver, url 為:jdbc:microsoft:sqlserverIP:1433;DatabaseName=DBName5運(yùn)用廠商驅(qū)動(dòng)進(jìn)展數(shù)據(jù)庫(kù)銜接 Oracle :驅(qū) 動(dòng) 程 序 為 : oracle.jdbc.driver.OracleDriver , url 為 : jdbc:oracle:thin:ip:1521:sid6運(yùn)用廠商驅(qū)動(dòng)進(jìn)展數(shù)據(jù)庫(kù)銜接 MySQL : 驅(qū) 動(dòng) 程 序 為 : “ com.mysql.jdbc.Driver , url 為 : j
3、dbc:mysqllocalhost:3306/DBName7JDBC操作裝載數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序Class.forName(“com.mysql.jdbc.Driver);建立與數(shù)據(jù)庫(kù)的銜接Connection conn= DriverManager.getConnection(url, 用戶名, 密碼);例如: String url=jdbc:mysqllocalhost:3306/school;不同DBMS系統(tǒng)有不同的驅(qū)動(dòng)稱號(hào)不同DBMS系統(tǒng)有不同銜接串.8建立Statement 對(duì)象,預(yù)備執(zhí)行SQL語(yǔ)句Statement stmt = conn.createStatement();
4、執(zhí)行SQL語(yǔ)句常用3種執(zhí)行SQL語(yǔ)句的方法:1) executeQuery()-用于Select語(yǔ)句,前往結(jié)果集.String sql=“select * from 表名;ResultSet rs= stmt.executeQuery(sql); 2) executeUpdate()-用于創(chuàng)建和更新表(如Update/Insert/ Delete/Create),前往受影響行數(shù).String sql=“Delete from 表名 where ;int rsCount = stmt.executeUpdate(sql); 3) execute()-用于執(zhí)行任何SQL語(yǔ)句前往布爾值。9處置Res
5、ultSet結(jié)果集 while(rs.next() String s1=rs.getString(1); /根據(jù)列號(hào)取值(從1開場(chǎng)) 或 String s2=rs.getString(“name); /根據(jù)列名取值 或 int col3=rs.getInt(3); /非字符串?dāng)?shù)據(jù)例如依次封鎖ResultSet、Statement和Connection對(duì)象:rs.close(); stmt.close(); conn.close();前提:第1列為字符串?dāng)?shù)據(jù)前提:第3列為整形數(shù)據(jù)10JSP銜接MySQL例如% String url =jdbc:mysqllocalhost:3306/school
6、; /數(shù)據(jù)庫(kù)銜接字符串 Class.forName( com.mysql.jdbc.Driver ); /加載驅(qū)動(dòng)程序 Connection conn= DriverManager.getConnection(url,root,dba); /建立銜接 Statement stmt=conn.createStatement(); /創(chuàng)建SQL容器 String sql=select * from teacher; /表為teacher ResultSet rs=stmt.executeQuery(sql); /獲得結(jié)果集 while( rs.next() ) /處置結(jié)果集 out.print(r
7、s.getString(id)+ ); out.print(rs.getString(name)+ ); out.print(rs.getString(address)+ ); out.print(rs.getString(year)+); /封鎖 rs.close(); stmt.close(); conn.close(); %數(shù)據(jù)庫(kù)名11效力器中數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序部署mysql的驅(qū)動(dòng)程序mysql-connector-java-5.*-bin.jar存放位置:tomcat%TOMCAT_HOME%lib 或%TOMCAT_HOME%commonlib目錄jboss%JBOSS_HOME%ser
8、verdefaultlib目錄weblogicbeauser_projectsdomainsbase_domainlib目錄12運(yùn)用 PreparedStatement引出 以添加數(shù)據(jù)為例,在很多情況下,詳細(xì)需求添加的值,是由客戶本人輸入的,因此,應(yīng)該是一個(gè)個(gè)變量。該情況下,SQL 語(yǔ)句的寫法就比較費(fèi)事 ,而且依賴了變量,比較容易出錯(cuò)PreparedStatement 處理了這個(gè)問題 13 帶參數(shù)的操作int id=Integer.parseInt(request.getParameter(id);String name=request.getParameter(name);String ad
9、dress=request.getParameter(address);String year=request.getParameter(year);String sql=insert into teacher values(+id+,+name+,+address+,+year+); int rowCount=stmt.executeUpdate(sql); 很不方便14運(yùn)用 PreparedStatementPreparedStatement 是 Statement 的子接口,功能與 Statement 類似 它在 sql 語(yǔ)句中運(yùn)用了?替代了需求插入的參數(shù) 用 PreperedState
10、ment 的 setString(n,參數(shù))方法可以將第 n 個(gè)?用傳進(jìn)的參數(shù)替代。這樣做添加了程序的可維護(hù)性,也添加了程序的平安性15根本用法例如運(yùn)用參數(shù):String sql=select * from 表 where 字段=?;PreparedStatement pStmt = conn.prepareStatement(sql); 設(shè)置參數(shù)值:String parm1=request.getParameter(參數(shù)名);pStmt.setString(1, parm1);執(zhí)行帶參數(shù)的SQL:ResultSet rs= pStmt.executeQuery( ); 問號(hào)作為參數(shù)占位符假設(shè)
11、是int,那么用setInt()等等?參數(shù)的序號(hào)從1開場(chǎng)不用再帶參數(shù)要帶參數(shù)參數(shù)類型要一致也是三種方法:executeQuery()、executeUpdate()和execute()16事務(wù)在銀行轉(zhuǎn)賬時(shí),要對(duì)數(shù)據(jù)庫(kù)進(jìn)展兩個(gè)操作,即將一個(gè)賬戶的錢減少,將另一個(gè)賬戶的錢增多。但是由于操作的先后順序,假設(shè)在兩個(gè)操作之間發(fā)生缺點(diǎn),那么會(huì)導(dǎo)致數(shù)據(jù)不一致。因此,需求設(shè)計(jì)一個(gè)事務(wù),在兩條語(yǔ)句都被執(zhí)行勝利后,數(shù)據(jù)修正才被真正提交(Commit)放入數(shù)據(jù)庫(kù),否那么數(shù)據(jù)操作回滾(Rollback)17事務(wù)在默許情況下,executeUpdate 函數(shù)會(huì)在數(shù)據(jù)庫(kù)中提交改動(dòng)的結(jié)果,此時(shí),可以用 Connection
12、 來定義該函數(shù)能否自動(dòng)提交改動(dòng)結(jié)果,并進(jìn)展事務(wù)的提交或者回滾Connection 中可以設(shè)置 executeUpdate 不要自動(dòng)提交18JDBC事務(wù)管理Connection類的3個(gè)控制事務(wù)的方法:setAutoCommit(boolean autoCommit):commit():rollback():JDBC API中默許:每條更新語(yǔ)句是一項(xiàng)事務(wù),是自動(dòng)提交事務(wù)19手工管理事務(wù)trycon=DriverManager.getConnection(dburl,dbuser,dbpassword); con.setAutoCommit(false); stmt=con.createStatem
13、ent(); stmt.executeUpdate(sql1); stmt.executeUpdate(sql2); conmit();catch(SQLException e) e.printStackTrace(); trycon.rollback(); catch(SQLException ex)System.out.println(“回滾失敗); finally trystmt.close();con.close() catch(SQLException e) System.out.println(“封鎖資源失敗) 20運(yùn)用銜接池訪問數(shù)據(jù)庫(kù)在實(shí)踐運(yùn)用開發(fā)中,運(yùn)用 JDBC 直接訪問數(shù)據(jù)
14、庫(kù)中的數(shù)據(jù),每一次數(shù)據(jù)訪問懇求,都必 須閱歷建立數(shù)據(jù)庫(kù)銜接、翻開數(shù)據(jù)庫(kù)、存取數(shù)據(jù)和封鎖數(shù)據(jù)庫(kù)銜接等步驟,而銜接數(shù)據(jù)庫(kù)是 一件既耗費(fèi)資源又費(fèi)時(shí)的任務(wù),假設(shè)頻繁發(fā)生,系統(tǒng)的性能必然會(huì)急劇下降。數(shù)據(jù)庫(kù)銜接池技術(shù)是處理這個(gè)問題最常用的方法21運(yùn)用銜接池訪問數(shù)據(jù)庫(kù)銜接池的作用銜接池是創(chuàng)建和管理數(shù)據(jù)庫(kù)銜接的緩沖池技術(shù),由于不處置事務(wù)時(shí),數(shù)據(jù)庫(kù)銜接會(huì)閑置,因此,將其很好地管理起來,讓閑置的銜接被其它需求的線程運(yùn)用,可以提高系統(tǒng)性能22運(yùn)用銜接池訪問數(shù)據(jù)庫(kù)銜接池的任務(wù)原理當(dāng)一個(gè)線程需求用 JDBC 對(duì)數(shù)據(jù)庫(kù)操作時(shí),它從池中懇求一個(gè)銜接。當(dāng)這個(gè)線程運(yùn)用完了這個(gè)銜接,將其前往到銜接池中,這樣就可以被其它想運(yùn)用該銜
15、接的線程運(yùn)用23運(yùn)用銜接池訪問數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)銜接池的主要操作如下: 效力器建立數(shù)據(jù)庫(kù)銜接池對(duì)象按照事先指定的參數(shù)創(chuàng)建初始數(shù)量的數(shù)據(jù)庫(kù)銜接,放入池中24運(yùn)用銜接池訪問數(shù)據(jù)庫(kù)對(duì)于一個(gè)數(shù)據(jù)庫(kù)訪問懇求,直接從銜接池中得到一個(gè)銜接。假設(shè)數(shù)據(jù)庫(kù)銜接池對(duì)象中沒有空閑的銜接,且銜接數(shù)沒有到達(dá)最大,那么創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)銜接存取數(shù)據(jù)封鎖數(shù)據(jù)25Tomcat數(shù)據(jù)源的配置tomcat的server.xml里參與:$TOMCAT_HOME/conf/server.xml,在前加上26DataSourceDataSource接口代表了數(shù)據(jù)源,它是一個(gè)用于產(chǎn)生數(shù)據(jù)銜接的工廠。getConnection() : 獲得一個(gè)Connection對(duì)象;getLogWriter(PrintWriter out):獲得DataSource的Log WritergetLoginTimeout(): 獲得DataSource嘗試銜接數(shù)據(jù)庫(kù)的最大時(shí)間。27運(yùn)用銜接池訪問數(shù)據(jù)庫(kù)/初始化Context,運(yùn)用InitialContext初始化ContextContext ctx=new Initi
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年環(huán)境檢測(cè)與評(píng)估技能考試題及答案
- 導(dǎo)游業(yè)務(wù)試題及答案電大
- 時(shí)鐘測(cè)試題目大全圖片及答案
- float面試題及答案
- 三體名著試題及答案
- 焊接加工考試題及答案
- 2025年歷史文化與博物館管理考試試題及答案
- 借款咨詢服務(wù)協(xié)議書
- 機(jī)電工程決策支持試題及答案
- 軟件設(shè)計(jì)師考試學(xué)習(xí)策略分享試題及答案
- 干部履歷表填寫范本(中共中央組織部1999年)
- 勞動(dòng)教育視角下高職院校學(xué)生工匠精神培育研究
- 最簡(jiǎn)單封陽(yáng)臺(tái)安全免責(zé)協(xié)議書
- SH/T 3533-2024 石油化工給水排水管道工程施工及驗(yàn)收規(guī)范(正式版)
- 用友人力資源管理HR解決方案樣本
- 北京市西城區(qū)三帆中學(xué)2023-2024學(xué)年七年級(jí)下學(xué)期期中數(shù)學(xué)試題(無(wú)答案)
- 藥物殘留溶劑分析報(bào)告書
- 腫瘤醫(yī)院推廣方案
- 動(dòng)物出血性肺炎預(yù)防與治療
- 公路工程安全風(fēng)險(xiǎn)辨識(shí)與防控手冊(cè)
- 研究生開題報(bào)告評(píng)審表
評(píng)論
0/150
提交評(píng)論