




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第14章 JDBC技術(shù)和數(shù)據(jù)庫開發(fā)應(yīng)用教學(xué)目標(biāo)JDBC技術(shù)JDBC的體系結(jié)構(gòu)JDBC驅(qū)動程序類型JDBC API的主要類和接口簡介創(chuàng)建MySQL服務(wù)器上的數(shù)據(jù)庫MySQL的安裝和配置創(chuàng)建用戶數(shù)據(jù)庫studyJava應(yīng)用程序通過JDBC存取數(shù)據(jù)庫的過程應(yīng)用JDBC存取數(shù)據(jù)庫的步驟JDBC存取MySQL數(shù)據(jù)庫的簡單實(shí)例教學(xué)目標(biāo)JDBC中的主要接口和類DriverManager類 Connection接口Statement接口PreparedStatement接口CallableStatement接口Java數(shù)據(jù)類型和SQL中支持的數(shù)據(jù)類型的對應(yīng)關(guān)系ResultSet接口ResultSetMetaD
2、ata接口DatabaseMetaData接口數(shù)據(jù)庫開發(fā)應(yīng)用實(shí)例Study數(shù)據(jù)庫的插入、修改、刪除記錄的程序設(shè)計(jì)查詢Study數(shù)據(jù)庫的程序設(shè)計(jì)14.1 JDBC技術(shù)在Java程序中如何連接和訪問數(shù)據(jù)庫呢?這就要用到JDBC (Java Database Connectivity)技術(shù)。JDBC是為Java語言定義的一個(gè)SQL調(diào)用級的數(shù)據(jù)庫編程接口。通過JDBC API,程序員能夠在Java程序中方便地連接和訪問數(shù)據(jù)庫,實(shí)現(xiàn)Java的數(shù)據(jù)庫編程。通過使用JDBC,開發(fā)人員可以很方便地將SQL語句傳遞給幾乎任何一種數(shù)據(jù)庫。也就是說開發(fā)人員可以不必寫一個(gè)程序訪問Orcale,再寫一個(gè)程序訪問SQL
3、Server。用 JDBC寫的程序能夠自動地將SQL語句傳送給相應(yīng)的數(shù)據(jù)庫管理系統(tǒng)。JDBC是一組由Java語言編寫的類和接口,其API包含在java.sql和javax.sql兩個(gè)包中。14.1.1 JDBC的體系結(jié)構(gòu)Java應(yīng)用程序JDBC APIJDBC Driver Manager數(shù)據(jù)庫驅(qū)動器Java應(yīng)用程序數(shù)據(jù)庫數(shù)據(jù)庫數(shù)據(jù)庫Java應(yīng)用程序圖14-1 JDBC的體系結(jié)構(gòu)14.1.2 JDBC驅(qū)動程序類型1JDBC-ODBC bridge plus ODBC driver(類型1):JDBC-ODBC橋接驅(qū)動程序。其底層通過ODBC(Open databas Connectivity)
4、驅(qū)動程序來連接數(shù)據(jù)庫。2 Native-API partly-Java driver(類型2):本地 API - 部份用 Java 來編寫的驅(qū)動程序。此種方式先將JDBC函數(shù)調(diào)用轉(zhuǎn)換成數(shù)據(jù)庫客戶端函數(shù)庫的API(位于客戶端計(jì)算機(jī)),然后與數(shù)據(jù)庫相連。3JDBC-Net pure Java driver(類型3):JDBC 網(wǎng)絡(luò)純 Java 驅(qū)動程序。首先JDBC驅(qū)動程序會將JDBC函數(shù)調(diào)用解釋成與數(shù)據(jù)庫無關(guān)的網(wǎng)絡(luò)通信協(xié)議,經(jīng)過中介服務(wù)器的第二次解析,最后才轉(zhuǎn)換成相對應(yīng)的數(shù)據(jù)庫通信協(xié)議.4.Native-protocol pure Java driver(類型4)本地協(xié)議純 Java驅(qū)動程序。這
5、種驅(qū)動程序?qū)?JDBC 調(diào)用直接轉(zhuǎn)換為 DBMS 所使用的網(wǎng)絡(luò)協(xié)議。14.1.3 JDBC API的主要類和接口簡介JDBC API由一系列與數(shù)據(jù)庫訪問有關(guān)的類和接口組成,它們放在java.sql子包中。其中主要的類和接口有: DriverManager類:管理個(gè)各種數(shù)據(jù)庫驅(qū)動程序加載,建立數(shù)據(jù)庫連接。 Connection接口用來建立數(shù)據(jù)庫連接。 Statement接口、與子類PreparedStatement、CallableStatement接口:用于處理連接中的SQL語句 ResultSet;用于處理數(shù)據(jù)庫操作結(jié)果集。14. 創(chuàng)建MySQL的數(shù)據(jù)庫SQL Server 2000數(shù)據(jù)庫逐
6、漸成為Windows操作系統(tǒng)平臺下進(jìn)行數(shù)據(jù)庫應(yīng)用開發(fā)中較為理想的選擇之一,它可作為大型Web站點(diǎn)、企業(yè)OLTP(聯(lián)機(jī)事務(wù)處理)以及數(shù)據(jù)倉庫系統(tǒng)等的產(chǎn)品數(shù)據(jù)庫服務(wù)器。 14.2.1 MySQL的安裝和配置1.下載Windows版的安裝軟件包2.安裝和配置MySQL軟件3. NavicatforMySQL是基于Windows平臺,為MySQL數(shù)據(jù)庫量身訂作的類似于MySQL的用戶管理界面工具。使用了圖形用戶界面(GUI),可以用一種安全和更為容易的方式快速地創(chuàng)建、組織、存取和共享數(shù)據(jù)。 14.2.2 創(chuàng)建數(shù)據(jù)庫studyMySQL Server服務(wù)器上存放著一組系統(tǒng)數(shù)據(jù)庫和用戶數(shù)據(jù)庫。用戶數(shù)據(jù)庫S
7、tudy是我們本章要用的數(shù)據(jù)庫,存放著學(xué)生的基本信息、課程情況和學(xué)生學(xué)習(xí)各門課程的學(xué)習(xí)成績。Study數(shù)據(jù)庫中有學(xué)生情況表student、課程情況表course和學(xué)習(xí)成績表sc。student由學(xué)號、姓名、性別、年齡和所在系各字段組成;course由課程號、課程名和學(xué)分各字段組成;sc由學(xué)號、課程號和學(xué)習(xí)成績各字段組成。先將study.sql腳本文件復(fù)制到C盤根目錄下,打開MySQL命令行窗口(MySQL Command Line Client),通過運(yùn)行下面的腳本命令:Source c:study.sql完成創(chuàng)建數(shù)據(jù)庫study和三張表student、course和sc14.2.2 創(chuàng)建數(shù)據(jù)
8、庫study先將study.sql腳本文件復(fù)制到C盤根目錄下,打開MySQL命令行窗口(MySQL Command Line Client),通過運(yùn)行下面的腳本命令:source c:study.sql 完成創(chuàng)建數(shù)據(jù)庫study和三張表student、course和sc14.3 Java應(yīng)用程序通過JDBC存取數(shù)據(jù)庫的過程 本節(jié)首先介紹通過JDBC存取數(shù)據(jù)庫的步驟, 然后通過一個(gè)簡單實(shí)例演示整個(gè)過程。14.3.1 應(yīng)用JDBC存取數(shù)據(jù)庫的步驟Java應(yīng)用程序通過JDBC存取數(shù)據(jù)庫時(shí)應(yīng)該遵循4個(gè)步驟:1. 加載(注冊)適當(dāng)?shù)腏DBC驅(qū)動程序,建立數(shù)據(jù)庫連接2. 建立與執(zhí)行SQL語句3. 處理結(jié)果
9、集4. 關(guān)閉數(shù)據(jù)庫連接14.3.1 應(yīng)用JDBC存取數(shù)據(jù)庫的步驟加載JDBC驅(qū)動程序,建立數(shù)據(jù)庫連接(1)加載JDBC驅(qū)動程序使用Class.forName()加載JDBC驅(qū)動程序,其語句的語法格式如下:Class.forName(String jdbc_driver);例如,加載MySQL驅(qū)動程序的語句:Class.forName(“com.mysql.jdbc.Driver”);需要注意的是,如果驅(qū)動器類有可能不存在,使用此方法就可能會拋出ClassNotFoundException異常,因此需要捕獲這個(gè)異常:try Class.forName(“com.mysql.jdbc.Driver
10、”);catch(ClassNotFoundException e) System.out.println(e.getMessage);14.3.1 應(yīng)用JDBC存取數(shù)據(jù)庫的步驟加載JDBC驅(qū)動程序,建立數(shù)據(jù)庫連接(2)建立數(shù)據(jù)庫連接使用DriverManger.getConnection()建立一個(gè)新的數(shù)據(jù)庫連接。其方法格式如下: Connection getConnection(String connURL,String loginName,String password);返回連接到特定數(shù)據(jù)庫的Connection對象。其中 :connURL訪問數(shù)據(jù)庫的URL路徑 。格式為:協(xié)議:子協(xié)議
11、:數(shù)據(jù)源表示協(xié)議:在JDBC中總是以jdbc開始 子協(xié)議:是橋連接的驅(qū)動程序或是數(shù)據(jù)庫管理系統(tǒng)名稱。 數(shù)據(jù)源標(biāo)識:標(biāo)記找到數(shù)據(jù)庫來源的地址與連接端口。loginName是程序連接時(shí)所用的數(shù)據(jù)庫用戶名。 password該用戶名的密碼 。 Connection是一個(gè)接口,表示與指定數(shù)據(jù)庫的連接DriverManager類位于JDBC的管理層,作用于用戶和驅(qū)動程序之間。它負(fù)責(zé)跟蹤在一個(gè)系統(tǒng)中所有可用的JDBC驅(qū)動程序,并在數(shù)據(jù)庫和相應(yīng)驅(qū)動程序之間建立連14.3.1 應(yīng)用JDBC存取數(shù)據(jù)庫的步驟1. 加載JDBC驅(qū)動程序,建立數(shù)據(jù)庫連接例14-1 連接MYSQL的數(shù)據(jù)庫study,用戶名為”root
12、”,口令為”root” ,則建立數(shù)據(jù)庫連接的代碼如下。try Class.forName(com.mysql.jdbc.Driver);String url=jdbc:mysql:/localhost:3306/study;String login=root,password=“root;Connection conn=DriverManager.getConnection(url,login,password); catch (ClassNotFoundException e) /輸出捕獲到的異常信息e.printStackTrace(); catch (SQLException e) /輸
13、出捕獲到的異常信e.printStackTrace();2.建立SQL語句對象,執(zhí)行查詢建立數(shù)據(jù)庫連接后,必須先建立一個(gè)Statement對象才能執(zhí)行SQL語句。在Java中,定義了三種類型的Statement:(1)Statement(2)PreparedStatement(3)CallableStatement三種類型均包含用于進(jìn)行數(shù)據(jù)庫操作的SQL語句。14.3.1 應(yīng)用JDBC存取數(shù)據(jù)庫的步驟2.建立SQL語句對象,執(zhí)行查詢(1) 使用Statement用Connection的方法createStatement創(chuàng)建Statement對象。在Statement對象上,可以使用execut
14、eQuery、executeUpdate等方法,這些方法需要一個(gè)表示SQL語句的字符串作為參數(shù)。上述方法將這些SQL語句傳送給數(shù)據(jù)庫,就可以對數(shù)據(jù)庫進(jìn)行相應(yīng)的操作了。示例如下:Statement Stmt=conn.createStatement();String sqlQuery=select*from student;ResultSet rs=Stmt.executeQuery(sqlQuery);14.3.1 應(yīng)用JDBC存取數(shù)據(jù)庫的步驟2.建立SQL語句對象,執(zhí)行查詢(2) 使用PreparedStatement用于處理預(yù)編譯的SQL語句,可以重復(fù)執(zhí)行,。如果某個(gè)SQL語句必須重復(fù)執(zhí)行
15、,建議使用PreparedStatement,執(zhí)行效率更高。示例如下:PreparedStatement prepStmt=conn.prepareStatement(“select*from Employee”);Resultset rset=prepStmt.executeQuery();用于帶參數(shù)的SQL語句的執(zhí)行,參數(shù)用為你好(?)表示。下面的示例中,將執(zhí)行帶有兩個(gè)輸入?yún)?shù)的UPDATE語句,其語句如下:執(zhí)行帶2個(gè)參數(shù)的UPDATE語句,示例如下:PreparedStatement prepStmt=conn.prepareStatement(UPDATE emp SET sal =
16、? WHERE ename = ? );prepStmt.setInt(1,100000); /設(shè)置傳入的第1個(gè)int型個(gè)參數(shù)值為100000prepStmt.setString(2,Rich); /設(shè)置傳入的第2個(gè)String型個(gè)參數(shù)值為”Rich”prepStmt.executeUpdate();14.3.1 應(yīng)用JDBC存取數(shù)據(jù)庫的步驟2.建立SQL語句對象,執(zhí)行查詢(3) 使用CallableStatement使用CallableStatement條用數(shù)據(jù)庫存儲過程。語法格式為:CallableStatement 變量名=conn.prepareCall(“call 存儲過程名稱”);
17、下面的示例,將調(diào)用帶有兩個(gè)輸入?yún)?shù)的存儲過程update_salary,代碼如下:CallableStatement callStmt=conn.prepareCall(call update_salary(?,?);callStmt.setInt(1,7788); /設(shè)置要傳入的第一個(gè)輸入?yún)?shù)(?)值是7788callStmt.setInt(2,10000); /設(shè)置要傳入的第二個(gè)輸入?yún)?shù)(?)值是10000callStmt.execute();14.3.1 應(yīng)用JDBC存取數(shù)據(jù)庫的步驟2.建立SQL語句對象,執(zhí)行查詢建立Statement對象或PreparedStatement對象或Cal
18、lableStatement對象之后,有3種方法執(zhí)行SQL語句(選擇哪種由SQL語句的內(nèi)容決定):executeQuery():用于執(zhí)行返回單個(gè)結(jié)果集的語句,例如select語句。返回一個(gè)結(jié)果集(ResultSet 對象)。例如:ResultSet rset=stmt.executeQuery (“select*from student);executeUpdate(): 用于執(zhí)行執(zhí)行insert、delete、update 語句對數(shù)據(jù)庫進(jìn)行增、刪、改記錄操作以及SQL語言中的DDL(數(shù)據(jù)定義語言)語句,例如create table語句等。返回值是一個(gè)整數(shù),表示受影響的行數(shù)(即更新計(jì)數(shù)),比如
19、修改了多少行、刪除了多少行等。對于 create table 等語句,因不涉及到行的操作,所以executeUpdate的返回值總為零。例如:stmt.executeUpdate(update emp set age=sge+1)stmt.executeUpdate(delete emp for age=20);stmt.execute (“create table“+(no CHAR(10),name CHAR(10);execute():用于執(zhí)行返回多個(gè)結(jié)果集(ResultSet 對象)、多個(gè)更新計(jì)數(shù)或二者組合的語句。例如執(zhí)行某個(gè)已存儲過程或動態(tài)執(zhí)行SQL,這時(shí)有可能出現(xiàn)多個(gè)結(jié)果的情況14
20、.3.1 應(yīng)用JDBC存取數(shù)據(jù)庫的步驟3.處理結(jié)果集查詢結(jié)果作為結(jié)果集(ResultSet)對象返回后,我們可以從ResultSet對象中提取結(jié)果使用next方法ResultSet對象中含有檢索出來的行,其中有一個(gè)指示器,指向當(dāng)前可操作的行,初始狀態(tài)下指示器是指向第一行之前方法next的功能是將指示器下移一行,所以第一次調(diào)用next方法時(shí)便將指示器指向第一行,以后每一次對next的成功調(diào)用都會將指示器移向下一行使用getXXX方法使用相應(yīng)類型的getXXX方法可以從當(dāng)前行指定列中提取不同類型的數(shù)據(jù)。例如,提取VARCHAR類型數(shù)據(jù)時(shí)就要用getString方法,而提取FLOAT類型數(shù)據(jù)的方法是
21、getFloat允許使用列名或列序號作為getXXX方法的參數(shù)例如:String s = rs.getString(Name);提取當(dāng)前行Name列中的數(shù)據(jù),并把其從SQL的VARCHAR類型轉(zhuǎn)換成Java的String類型,然后賦值給對象sString s = rs.getString(2);/提取當(dāng)前行的第2列數(shù)據(jù)這里的列序號指的是結(jié)果集中的列序號,而不是原表中的列序號14.3.1 應(yīng)用JDBC存取數(shù)據(jù)庫的步驟3.處理結(jié)果集可用while循環(huán)打印出ResultSet記錄集內(nèi)的所有記錄。例如:while(rs.next() System.out.println(rs.getInt(1); S
22、ystem.out.println(rs.getString(2);1、2、3、表示各字段相對位置14.3.1 應(yīng)用JDBC存取數(shù)據(jù)庫的步驟4.關(guān)閉數(shù)據(jù)庫連接最后一個(gè)操作是關(guān)閉Connection、Statement、ResultSet等對象。rs.close();stmt.close();con.close();14.3.1 應(yīng)用JDBC存取數(shù)據(jù)庫的步驟14.3.2創(chuàng)建Eclipse的項(xiàng)目實(shí)例:完成JDBC訪問MySQL數(shù)據(jù)庫study例14-2 通過JDBC存取MySQL的數(shù)據(jù)庫study的表course的程序。1.程序代碼見14-2/JdbcExample.java2.使用Eclipse
23、環(huán)境,完成JDBC存取MySQL的數(shù)據(jù)庫study。為項(xiàng)目的庫文件添加MySQL的驅(qū)動程序包mysql-connector-java.jar單擊項(xiàng)目,選擇Eclipse主菜單“project-Properities-Java Build Path-Liraries”14.4 JDBC中的主要接口和類Java應(yīng)用程序訪問數(shù)據(jù)庫主要是通過JDBC API實(shí)現(xiàn)的,通過下面幾個(gè)重要接口和類: DriverManager類 Connection接口 Statement接口 PreparedStatement接口 CallableStatement接口 ResultSet接口 ResultSetMetaD
24、ata接口 DatabaseMetaData接口 Java的基本數(shù)據(jù)類型和SQL中支持的數(shù)據(jù)類型對應(yīng)關(guān)系。14.4.1 DriverManager類DriverManager類是Java.sql包中用于數(shù)據(jù)庫驅(qū)動程序管理的類,作用于用戶和驅(qū)動程序之間。它跟蹤可用的驅(qū)動程序,并在數(shù)據(jù)庫和相應(yīng)驅(qū)動程序之間建立連接,也處理諸如驅(qū)動程序登錄時(shí)間限制及登錄和跟蹤消息的顯示等事務(wù)。 DriverManager 類直接繼承自java.lang.object,其主要成員方法有:static Connection getConnetion(String url)通過指定url創(chuàng)建數(shù)據(jù)庫連接static Conn
25、ection getConnetion(String url,String user,String password)通過指定url及用戶、密碼創(chuàng)建數(shù)據(jù)庫連接JDBCURL格式標(biāo)準(zhǔn)語法::MySQL的JDBCURL格式: jdbc:mysql/hostname:port/dbname?param1=value1¶m2=value2. 例:jdbc:mysql:/localhost:3306/sample_db?user=root&password=mypassword 常見參數(shù):user用戶名password密碼autoReconnect聯(lián)機(jī)失敗,是否重新聯(lián)機(jī)(true/false)m
26、axReconnect嘗試重新聯(lián)機(jī)次數(shù)initialTimeout嘗試重新聯(lián)機(jī)間隔maxRows傳回最大行數(shù)useUnicode是否使用Unicode字體編碼(true/false)characterEncoding何種編碼(GB2312/UTF-8/)relaxAutocommit是否自動提交(true/false)capitalizeTypeNames數(shù)據(jù)定義的名稱以大寫表示14.4.1 DriverManager類static Connection getConnetion(String url)public class Test public static void main(Stri
27、ng args) try Class.forName(com.mysql.jdbc.Driver);String url=jdbc:mysql:/localhost:3306/study?user=root&password=123;Connection conn=DriverManager.getConnection(url);Statement Stmt=conn.createStatement();String sqlQuery=select*from student;ResultSet rs=Stmt.executeQuery(sqlQuery);rs.next();String sn
28、ame=rs.getString(sname);System.out.println(sname);rs.close();Stmt.close();conn.close(); catch (ClassNotFoundException e) e.printStackTrace(); catch (SQLException e) e.printStackTrace();14.4.1 DriverManager類static Connection getConnetion(String url,String user,String password)通過指定url及用戶、密碼創(chuàng)建數(shù)據(jù)庫連接publ
29、ic class Test public static void main(String args) try Class.forName(com.mysql.jdbc.Driver);String url=jdbc:mysql:/localhost:3306/study;String login=root,password=“123;Connection conn=DriverManager.getConnection(url, login, password);Statement Stmt=conn.createStatement();String sqlQuery=select*from
30、student;ResultSet rs=Stmt.executeQuery(sqlQuery);rs.next();String sname=rs.getString(sname);System.out.println(sname);rs.close();Stmt.close();conn.close(); catch (ClassNotFoundException e) e.printStackTrace(); catch (SQLException e) e.printStackTrace();14.4.2 連接SQL Server、Oracle和Access數(shù)據(jù)庫的程序舉例例14-3
31、通過創(chuàng)建好的數(shù)據(jù)源名studyDSN,連接Microsoft SQL Server2008或SQL Server 2008 express的數(shù)據(jù)庫。例14-4 通過JDBC-ODBC驅(qū)動程序連接SQL Server 2008 express版本。但不必須事先建立ODBC的數(shù)據(jù)源名。省略了try-catch的主要代碼如下:例14-5 從網(wǎng)站下載SQL Server2005或SQL Server 2008的sqljdbc_2.0驅(qū)動程序包 sqljdbc4.jar,并將此包放在用戶應(yīng)用能訪問的類路徑或項(xiàng)目的庫路徑中。機(jī)器名為localhost(本地機(jī)器),端口號為1030,數(shù)據(jù)庫為study。省略
32、了try-catch的主要代碼如下:例14-6 連接Oracle數(shù)據(jù)庫。從網(wǎng)站下載Oracle驅(qū)動程序包c(diǎn)lasses12.zip,并將此包的路徑放在classpath環(huán)境 變量中或放在項(xiàng)目的庫路徑中。連接數(shù)據(jù)庫ORCL,機(jī)器的ip為192.169.0.20,端口號為1521。省略了try-catch的主要代碼如下:例14-7 通過JDBC-ODBC連接access的數(shù)據(jù)庫study.mdb.省略了try-catch的主要代碼如下:14.4.3 Connection接口 Connection接口是用來表示數(shù)據(jù)庫連接的對象,對數(shù)據(jù)庫的一切操作都是在這個(gè)連接的基礎(chǔ)上進(jìn)行的。Connection接口
33、的主要成員方法(請參見本書P266)Statement createStatement():創(chuàng)建一個(gè)Statement對象Statement createStatement(nt resultSetType,int resultSetConcuttency ):創(chuàng)建一個(gè)Statement對象,它將生成具有特定類型和并發(fā)性的結(jié)果集。 resultSetTypeTYPE_FORWARD_ONLY只能使用next()方法。TYPE_SCROLL_SENSITIVE可以上下移動,可以取得改變后的值。TYPE_SCROLL_INSENSITIVE可以上下移動。resultSetConcuttencyCO
34、NCUR_READ_ONLY只讀CONCUR_UPDATABLEResultSet對象可以執(zhí)行數(shù)據(jù)庫的新增、修改、和移除例如:ResultSet對象中的光標(biāo)上下自由移動 Statement stmt= con.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);ResultSet rs=stmt.executeQuery(select * from test);14.4.3 Connection接口Connection接口的主要成員方法void close():立即釋放連接對象的數(shù)據(jù)庫和JD
35、BC資源Boolean isClosed():測試是否已經(jīng)關(guān)閉Connection類對象對數(shù)據(jù)庫的連接。DatebaseMetaData getMetaData():建立DatabaseMetaData類對象(利用DatabaseMetaData類對象可以獲得當(dāng)前數(shù)據(jù)庫以及驅(qū)動的信息 ,當(dāng)前數(shù)據(jù)庫中表的信息等)PreparedStatement prepareStatement(String sql):建立PrePraredStatement類對象。14.4.4 Statement接口Statement接口用于在已經(jīng)建立的連接的基礎(chǔ)上向數(shù)據(jù)庫發(fā)送SQL語句的對象。它只是一個(gè)接口的定義,其中包括
36、了執(zhí)行SQL語句和獲取返回結(jié)果的方法。有3種 Statement 對象:StatementPreparedStatement(繼承自Statement )CallableStatement(繼承自PreparedStatement)它們都作為在給定連接上執(zhí)行 SQL 語句的容器,每個(gè)都專用于發(fā)送特定類型的 SQL 語句: Statement 對象用于執(zhí)行不帶參數(shù)的簡單 SQL 語句;PreparedStatement 對象用于執(zhí)行帶或不帶 IN 參數(shù)的預(yù)編譯 SQL 語句;CallableStatement 對象用于執(zhí)行對數(shù)據(jù)庫已存儲過程的調(diào)用。 創(chuàng)建statement對象的方法如下: Sta
37、tement stmt = con.createStatement(); Statement接口定義中包括的主要方法(請參見本書) Statement對象public class Test public static void main(String args) try Class.forName(com.mysql.jdbc.Driver);String url=jdbc:mysql:/localhost:3306/study?user=root&password=;Connection conn=DriverManager.getConnection(url);Statement Stmt
38、=conn.createStatement();String sqlQuery=select*from student;ResultSet rs=Stmt.executeQuery(sqlQuery);while(rs.next()System.out.print(rs.getString(sno)+t);System.out.print(rs.getString(sname)+t);System.out.print(rs.getString(ssex)+t);System.out.print(rs.getInt(sage)+t);System.out.println(rs.getString
39、(sdept); catch (ClassNotFoundException e) e.printStackTrace(); catch (SQLException e) e.printStackTrace();14.4.5 PreparedStatement接口PreparedStatement接口和Statement類的不同之處在于PreparedStatement類對象會將傳入的SQL命令事先編譯等待使用,當(dāng)有單一的SQL指令需多次執(zhí)行時(shí),用PreparedStatement會比Statement效率更高。PreparedStatement接口的主要方法(請參見本書) ResultSet
40、MetaData getMetaData();取得ResultSet類對象有關(guān)字段的相關(guān)信息ResultSet executeQuery():使用SELECT命名對數(shù)據(jù)庫進(jìn)行查詢。int executeUpdate():使用insertdeleteupdate對數(shù)據(jù)庫進(jìn)行新增、刪除和修改操作。ResultSetMetaData getMetaData();取得ResultSet類對象有關(guān)字段的相關(guān)信息void setXXX(int parameterIndex,XXX x):給PreparedStatement類對象的IN參數(shù)設(shè)定為XXX類型的值,這里的XXX可為int、float、Strin
41、g、Date和Time。void setArray(int index,Array x):設(shè)置為數(shù)組類型。PreparedStatement對象執(zhí)行帶參數(shù)的SQL語句public class Test public static void main(String args) try Class.forName(com.mysql.jdbc.Driver);String url=jdbc:mysql:/localhost:3306/study?user=root&password=;Connection conn=DriverManager.getConnection(url);Prepared
42、Statement prepStmt=conn.prepareStatement(select*from student where ssex=?);prepStmt.setString(1, 男);ResultSet rs=prepStmt.executeQuery();while(rs.next()System.out.print(rs.getString(sno)+t);System.out.print(rs.getString(sname)+t);System.out.print(rs.getString(ssex)+t);System.out.print(rs.getInt(sage
43、)+t);System.out.println(rs.getString(sdept);rs.close();prepStmt.close();conn.close(); catch (ClassNotFoundException e) e.printStackTrace(); catch (SQLException e) e.printStackTrace();14.4.6 CallableStatement接口與Java執(zhí)行MySQL存儲過程的程序舉例CallableStatement接口用于執(zhí)行對數(shù)據(jù)庫已存儲過程的調(diào)用。在CallableStatement對象中,有一個(gè)通用的成員方法ca
44、ll,這個(gè)方法以名稱的方式調(diào)用數(shù)據(jù)庫中的存儲過程。在數(shù)據(jù)庫調(diào)用過程中,可以通過設(shè)置IN參數(shù)向調(diào)用的存儲過程提供執(zhí)行所需的參數(shù)。另外,在存儲過程的調(diào)用中,通過OUT參數(shù)獲取存儲過程的執(zhí)行結(jié)果。 CallableStatement 接口的主要成員方法(請參見本書P268、269)例14-8 利用JDBC接口調(diào)用MySql的存儲過程Query_Student和Query_Study1。 14.4.7 Java數(shù)據(jù)類型和SQL中支持的數(shù)據(jù)類型的對應(yīng)關(guān)系 Java的基本數(shù)據(jù)類型和SQL中支持的數(shù)據(jù)類型有一定的對應(yīng)關(guān)系。這種對應(yīng)關(guān)系如表14-1所示(請參見本書P270)。14.4.8 ResultSet接
45、口ResultSet接口負(fù)責(zé)存儲查詢數(shù)據(jù)庫的結(jié)果。并提供一系列的方法對數(shù)據(jù)庫進(jìn)行新增、刪除和修改操作;也負(fù)責(zé)維護(hù)一個(gè)記錄指針(Cursor),記錄指針指向數(shù)據(jù)表中的某個(gè)記錄,通過適當(dāng)?shù)囊苿佑涗浿羔?,可以隨心所欲的存取數(shù)據(jù)庫,加強(qiáng)程序的效率。ResultSet接口主要方法(請參見本書P270)boolean next():移動記錄指針到結(jié)果集的下一條記錄,若移動成功返回true.類型 get類型(int columnIndex)或者 類型 get類型(String columnName):讀取結(jié)果集中當(dāng)前行的指定字段值。boolean absolute(int row):移動記錄指針到結(jié)果集的指
46、定的記錄。void beforeFirst():移動記錄指針到結(jié)果集的第一條記錄之前。void afterLast():移動記錄指針到結(jié)果集的最后一條記錄之后。boolean first():移動記錄指針到結(jié)果集的第一條記錄。boolean last():移動記錄指針到結(jié)果集的最后一條記錄。boolean previous():移動記錄指針到結(jié)果集的上一條記錄。ResultSetMetaData getMetaData():取得ResultSetMetaData類對象。14.4.9 ResultSetMetaData接口 ResultSetMetaData接口的對象保存了所有ResultSet
47、類對象中關(guān)于字段的元信息,并提供許多方法來取得這些信息。 ResultSetMetaData接口中的方法int getColumnCount():取得ResultSet對象的字段個(gè)數(shù)。Int getColumnDisplaySize():取得ResultSet對象的字段長度。String getColumnName(int column):取得ResultSet對象的字段名稱。String getColumnTypeName(int column):取得ResultSet對象的字段類型名稱String getTableName(int column):取得ResultSet對象的字段所屬數(shù)據(jù)表
48、的名稱。14.4.10 DatabaseMetaData接口 DatabaseMetaData接口保存了數(shù)據(jù)庫的所有特性,并且提供許多方法來取得這些信息。 DatabaseMetaData類的主要方法:String getDatabaseProductName(): 取得數(shù)據(jù)名稱。String getURL():取得連接數(shù)據(jù)庫的JDBC URL。String getUserName():取得登陸數(shù)據(jù)庫的使用者賬號。14.5基于C/S模式的學(xué)生信息數(shù)據(jù)庫管理系統(tǒng)的開發(fā)本節(jié)利用前面建立的MySQL的數(shù)據(jù)庫Study,對數(shù)據(jù)庫中表student進(jìn)行插入、修改、刪除和查詢的Java程序設(shè)計(jì)。這些程序設(shè)
49、計(jì)實(shí)例在設(shè)計(jì)時(shí),考慮了通用性原則,應(yīng)用了通用性的程序設(shè)計(jì)技術(shù)。其好處是:你可以利用本節(jié)示范的程序設(shè)計(jì)例子很容易編寫訪問其它數(shù)據(jù)庫的Java應(yīng)用程序。 14.5基于C/S模式的學(xué)生信息數(shù)據(jù)庫管理系統(tǒng)的開發(fā)例14-9 利用前面建立的MySQL的數(shù)據(jù)庫Study,對數(shù)據(jù)庫中表student進(jìn)行插入、修改、刪除和瀏覽。開發(fā)學(xué)生信息管理系統(tǒng)時(shí),程序設(shè)計(jì)時(shí)考慮原則包括以下兩個(gè)方面。(1)數(shù)據(jù)庫應(yīng)用程序架構(gòu)上,采用C/S的多次設(shè)計(jì)模式,使得程序結(jié)構(gòu)清晰,各層功能相互獨(dú)立,各個(gè)層次只能對其下層進(jìn)行調(diào)用,使得整個(gè)系統(tǒng)易于維護(hù)和修改。整個(gè)學(xué)生的信息管理系統(tǒng)分為三層結(jié)構(gòu)(從上層到下層)第1層,視圖層(用戶界面層):
50、用于管理信息的顯示,是與用戶交互的圖形界面。第2層,數(shù)據(jù)庫訪問層:完成數(shù)據(jù)庫的所有操作。第3層,實(shí)體層:對數(shù)據(jù)庫的每個(gè)對象基表,都定義了Java中對應(yīng)的實(shí)體類。(2)通用性原理,應(yīng)用通用性的程序設(shè)計(jì)技術(shù)。其好處是:可以利用本節(jié)示范的程序設(shè)計(jì)例子很容易編寫出Java訪問其他數(shù)據(jù)庫的應(yīng)用程序。14.5.1 創(chuàng)建實(shí)體層Bean針對Study數(shù)據(jù)庫中的表student,該表包含的字段有:學(xué)號Sno、姓名Sname、性別Ssex、年齡Sage和所在的系Sdept。編寫student對應(yīng)的實(shí)體類代碼如下:/Student.java14.5.2 創(chuàng)建數(shù)據(jù)庫訪問層:插入、修改、刪除和瀏覽訪問數(shù)據(jù)庫層由Stud
51、entManager.java和DBConnection.java組成。1.DBConnection.java的程序設(shè)計(jì)DBConnection類定義了訪問MySQL數(shù)據(jù)庫的打開連接和關(guān)閉操作。如果要連接其他類型的數(shù)據(jù)庫,只要修改此類中的變量driverClassName和url的值就可以了,而不影響整個(gè)系統(tǒng)的其他代碼。2.StudentManager.java的程序設(shè)計(jì)StudentManager類封裝了訪問student表的插入、修改、刪除和查詢操作。14.5.3創(chuàng)建用戶圖形界面層:主窗口、主菜單、插入、修改、刪除和瀏覽用戶圖形界面層GUI,由主類Main.java、主窗口主菜單MainF
52、rame.java、插入記錄界面AddStudentPanel.java、修改記錄界面 UpdateStudentPanel.java、刪除記錄界面DeleteStudentPanel.java、瀏覽學(xué)生信息界面ListStudentPanel.java和公用界面StudentUI.java組成。其中StudentUI.java定義了一個(gè)學(xué)生信息的顯示界面,可作為圖形組件被組合在插入、修改、刪除的圖形界面中。下面分別介紹它們的程序設(shè)計(jì)特點(diǎn)。1.主類Main.java和主要窗口主菜單MainFrame.java程序設(shè)計(jì)2.編輯學(xué)生信息界面的通用類StudentUI的程序設(shè)計(jì)3.添加學(xué)生記錄界面的
53、程序設(shè)計(jì)4.修改學(xué)生記錄界面的程序設(shè)計(jì)5.刪除學(xué)生記錄的界面程序設(shè)計(jì)6.瀏覽學(xué)生所有記錄的界面程序設(shè)計(jì)1.類JTableJTable組件屬于javax.swing包,它能以二維表的形式顯示數(shù)據(jù)。類JTable在顯示數(shù)據(jù)時(shí)具有以下特點(diǎn): (1)可定制性:可以定制數(shù)據(jù)的顯示方式和編輯狀態(tài); (2)異構(gòu)性:可以顯示不同類型的數(shù)據(jù)對象,甚至包括顏色、圖標(biāo)等復(fù)雜對象;(3)簡便性:可以以缺省方式輕松地建立起一個(gè)二維表。 使用類JTable顯示數(shù)據(jù)之前,必須根據(jù)情況先生成定制的表格模型、單元繪制器或單元編輯器。類AbstractListModel用來定制用戶自己的表格模型。 創(chuàng)建JTable的表格對象時(shí),
54、將捆綁定制的表格模型。例如: JTable table = new JTable(dataModel); /dataModel是定制的表格模型對象 JScrollPane scrollpane = new JScrollPane(table); /將表格添加到可滾動的面板14.6 JTable組件與應(yīng)用實(shí)例:以表格形式顯示數(shù)據(jù)庫內(nèi)容2.類AbstractTableModel類AbstractTableModel,提供了TableModel接口中絕大多數(shù)方法的缺省實(shí)現(xiàn)。類AbstractTableModel隸屬于javax.swing.table。該類是一個(gè)抽象類,沒有完全實(shí)現(xiàn),不能實(shí)例化,使用
55、時(shí)必須在程序中實(shí)現(xiàn)方法。要想生成一個(gè)具體的TableModel作為AbstractTableMode的子類,至少必須實(shí)現(xiàn)下面以下三個(gè)方法: public int getRowCount(); /得到表格的行數(shù) public int getColumnCount(); /得到表格的行數(shù) public Object getValueAt(int row, int column); /得到表格的第row行、第column列的單元值14.6 JTable組件與應(yīng)用實(shí)例:以表格形式顯示數(shù)據(jù)庫內(nèi)容14.6 JTable組件與應(yīng)用實(shí)例:以表格形式顯示數(shù)據(jù)庫內(nèi)容2.類AbstractTableModel例如,
56、我們可以建立一個(gè)簡單二維表(1010),實(shí)現(xiàn)方法如下:TableModel dataModel = new AbstractTableModel() /定制自己的表格模型 public int getColumnCount() return 10; public int getRowCount() return 10; public Object getValueAt(int row, int col) return new Integer(row*col); ;JTable table = new JTable(dataModel);/捆綁定制的表格模型JScrollPane scrollp
57、ane = new JScrollPane(table); /將表格添加到可滾動的面板 例14-10以表格格式顯示數(shù)據(jù)庫的查詢結(jié)果的程序設(shè)計(jì)。此程序運(yùn)行時(shí),用戶能自定義要查詢的SQL語句,包括單表查詢、多表查詢,有條件的查詢、無條件的查詢,以及對表的統(tǒng)計(jì)查詢。運(yùn)行的結(jié)果以二維表格的形式表現(xiàn)。程序設(shè)計(jì)思路如下:為了在用戶界面上以二維表格形式表現(xiàn)查詢結(jié)果,可以利用JTable表格類和AbstractTableModel表格模型類。用JTable類以二維表的形式顯示,數(shù)據(jù)表格中的數(shù)據(jù)從表格模型 AbstractTableModel類的對象中獲取。下面先介紹這兩個(gè)類。14.6 JTable組件與應(yīng)用實(shí)
58、例:以表格形式顯示數(shù)據(jù)庫內(nèi)容例14-10以表格格式顯示數(shù)據(jù)庫的查詢結(jié)果的程序設(shè)計(jì)。此程序運(yùn)行時(shí),用戶能自定義要查詢的SQL語句,包括單表查詢、多表查詢,有條件的查詢、無條件的查詢,以及對表的統(tǒng)計(jì)查詢。運(yùn)行的結(jié)果以二維表格的形式表現(xiàn)。程序設(shè)計(jì)思路如下:為了在用戶界面上以二維表格形式表現(xiàn)查詢結(jié)果,可以利用JTable表格類和AbstractTableModel表格模型類。用JTable類以二維表的形式顯示,數(shù)據(jù)表格中的數(shù)據(jù)從表格模型 AbstractTableModel類的對象中獲取。14.6 JTable組件與應(yīng)用實(shí)例:以表格形式顯示數(shù)據(jù)庫內(nèi)容在例14-10中,為了實(shí)現(xiàn)在表格中顯示數(shù)據(jù)庫的查詢結(jié)果,用一個(gè)TableModel對象把ResultSet數(shù)據(jù)提供給JTable,在JTable中顯示查詢結(jié)果。 ResultSetTableModel類執(zhí)行與數(shù)據(jù)庫的連接和生成ResultSet對象。 DispalyQueryResults類創(chuàng)建GUI,并建立JTable的對象,并從ResultStTableModel的對象中獲得數(shù)據(jù)。 14.6 JTable組件與應(yīng)用實(shí)例:以表格形式顯示數(shù)據(jù)庫內(nèi)容 ResultStTableModel類的構(gòu)造方法接收三個(gè)參數(shù):數(shù)據(jù)庫驅(qū)動程序列的名稱、
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 培訓(xùn)學(xué)校租場地合同
- 員工關(guān)系管理的工作重點(diǎn)計(jì)劃
- 二零二五快遞駕駛員聘用合同書
- 二零二五版合同范文債轉(zhuǎn)股協(xié)議
- 煤炭貿(mào)易居間合同范例
- 連鎖飯店承包經(jīng)營合同書二零二五年
- 廠房出售買賣合同范例
- 小學(xué)二年級體育暑期活動計(jì)劃
- 村級水渠維修工程合同(2篇)
- 網(wǎng)絡(luò)安全防護(hù)研究計(jì)劃
- 南開一模試題及答案物理
- 茶葉生產(chǎn)關(guān)鍵影響因素與高產(chǎn)栽培技術(shù)研究
- 2025年入團(tuán)考試練習(xí)試題(100題)附答案
- JGJ/T235-2011建筑外墻防水工程技術(shù)規(guī)程
- (正式版)HG∕T 21633-2024 玻璃鋼管和管件選用規(guī)定
- 浙江省寧波市鄞州區(qū)2023 學(xué)年第二學(xué)期八年級科學(xué)期中考試試卷
- 中華民族共同體概論課件專家版2第二講 樹立正確的中華民族歷史觀
- IEC61400-3海上風(fēng)力發(fā)電機(jī)組設(shè)計(jì)要求-中文版
- 在教學(xué)中如何調(diào)動學(xué)生的學(xué)習(xí)積極性
- 危險(xiǎn)源風(fēng)險(xiǎn)告知卡(高清版)
- 某企業(yè)網(wǎng)絡(luò)安全建設(shè)方案
評論
0/150
提交評論