《數(shù)據(jù)庫連接(JDBC)及其.ppt》由會員分享,可在線閱讀,更多相關(guān)《數(shù)據(jù)庫連接(JDBC)及其.ppt(23頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、第11章 數(shù)據(jù)庫連接(JDBC)及其應(yīng)用,本章要點: 數(shù)據(jù)源的配置 數(shù)據(jù)庫驅(qū)動程序加載的方式 數(shù)據(jù)庫操作的流程 事務(wù)控制 預(yù)查詢,11.1 JDBC基本編程概念,JDBC協(xié)議遵循了微軟公司的ODBC模型,并與ODBC建立在同一方案的基礎(chǔ)之上:遵循JDBC API協(xié)議的程序和JDBC驅(qū)動程序管理器通信,驅(qū)動程序管理器用嵌入的驅(qū)動程序訪問數(shù)據(jù)庫。 從程序設(shè)計的角度來看,用JDBC類編程與使用一般的Java類編程并沒有太大的不同。,11.1.1 設(shè)定ODBC數(shù)據(jù)源,------語法------2000版本 String URL=jdbc:microsoft:sqlserver://localhost
2、:1433; DatabaseName=news; Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver); Connection con = DriverManager.getConnection(URL,sa,sa);,sql server數(shù)據(jù)庫驅(qū)動類的完全限定類名,演示:在工程中引入JDBC驅(qū)動程序包,數(shù)據(jù)庫名稱,------語法------2005版本 String URL=jdbc:sqlserver://localhost:1433; DatabaseName=news; Class.forName(com.micro
3、soft. sqlserver. jdbc.SQLServerDriver); Connection con = DriverManager.getConnection(URL,sa,sa);,sql server數(shù)據(jù)庫驅(qū)動類的完全限定類名,演示:在工程中引入JDBC驅(qū)動程序包,數(shù)據(jù)庫名稱,1. SQL Server 2000數(shù)據(jù)庫連接字符串 Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver).newInstance();Connectionconn=java.sql.DriverManager.getConnection(j
4、dbc:microsoft:sqlserver://數(shù)據(jù)庫服務(wù)器名或地址:1433;DatabaseName=數(shù)據(jù)庫名,用戶名,密碼); 所需jar包:msbase.jar、mssqlserver.jar、msutil.jar 2. SQL Server 2005 數(shù)據(jù)庫連接字符串: Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver).newInstance();Connectionconn=java.sql.DriverManager.getConnection(jdbc:sqlserver://數(shù)據(jù)庫服務(wù)器名或地址:143
5、3;DatabaseName=數(shù)據(jù)庫名,用戶名,密碼);,11.1.2 數(shù)據(jù)庫URL 要連接一個數(shù)據(jù)庫,必須要指定源數(shù)據(jù)庫,有時也需要指定相應(yīng)的參數(shù)。例如:網(wǎng)絡(luò)協(xié)議驅(qū)動程序需要指定端口、ODBC驅(qū)動程序等。 JDBC用類似于常見的Net URL句法描述數(shù)據(jù)庫。例如:我們通過JDBCODBC橋連接一個Access數(shù)據(jù)庫myAccess: jdbc:odbc:myAccess String driverName=sun.jdbc.odbc.JdbcOdbcDriver; String URL=jdbc:odbc:db1; JDBC常規(guī)的URL句法是: jdbc:subprotocol name
6、:datasource 連接到Oracle數(shù)據(jù)庫及SQL Server的URL分別如下: Oracle數(shù)據(jù)庫 jdbc:oracle:thin:127.0.0.1:1521:wangwd,數(shù)據(jù)庫名稱,因為連接Oracle數(shù)據(jù)庫一般是通過客戶端去進行的, Oracle客戶端也被稱為瘦型機(thin),對于127.0.0.1這是本地IP地址,也就是說Oracle數(shù)據(jù)庫是安裝在本機上的,當然在這里用戶也可以采用如下的格式: jdbc:oracle:thin:localhost:1521:wangwd 1521是Oracle訪問端口號,wangwd是建立的Oracle數(shù)據(jù)庫的名字,用戶可以換成自己喜歡
7、的名字。 SQL Server 2000數(shù)據(jù)庫URL jdbc:microsoft:sqlserver://localhost:1433 在這里采用默認的數(shù)據(jù)庫,如果用戶自己創(chuàng)立的數(shù)據(jù)庫如myBook,可以采用如下的格式: jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=myBook,SQL Server 2005數(shù)據(jù)庫URL jdbc:sqlserver://localhost:1433 在這里采用默認的數(shù)據(jù)庫,如果用戶自己創(chuàng)立的數(shù)據(jù)庫如myBook,可以采用如下的格式: jdbc:sqlserver://localhost:14
8、33;DatabaseName=myBook 驅(qū)動程序全稱: com.microsoft.sqlserver.jdbc.SQLServerDriver,11.1.3 建立連接 驅(qū)動程序管理器(DriverManager)類是負責選擇數(shù)據(jù)庫驅(qū)動程序和建立到數(shù)據(jù)庫的連接的類,但驅(qū)動程序管理器只能激活已登錄的驅(qū)動程序。 登錄驅(qū)動程序的方法如下: 裝入一個驅(qū)動程序類以自己登錄驅(qū)動程序。例如可以用以下方式登錄Oracle驅(qū)動程序: Class.forName(oracle.jdbc.driver.OracleDriver); 用戶也可以用下面的方式登錄一個SQL Server的驅(qū)動程序: Class.
9、forName(com.microsoft.jdbc.sqlserver.SQLServerDriver); 登錄我們剛剛建立的ODBC數(shù)據(jù)源的方法如下: Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);,現(xiàn)在我們假設(shè)安裝了Oracle數(shù)據(jù)庫,數(shù)據(jù)庫名字為wangwd,則得到一個數(shù)據(jù)庫的連接如下: Class.forName(oracle.jdbc.driver.OracleDriver);//登錄Oracle數(shù)據(jù)庫驅(qū)動程序 String url = jdbc:oracle:thin:localhost:1521:wangwd;//數(shù)據(jù)庫URL Stri
10、ng userName =scott;//登錄數(shù)據(jù)庫用戶名 String password = tiger;//用戶密碼 Connection con = DriverManager.getConnection(url, userName, password); 接著我們再以筆者安裝的SQL Server為例,并新建一個數(shù)據(jù)庫為studentmanager: Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver); String url =jdbc:microsoft:sqlserver://localhost:1433; Dat
11、abaseName=studentmanager; String userName = sa; String password = ; Connection con = DriverManager.getConnection(url, userName, password);,11.1.4 建立會話 數(shù)據(jù)庫建立連接后,要想操縱數(shù)據(jù)庫,必須跟數(shù)據(jù)庫建立一個會話。所謂會話就是從建立一個數(shù)據(jù)庫連接到關(guān)閉數(shù)據(jù)庫連接所進行的所有動作的總稱,這與數(shù)據(jù)庫會話是不同的??梢酝ㄟ^如下的代碼得到一個會話: tryStatement st = con.createStatement(); catch(SQLExce
12、ption e) 通過這段代碼我們可以知道,創(chuàng)建一個會話是建立在數(shù)據(jù)庫連接的基礎(chǔ)上的?,F(xiàn)在我們得到了一個默認的會話。接下來就可以進行數(shù)據(jù)庫的具體操作了。,11.1.5 操作數(shù)據(jù)庫 如果我們把數(shù)據(jù)庫(database)看作是一個倉庫,那到數(shù)據(jù)庫的連接(Connection)就可以假想成一條通往倉庫的陽光大道,那么會話(Statement)就可以看作是跑在這條大道上的一輛貨車,我們對數(shù)據(jù)庫進行的不同的操作(SQL語句),就是對這輛貨車發(fā)出不同的指令(update、delete、query等),執(zhí)行的結(jié)果就是從數(shù)據(jù)庫中返回操作結(jié)果,這個結(jié)果就類似于從倉庫拉回不同的貨物。 1. 查詢 查詢操作是數(shù)據(jù)庫
13、中最基本的語句,通過如下的語句可以對數(shù)據(jù)庫執(zhí)行一個查詢,查詢的結(jié)果是以結(jié)果集(ResultSet)的形式返回的。 String sql = select * from student; ResultSet result = st.executeQuery(sql);,ResultSet類的若干方法,例11-1程序清單 QueryODBCTest.java /** * 通過這個程序,向讀者展示比較完整的JDBC數(shù)據(jù)庫操作的順序,在這個例子中主要展示的查詢 * 及格式輸出。 */ import java.sql.SQLException; import java.sql.Connection; i
14、mport java.sql.Statement; import java.sql.ResultSet; import java.sql.DriverManager; import java.sql.Date; public class QueryODBCTest private Connection con; public static void main(String args) QueryODBCTest test = new QueryODBCTest(); Connection con = test.getConnection(); String sql = select *
15、from student; test.getStudent(con, sql); ,public void getStudent(Connection con, String sql) try Statement st = con.createStatement(); ResultSet rs = st.executeQuery(sql); while(rs.next()) String name =rs.getString(姓名); String number = rs.getString(學(xué)號); Date date = rs.getDate(出生日期); String spe = r
16、s.getString(專業(yè)); String address = rs.getString(籍貫); System.out.println( n姓名: + name + t學(xué)號: + number + t出生日期: + date + t專業(yè): + spe + t籍貫: + address ); ,st.close(); con.close(); catch(SQLException e) e.printStackTrace(); public Connection getConnection() String url = jdbc:odbc:myAccess;//數(shù)據(jù)庫URL String
17、 userName = ;//登錄數(shù)據(jù)庫用戶名 String password = ;//用戶密碼 try //登錄JDBC-ODBC驅(qū)動程序 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); con = DriverManager.getConnection(url, userName, password); catch(SQLException e), e.printStackTrace(); catch(ClassNotFoundException ex) ex.printStackTrace(); return con; ,2. 建表 下面我
18、們將在SQL Server中利用數(shù)據(jù)庫的相關(guān)操作建立一個student表,并插入相關(guān)的記錄。 在創(chuàng)建一個表格時,我們是通過: st.execute(sql); 來實現(xiàn)的。execute方法的返回值是一個boolean型的,如果執(zhí)行成功就返回true,反之則返回false。 在執(zhí)行插入記錄的操作時,我們是通過: st.executeUpdate(sql); 來實現(xiàn)的。它的返回值是一個int型的數(shù)值,它表示當前操作完成的記錄數(shù)。,3. 創(chuàng)建數(shù)據(jù)庫 在前面的示例中,我們都是通過直接將SQL語句嵌入到程序本身中,這種編碼方式我們習(xí)慣上稱之為硬編碼。硬編碼看起來比較容易編寫,但存在一個很大的缺點,那就是
19、兼容性不強,這里的兼容性指的是程序的兼容性。試想,假如我們按照以下的形式創(chuàng)建了一張表: String sql = CREATE TABLE SUTDENT(姓名 varchar(12) NOT NULL, +學(xué)號 varchar(10) NOT NULL, + 出生日期 datetime NOT NULL,專業(yè) varchar(10) NULL, +籍貫 varchar(30) NULL); 如果由于某種原因需要將籍貫的字段長度更改為50位字符長,那只有重新修改程序代碼,并重新編譯,重新發(fā)布,這樣做無疑是非常麻煩的?,F(xiàn)在我們可以將類似的SQL語句也通過配置文件配置,并且當需要修改數(shù)據(jù)庫結(jié)構(gòu)時,
20、我們只需要簡單地修改一下屬性文件就可以了。,11.2 預(yù)查詢,接下來,我們再介紹JDBC在進行查詢數(shù)據(jù)庫操作方面的一個新的特性:預(yù)查詢(prepared statement)。根據(jù)字面的意思,我們知道預(yù)查詢也就是在執(zhí)行真正的查詢工作之前先做一部分準備工作,以適應(yīng)真正的查詢,這樣做的目的是為了減少數(shù)據(jù)庫操作的時間。 現(xiàn)在假設(shè)我們想從建立的數(shù)據(jù)庫中查詢符合條件的一條記錄: select 姓名,學(xué)號,專業(yè),籍貫 from student where 姓名 = 需要用戶輸入的信息 在這個SQL語句中,只有需要用戶輸入的信息是可變的,其他信息基本上不變,所以我們可以考慮把前面的信息先輸入到數(shù)據(jù)庫中,只要
21、用戶輸入想查詢的人名就可以了,這種情況就像是數(shù)據(jù)庫在等待填空一樣。 在JDBC中預(yù)查詢是用“?”來替代未知條件,那么上面的SQL語句就可以實現(xiàn)為: select 姓名,學(xué)號,專業(yè),籍貫 from student where 姓名 = ?,11.3 小結(jié),通過這一章的講述,使讀者能使我們的應(yīng)用程序與數(shù)據(jù)庫有機的結(jié)合起來,在這一章中,筆者通過示例示范了連接不同數(shù)據(jù)庫的方法,并分別講述了數(shù)據(jù)庫的相關(guān)操作,希望讀者在實際應(yīng)用中仔細體會。盡管現(xiàn)在JDBC對于某些功能的支持不是太好,但隨著JDBC2的應(yīng)用與發(fā)展,會有很大的轉(zhuǎn)變,在JDBC2中也會有更新的功能與改變體現(xiàn)出來,讀者可以查看Sun公司關(guān)于JDBC2設(shè)計規(guī)范。,