《《數(shù)據(jù)庫連接》PPT課件》由會員分享,可在線閱讀,更多相關(guān)《《數(shù)據(jù)庫連接》PPT課件(40頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、第六章 JSP中數(shù)據(jù)庫的使用主 講:曹 瑩 重點(diǎn)+難點(diǎn)l數(shù)據(jù)庫環(huán)境的配置l利用JDBC驅(qū)動實(shí)現(xiàn)對數(shù)據(jù)庫的訪問 6.1 數(shù)據(jù)庫和常用的SQL語句l數(shù)據(jù)庫管理系統(tǒng)(DBMS)是一個(gè)軟件系統(tǒng),它具有存儲、檢索和修改數(shù)據(jù)的功能,數(shù)據(jù)庫關(guān)聯(lián)系統(tǒng)具有4個(gè)發(fā)展階段。層次型、網(wǎng)絡(luò)型、關(guān)系型和關(guān)系對象型。l我們使用的是SQL Server2000,mysqllJDBC是Sun公司提供的一組類和接口,程序員可以利用這組類和接口與數(shù)據(jù)庫進(jìn)行通信。JDBC接口,非常方便的實(shí)現(xiàn)了在java中連接數(shù)據(jù)庫 SQL語句l創(chuàng)建刪除數(shù)據(jù)庫create database bookdrop database bookl創(chuàng)建刪除表cr
2、eate table item (item_Id int, item_name varchar(20)drop table iteml更改表的結(jié)構(gòu)alter table item add item_dis varchar(100)alter table item drop item SQL語句l創(chuàng)建刪除視圖create view products(productname,quantity,listprice) as select p.productname,v.qty,i.listprice from product p,inventory v,item i where p.productId
3、=i.productid and itwmid=v.itemiddelete view productsl插入一條語句insert語句是用來向表中添加記錄的insert into item values(1,“計(jì)算機(jī)”,“計(jì)算機(jī)工程類的書籍”) SQL語句l在表中刪除數(shù)據(jù)delete刪除表中已經(jīng)存在的一條或多條記錄delete from item where item_Id=1;l更新表中的數(shù)據(jù)update語句用來修改表中已經(jīng)存在的一條或多條記錄update item set intem_name=“法學(xué)” where item_Id=1 SQL語句l條件子句(1)where語句使用where
4、可以選擇滿足條件的特定記錄(2)in和not in選擇列值與列值表中某一個(gè)值相等的相關(guān)信息(3)betweenand和not betweenand選擇列值在某個(gè)范圍的記錄(4)like和not like(5)is null和not null(6)邏輯運(yùn)算and和or(7)order by語句 6.2 JDBC技術(shù)和驅(qū)動程序6.2.1JDBC技術(shù)介紹lJDBC API為Java開發(fā)人員使用數(shù)據(jù)庫提供了統(tǒng)一的編程接口,它由一組Java類和接口組成。JDBC API使得開發(fā)人員可與使用純Java語言的方式來連接數(shù)據(jù)庫,并進(jìn)行操作。l企業(yè)級環(huán)境中進(jìn)行的數(shù)據(jù)庫操作遠(yuǎn)遠(yuǎn)不只是 連接數(shù)據(jù)庫并執(zhí)行語句,還需要
5、考慮其它方面的要求。包括使用連接緩沖池來優(yōu)化資源的使用,實(shí)現(xiàn)分布式事務(wù)處理。 JDBC 3.0 版本包含了兩個(gè)包:Java.sql和Javax.sqllJava.sql 這個(gè)包中的類和接口主要是針對基本的數(shù)據(jù)庫編程服務(wù),如生成連接、執(zhí)行語句、以及準(zhǔn)備語句和運(yùn)行批處理查詢等。同時(shí)也有一些 高級操作,比如批處理更新、事物隔離和可滾動結(jié)果集等。lJavax.sql 這個(gè)包主要是為數(shù)據(jù)庫方面的高級操作提供接口和類。如連接管理類、創(chuàng)建語句類 6.2.2數(shù)據(jù)庫驅(qū)動器程序l數(shù)據(jù)庫廠商一般會提供一組API訪問數(shù)據(jù)庫,有些廠商也專門提供數(shù)據(jù)庫驅(qū)動程序,并且這些產(chǎn)品除了執(zhí)行驅(qū)動的功能外,往往還提供一些額外的服務(wù)。
6、lJDBC驅(qū)動程序是數(shù)據(jù)庫廠商根據(jù)Sun公司提供的JDBC接口標(biāo)準(zhǔn)提供的一組實(shí)現(xiàn)類。JDBC 驅(qū)動程序的類型 JDBC-ODBC橋驅(qū)動程序及ODBC驅(qū)動程序 本地API部分Java驅(qū)動程序 JDBC-Net 純Java驅(qū)動程序 本地協(xié)議純Java驅(qū)動程序 有4種類型的數(shù)據(jù)庫驅(qū)動程序lJDBC-ODBC橋 通過JDBC-ODBC橋,開發(fā)者可以使用JDBC訪問一個(gè)ODBC數(shù)據(jù)源。 JDBC-ODBC橋驅(qū)動程序?yàn)镴ava應(yīng)用程序提供了一種把JDBC調(diào)用映射成ODBC調(diào)用的方法。因此在客戶端計(jì)算機(jī)上安裝一個(gè)ODBC驅(qū)動。 缺點(diǎn):效率相對底下。l部分Java,部分本機(jī)驅(qū)動程序 這種驅(qū)動程序使用Java實(shí)
7、現(xiàn)與數(shù)據(jù)庫廠商專有API混合形式來提供數(shù)據(jù)訪問。它比JDBC-ODBC橋的形式快。在這種方勢力,必須在內(nèi)閣運(yùn)行Java應(yīng)用程序的客戶端安裝驅(qū)動程序和廠商專有的API。現(xiàn)在大多數(shù)的數(shù)據(jù)庫廠商都在其數(shù)據(jù)庫產(chǎn)品中提供該驅(qū)動程序 l中間數(shù)據(jù)訪問服務(wù)器 這種形式使用中間數(shù)據(jù)訪問服務(wù)器。通過這種服務(wù)器,他可以把Java客戶端連接到多個(gè)數(shù)據(jù)庫服務(wù)器上。他不需要客戶端的數(shù)據(jù)庫驅(qū)動,而是使用網(wǎng)絡(luò)-服務(wù)器中層來訪問一個(gè)數(shù)據(jù)庫。該類型的驅(qū)動程序使用網(wǎng)絡(luò)協(xié)議,并完全通過Java驅(qū)動,他為Java應(yīng)用程序提供了一種進(jìn)行JDBC調(diào)用的機(jī)制。l純Java驅(qū)動程序 這種方式使用廠商專有的網(wǎng)絡(luò)協(xié)議把JDBC API調(diào)用轉(zhuǎn)換稱直
8、接的網(wǎng)絡(luò)調(diào)用,這種方式的本質(zhì)是使用套接字進(jìn)行編程。純Java驅(qū)動運(yùn)行在客戶端,并且直接訪問數(shù)據(jù)庫。它的使用比較簡單,客戶端不需要安裝任何中間件或者運(yùn)行庫?,F(xiàn)在大部分廠商都提供第4類驅(qū)動程序的支持。 四種訪問方式比較l第1、2類驅(qū)動程序是數(shù)據(jù)庫廠商為提供第4類JDBC驅(qū)動程序的一種過渡解決方案,例如通過JDBC訪問Access數(shù)據(jù)庫。l第3類驅(qū)動程序適合那種需要同時(shí)連接多個(gè)不同種類的數(shù)據(jù)庫, 并且對并發(fā)連接要求高的三層應(yīng)用程序中。l第1、2、4類驅(qū)動程序常用于C/S模式的應(yīng)用程序中。l訪問速度:241穩(wěn)定性:421 6.3 JDBC常用接口使用介紹1.Driver接口 每個(gè)數(shù)據(jù)庫驅(qū)動程序必須實(shí)現(xiàn)
9、Driver接口。對于JSP開發(fā)者而言,只要使用Driver接口就可以了。在編程中要連接數(shù)據(jù)庫,必須先裝載特定廠商提供的數(shù)據(jù)庫驅(qū)動程序(Driver),不同驅(qū)動程序的裝載方法。 使用JDBC-ODBC BridgeDriver,這樣裝載:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); 對于Access適用 使用 JDBC Driver,這樣裝載 Class.forName(“jdbc.driver_class_name”);在使用Class.forName之前,先適用import語句導(dǎo)入java.sql包。 import java.sql.*;裝載
10、MS SQLServer 驅(qū)動:Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);裝載 MySQL JDBC驅(qū)動:Class.forName(“org.git.mm.mysql.Driver”);裝載 Oracle JDBC驅(qū)動:Class.forName(“oracle.jdbc.driver.OracleDriver”); 2. DriverManager(驅(qū)動程序管理器) DriverManager 是JDBC(Java數(shù)據(jù)庫連接)的管理層。作用于用戶和驅(qū)動程序之間。DriverManager 可以跟蹤驅(qū)動程序,并
11、在數(shù)據(jù)庫和相應(yīng)驅(qū)動程序之間建立連接。 DriverManager激發(fā)getConnection()方法時(shí), DriverManager首先從它已加載的驅(qū)動程序池中找到一個(gè)可以接受該數(shù)據(jù)庫URL的驅(qū)動程序,然后請求該驅(qū)動程序使用相關(guān)的數(shù)據(jù)庫URL連接到數(shù)據(jù)庫中,于是getConnection()方法建立了與數(shù)據(jù)庫連接。 DriverManager.getConnection()方法(靜態(tài)的)static connection getConnection(String url);static connection getConnection(String url,String info);stat
12、ic connection getConnection(String url,String name,String pwd);URL:類似于其他場合的URL,語法如下:jdbc:jdbc:表示 協(xié)議,他是唯一的,JDBC只有這一種協(xié)議子協(xié)議:主要用于識別數(shù)據(jù)庫驅(qū)動程序,也就是說,不同的數(shù)據(jù)庫驅(qū)動程序的子協(xié)議不同子名:它屬于專門的驅(qū)動程序,不同的專有驅(qū)動程序可以采用不同的實(shí)現(xiàn) 數(shù)據(jù)庫連接字符串?dāng)?shù)據(jù)庫 驅(qū)動程序名稱URLMicrosoft Access sun.jdbc.odbc.JdbcOdbcDriver jdbc:odbc:studentMicrosoft Sql Server 2000 c
13、om.microsoft.jdbc.sqlserver.SQLServerDriver jdbc:microsoft:sqlserver:/localhost:1433;databasename=studentMicrosoft Sql Server 2005 com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc:sqlserver:/localhost:2667;databasename=student Oracle 9i oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:localhost:152
14、1:studentjdbc:oracle:oci:student 3.Connection一個(gè)Connection表示與一個(gè)特定數(shù)據(jù)庫的會話。 Connection對象代表與數(shù)據(jù)庫的連接。 連接過程包括所執(zhí)行的SQL語句和在連接上所返回的結(jié)果。 Connection conn= DriverManager.getConnection(url,login,pwd); Connection接口是JSP編程中使用最頻繁的接口之一。Connection接口中常用到的方法: close():關(guān)閉連接。isclose():判斷連接是否關(guān)閉。 createStatement():創(chuàng)建SQL語句對象。 get
15、AutoCommit():獲得當(dāng)前自動提交狀態(tài)。commit():提交對數(shù)據(jù)庫的更改,使更改生效。setAutoCommit(boolean value):設(shè)置連接是否處于自動提交狀態(tài)。rollback():回滾上一次提交或回滾操作后的所有更改prepareStatement(String sql):可以被預(yù)編譯存放在prepareStatement對象中,該對象用于有效地多次執(zhí)行該語句。prepareCall(String sql):返回值是創(chuàng)建的CallableStatement 對象,可以用來處理一個(gè)SQL存儲過程setReadOnly():可以把一個(gè)連接設(shè)置為只讀狀態(tài)。isReadOn
16、ly():檢測該連接是否存在只讀狀態(tài) 4.StatementStatement對象代表SQL語句??捎糜趯QL語句發(fā)送至數(shù)據(jù)庫。Statement對象存在3種。 Statement對象,用來執(zhí)行基本的SQL語句。 PrepareStatement對象,從Statement繼承,用于提供可以查詢信息一起預(yù)編譯的語句。 CallableStatement,它繼承自PrepareStatement,用來執(zhí)行數(shù)據(jù)庫中的存儲過程。Statement常用的方法: cancle():用于一個(gè)線程取消另一個(gè)線程正在執(zhí)行的一條語句。 close():用來關(guān)閉語句。同時(shí)立即釋放該語句的數(shù)據(jù)庫和JDBC資源。如果
17、它有相應(yīng)產(chǎn)生的ResultSet,則ResultSet也會被關(guān)閉。execute(String sql): 執(zhí)行一條可能返回多個(gè)結(jié)果的SQL語句。返回布爾值。若有ResultSet,則返回true,如果它是一個(gè)更新數(shù)據(jù)或沒有其它結(jié)果,則返回false。executeQurey(String sql):執(zhí)行一個(gè)返回單個(gè)ResultSet的SQL語句,返回值是由查詢產(chǎn)生的數(shù)據(jù)ResultSet。executeUpdate(String sql):執(zhí)行一條insert、update或delete語句或是沒有返回值的SQL語句。該方法返回語句影響的行數(shù),如果是沒有影響的行數(shù)則返回0。 getResul
18、tSet():得到當(dāng)前的ResultSet的結(jié)果。getUpdateCount():得到更新的數(shù)量,如果結(jié)果是一個(gè)ResultSet或沒有其他結(jié)果,則返回-1。5.PrepareStatementPrepareStatement類對象封裝一條預(yù)編譯的SQL語句,用于高效地多次執(zhí)行該語句。常用的方法:clearParameters():立即釋放當(dāng)前參數(shù)值使用的資源execute():執(zhí)行一條可能返回多個(gè)結(jié)果的SQL語句,返回一個(gè)布爾值。如果下一個(gè)結(jié)果是ResultSet,則返回true,否則返回false executeQuery():執(zhí)行準(zhǔn)備好的SQL查詢并返回ResultSet execut
19、eUpdate():執(zhí)行一條insert、update或delete語句或是沒有返回值的SQL語句。setBoolean(int parameterIndex,boolean x);setByte(int parameterIndex,byte x)setBytes(int parameterIndex,byte x)setDate(int parameterIndex,Date x)setDouble(int parameterIndex,double x)setFloat(int parameterIndex,float x)setInt(int parameterIndex,int x)
20、setShort(int parameterIndex,short x) 6.ResultSet ResultSet 類可用來接受執(zhí)行SQL查詢語句后得到的記錄集。 JDBC連接數(shù)據(jù)庫流程開 始導(dǎo)入 java.sql包 加載并注冊驅(qū)動程序創(chuàng)建一個(gè) Connection 對象創(chuàng)建一個(gè) Statement 對象執(zhí)行SQL語句 關(guān)閉ResultSet 對象關(guān)閉Statement對象關(guān)閉連接結(jié) 束使用ResultSet對象 程序演示 演示創(chuàng)建數(shù)據(jù)庫連接的具體步驟 錯誤提示lsocket establish error錯誤的解決方法檢查SQL Server服務(wù)是否啟動對于Windows XP、Windows 2003操作系統(tǒng),確保SQL Servler 2000升級至sp3以上版本(用netstat n -a)查看端口是否打開如果系統(tǒng)安裝了防火墻軟件,請暫時(shí)關(guān)閉實(shí)時(shí)監(jiān)控選項(xiàng) 記錄查詢實(shí)例 實(shí)例 向數(shù)據(jù)庫中插入記錄 代碼 刪除一條記錄 代碼 修改一條記錄: