Java 2教程第7版 課件 第11章-JDBC數(shù)據(jù)庫操作_第1頁
Java 2教程第7版 課件 第11章-JDBC數(shù)據(jù)庫操作_第2頁
Java 2教程第7版 課件 第11章-JDBC數(shù)據(jù)庫操作_第3頁
Java 2教程第7版 課件 第11章-JDBC數(shù)據(jù)庫操作_第4頁
Java 2教程第7版 課件 第11章-JDBC數(shù)據(jù)庫操作_第5頁
已閱讀5頁,還剩37頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第11章JDBC數(shù)據(jù)庫操作

JDBC提供了一套標(biāo)準(zhǔn)的API讓Java程序能夠方便地與各種數(shù)據(jù)庫進(jìn)行交互。主要操作步驟包括加載驅(qū)動、建立連接、創(chuàng)建執(zhí)行對象、執(zhí)行SQL語句和關(guān)閉資源。導(dǎo)讀主要內(nèi)容MySQL數(shù)據(jù)庫管理系統(tǒng)連接MySQL數(shù)據(jù)庫JDBC連接數(shù)據(jù)庫查詢操作更新、添加與刪除操作使用預(yù)處理語句事務(wù)批處理重點和難點重點:創(chuàng)建數(shù)據(jù)源和掌握J(rèn)DBC連接的方法;實現(xiàn)查詢功能

難點:預(yù)處理,事務(wù)§11.1MySQL數(shù)據(jù)庫管理系統(tǒng)MySQL數(shù)據(jù)庫管理系統(tǒng),簡稱MySQL,是世界上最流行的開源數(shù)據(jù)庫管理系統(tǒng),其社區(qū)版(MySQLCommunityEdition)是最流行的免費下載的開源數(shù)據(jù)庫管理系統(tǒng)。MySQL最初由瑞典MySQLAB公司開發(fā),目前由Oracle公司負(fù)責(zé)源代碼的維護(hù)和升級,Oracle將MySQL分為社區(qū)版和商業(yè)版,并保留MySQL開放源碼這一特點。目前許多應(yīng)用開發(fā)項目都選用MySQL,其主要原因是MySQL的社區(qū)版性能卓越,滿足許多應(yīng)用已經(jīng)綽綽有余,而且MySQL的社區(qū)版是開源數(shù)據(jù)庫管理系統(tǒng)、可以降低軟件的開發(fā)和使用成本。1.下載/downloads/mysql/選擇Windows(x86,64-bit),ZIPArchive8.0.21111.1M,然后單擊Download(下載)按鈕2.安裝mysql-8.0.21-winx64.zip解壓縮到本地計算機(jī)即可,例如解壓縮到D:\,形成的目錄結(jié)構(gòu)。

11.2啟動MySQL數(shù)據(jù)庫服務(wù)器

1.初始化MySQL8.0.21,在啟動之前必須進(jìn)行安全初始化。以管理員身份在命令行進(jìn)入MySQL安裝目錄的bin子目錄,鍵入mysqld--initialize命令:D:\mysql-8.0.21-winx64\bin>mysqld

--initialize其作用是初始化data目錄,并授權(quán)一個root用戶。執(zhí)行成功后,MySQL安裝目錄下多出一個data子目錄(用于存放數(shù)據(jù)庫,對于早期版本,安裝后就有該目錄)對Win10系統(tǒng),root的初始密碼是隨機(jī)的,對于Win7系統(tǒng),root初始是無密碼單擊桌面左下角,然后選擇Windows系統(tǒng),在下拉列表中的“命令提示符”上單擊鼠標(biāo)右鍵,選擇“以管理員身份運行”

11.2啟動MySQL數(shù)據(jù)庫服務(wù)器

2.啟動用管理員身份啟動命令行窗口,然后進(jìn)入MySQL安裝目錄的bin子目錄,對于Win10操作系統(tǒng),然后鍵入:netstartmysql(Win7鍵

入mysqld),回車確認(rèn),啟動MySQL數(shù)據(jù)庫服務(wù)器(以后再啟動MySQL就不需要初始化了)Win7系統(tǒng),鍵

入:mysqld,回車確認(rèn),啟動MySQL數(shù)據(jù)庫服務(wù)器,成功后MySQL數(shù)據(jù)庫服務(wù)器將占用當(dāng)前MS-DOS窗口,但無任何信息提示。3.root用戶MySQL數(shù)據(jù)庫服務(wù)器啟動后,MySQL默認(rèn)授權(quán)可以訪問該服務(wù)器的用戶只有一個,名字是root,(Win7系統(tǒng)root初始密碼為空,即無密碼)。用管理員身份打開另一個命令行窗口,使用mysqladmin命令確認(rèn)root用戶和root用戶的密碼,或確認(rèn)root用戶,并修改root用戶的密碼。在新的命令行窗口進(jìn)入MySQL的安裝目錄:D:\mysql-8.0.15-winx64\bin,使用mysqladmin命令:mysqladmin-uroot-ppassword11.3MySQL客戶端管理工具教材使用的是NavicatforMySQL(比較盛行的),讀者可以在搜索引擎搜索NavicatforMySQL或登錄:/download下載試用版或購買商業(yè)版,例如下載navicat150_mysql_cs_x64.exe安裝即可(也可以到/s/1o79U6ds下載)啟動navicatforMySQL出現(xiàn)主界面,如圖11.8所示。1.建立連接啟動navicatforMySQL后,單擊主界面(圖11.8)上的“連接”選項卡,出現(xiàn)如圖示意的建立連接對話框。在該對話框輸入如下信息:2.建立數(shù)據(jù)庫選擇一個連接,比如gengxiangyi,單擊鼠標(biāo)右鍵,選擇“打開連接”,以便通過該連接在MySQL數(shù)據(jù)庫服務(wù)器中建立數(shù)據(jù)庫。打開gengxiangyi連接后,在gengxiangyi上單擊鼠標(biāo)右鍵,然后選擇“新建數(shù)據(jù)庫”,在彈出的新建數(shù)據(jù)庫對話框中輸入、選擇有關(guān)信息,比如輸入數(shù)據(jù)庫的名稱、選擇使用的字符編碼。這里建立的數(shù)據(jù)庫的名字是students,選擇的的字符編碼是gb2312(GB2312SimplifiedChinese),如圖所示。3.創(chuàng)建表在主界面上,鼠標(biāo)右鍵單擊gengxiangyi連接下的數(shù)據(jù)庫students,選擇“打開數(shù)據(jù)庫”,主界面上students數(shù)據(jù)庫將呈現(xiàn)打開(連接)狀態(tài),然后鼠標(biāo)右鍵單擊students下的“表”選項,選擇新建表、彈出建表對話框(單擊對話框上的添加欄位可以添加字段,即添加表中的列名),在該對話框中輸入表的字段名(列名)與數(shù)據(jù)類型(如圖所示),其中number字段是主鍵,即要求記錄的number的值必須互不相同。將該表保存為名字是mess的表。這時,數(shù)據(jù)庫students的“表”下將有名字是mess的表。在“表”選擇項單擊鼠標(biāo)左鍵,可以展開“表”,以便管理曾建立的表,比如管理曾建立的mess表。在mess表上單擊鼠標(biāo)右鍵,選擇“打開表”,然后在彈出的對話框中向該表插入記錄(單擊tab鍵可以順序地添加新記錄,或單擊界面下面的“+”或“-”號插入或刪除記錄,單擊“√”保存當(dāng)前的修改),如圖所示意?!?1.4

JDBCJava提供了專門用于操作數(shù)據(jù)庫的API,即JDBC(JavaDataBaseConnection)。JDBC操作不同的數(shù)據(jù)庫僅僅是連接方式上的差異而已,使用JDBC的應(yīng)用程序一旦和數(shù)據(jù)庫建立連接,就可以使用JDBC提供的API操作數(shù)據(jù)庫(如圖).程序經(jīng)常使用JDBC進(jìn)行如下的操作: (1)與一個數(shù)據(jù)庫建立連接。 (2)向數(shù)據(jù)庫發(fā)送SQL語句。(3)處理數(shù)據(jù)庫返回的結(jié)果?!?1.5連接MySQL數(shù)據(jù)庫應(yīng)用程序為了能訪問MySQL數(shù)據(jù)庫服務(wù)器上的數(shù)據(jù)庫,必須保證應(yīng)用程序所駐留的計算機(jī)上安裝有相應(yīng)的JDBC-MySQL數(shù)據(jù)庫連接器(數(shù)據(jù)庫驅(qū)動)。Java應(yīng)用程序加載相應(yīng)的數(shù)據(jù)庫連接器(數(shù)據(jù)庫驅(qū)動)之后,就可以使用JDBC和數(shù)據(jù)庫建立連接、操作數(shù)據(jù)庫。1.下載JDBC-MySQL數(shù)據(jù)庫驅(qū)動可以登錄MySQL的官方網(wǎng)站:/downloads/connector/j/下載JDBC-MySQL數(shù)據(jù)庫驅(qū)動(JDBCDriverforMySQL)。教材下載的是mysql-connector-java-8.0.21.zip,將該zip文件解壓至硬盤,在解壓后的目錄下的mysql-connector-java-8.0.21.jar文件就是連接MySQL數(shù)據(jù)庫的JDBC-MySQL數(shù)據(jù)庫連接器(作者也將該文件放在了教學(xué)資源的源代碼文件夾中)。將mysql-connector-java-8.0.21.jar保存到應(yīng)用程序的當(dāng)前目錄中(比如C:\chapter11),使用-cp參數(shù)(加載程序需要的jar文件中的類),如下運行應(yīng)用程序:

C:\chapter11>java-cpmysql-connector-java-8.0.21.jar主類需要特別注意的是,-cp參數(shù)給出的jar文件和主類名之間空格分隔。有關(guān)jar文件的知識見4.16或:C:\chapter11>java-cp*;.Example11_12.加載JDBC-MySQL數(shù)據(jù)庫驅(qū)動應(yīng)用程序負(fù)責(zé)加載的JDBC-MySQL數(shù)據(jù)庫驅(qū)動,代碼如下:try{Class.forName("com.mysql.cj.jdbc.Driver");}catch(Exceptione){}MySQL數(shù)據(jù)庫驅(qū)動被封裝在Driver類中,該類的的包名是com.mysql.cj.jdbc,該類不是Java運行環(huán)境類庫中的類,(而是在數(shù)據(jù)庫連接器中,比如mysql-connector-java-8.0.21.jar中,有關(guān)jar文件知識見4.16節(jié))(注意字符序列和8.0版本之前的com.mysql.jdbc.Driver不同)本章為了調(diào)試程序方便,將下載的數(shù)據(jù)庫連接器mysql-connector-java-8.0.21.jar保存到C:\chapter11目錄中。如下運行:C:\chapter11>java-cp*;.主類例如:C:\chapter11>java-cp*;.Example11_1C:\chapter11>java-cp*;.Example11_2等等3.連接數(shù)據(jù)庫應(yīng)用程序要和MySQL數(shù)據(jù)庫服務(wù)器管理的數(shù)據(jù)庫students(在11.3節(jié)建立的數(shù)據(jù)庫)建立連接,而有權(quán)訪問數(shù)據(jù)庫students的用戶的id和密碼分別是root和空,那么使用ConnectiongetConnection(java.lang.String)方法建立連接的代碼如下:Connectioncon;Stringuri="jdbc:mysql://:3306/students?"+"user=root&password=&useSSL=false&serverTimezone=GMT";try{con=DriverManager.getConnection(uri);//連接代碼

}catch(SQLExceptione){

System.out.println(e);}如果root用戶密碼是99,將&password=更改為&password=99即可對于MySQL8.0和后續(xù)版本,必須要設(shè)置serverTimezone參數(shù)的值(值可以是MySQL8.0支持的時區(qū)之一即可,例如EST,CST,GMT等).中國標(biāo)準(zhǔn)時間,可以使用

Asia/Shanghai使用ConnectiongetConnection(java.lang.String,java.lang.String,java.lang.String)方法建立連接的代碼如下:Connectioncon;Stringuri="jdbc:mysql://:3306/students?"+"useSSL=false&serverTimezone=GMT";Stringuser="root";Stringpassword="";try{con=DriverManager.getConnection(uri,user,password);//連接代碼

}catch(SQLExceptione){

System.out.println(e);}//指定中國標(biāo)準(zhǔn)時間,可以使用Asia/Shanghai作為時區(qū)標(biāo)識符:Stringuri="jdbc:mysql://localhost:3306/students?"+useSSL=true&serverTimezone=Asia/Shanghai";4.注意漢字問題需要特別注意的是,如果數(shù)據(jù)庫的表中的記錄有漢字,那么在建立連接時需要額外多傳遞一個參數(shù)characterEncoding,并取值gbk或utf-8

Stringuri="jdbc:mysql://localhost/students?"+"useSSL=true&serverTimezone=GMT&characterEncoding=utf-8";con=DriverManager.getConnection(uri,"root","");//連接代碼11.6查詢操作

查詢操作的具體步驟如下1.得到SQL查詢語句對象try{Statementsql=con.createStatement();}catch(SQLExceptione){}2.處理查詢結(jié)果有了SQL語句對象后,這個對象就可以調(diào)用相應(yīng)的方法實現(xiàn)對數(shù)據(jù)庫中表的查詢和修改,并將查詢結(jié)果存放在一個ResultSet類聲明的對象中。也就是說SQL查詢語句對數(shù)據(jù)庫的查詢操作將返回一個ResultSet對象,ResultSet對象是按“列”(字段)組織的數(shù)據(jù)行構(gòu)成。ResultSet

rs=sql.executeQuery("SELECT*FROMstudents");結(jié)果集rs的列數(shù)是4列,剛好和students的列數(shù)相同對于ResultSet

rs=sql.executeQuery("SELECTname,heightFROMstudents");

內(nèi)存的結(jié)果集對象rs列數(shù)只有兩列,第一列是name列,第2列是height列ResultSet對象一次只能看到一個數(shù)據(jù)行,使用next()方法移到下一個數(shù)據(jù)行,獲得一行數(shù)據(jù)后,ResultSet對象可以使用getXxx方法獲得字段值(列值),將位置索引(第一列使用1,第二列使用2等)或列名傳遞給getXxx方法的參數(shù)即可。表11.1給出了ResultSet對象的若干方法。無論字段是何種屬性,總可以使用getString(intcolumnIndex)或getString(StringcolumnName)方法返回字段值的串表示3.關(guān)閉連接ResultSet對象和數(shù)據(jù)庫連接對象(Connection對象)實現(xiàn)了緊密的綁定,一旦連接對象被關(guān)閉,ResultSet對象中的數(shù)據(jù)立刻消失。這就意味著,應(yīng)用程序在使用ResultSet對象中的數(shù)據(jù)時,就必須始終保持和數(shù)據(jù)庫的連接,直到應(yīng)用程序?qū)esultSet對象中的數(shù)據(jù)查看完畢如果在代碼

ResultSet

rs=sql.executeQuery("SELECT*FROMstudents");之后立刻關(guān)閉連接con.close();程序?qū)o法獲取rs中的數(shù)據(jù)11.6.1順序查詢所謂順序查詢,是指ResultSet對象一次只能看到一個數(shù)據(jù)行,使用next()方法移到下一個數(shù)據(jù)行,next()方法最初的查詢位置,即游標(biāo)位置,位于第一行的前面。next()方法向下(向后、數(shù)據(jù)行號大的方向)移動游標(biāo),移動成功返回true,否則返回false。例子1查詢students數(shù)據(jù)庫中mess表的全部記錄(見11.3節(jié)建立的數(shù)據(jù)庫)。效果如圖(在后續(xù)的例子中,別忘記啟動MySQL數(shù)據(jù)庫服務(wù)器,見11.2節(jié))11.6.2控制游標(biāo)為了得到一個可滾動的結(jié)果集,需使用下述方法獲得一個Statement對象。Statementstmt=con.createStatement(inttype,intconcurrency);例子2將數(shù)據(jù)庫連接的代碼單獨封裝到一個GetDatabaseConnection類中。例子2隨機(jī)查詢students數(shù)據(jù)庫中mess表的2條記錄(見11.3節(jié)建立的數(shù)據(jù)庫),首先將游標(biāo)移動到最后一行,然后再獲取最后一行的行號,以便獲得表中的記錄數(shù)目,本例子用到了第8章例子21中的GetRandomNumber類,該類的static方法:publicstaticint[]getRandomNumber(int

max,intamount)返回1至max之間的amount個不同的隨機(jī)數(shù)11.6.3條件與排序查詢1.where子語句一般格式:

select字段from表名where條件(1)字段值和固定值比較,例如:selectname,heightfrommesswherename='李四'(2)字段值在某個區(qū)間范圍,例如:select*frommesswhereheight>1.60andheight<=1.82.排序用orderby子語句對記錄排序select*frommesswherenamelike'%林%'orderbyname例子3查詢mess表中姓張、身高大于1.65,出生的年份在2000年或2000之前、月份在7月之后的學(xué)生,并按出生日期排序(在運行例子2程序前,我們使用MySQL客戶端管理工具又向mess表添加了一些記錄)。程序運行效果如圖所示(例子3中使用了例子2中GetDBConnection類)。11.7更新、添加與刪除操作1.更新update表set字段=新值where<條件子句>2.添加insertinto表(字段列表)values(對應(yīng)的具體的記錄)或insertinto表values(對應(yīng)的具體的記錄)3.刪除deletefrom表名where<條件子句>例子4向mess插入2條記錄(使用了例子2中GetDBConnection類)11.8使用預(yù)處理語句11.8.1預(yù)處理語句優(yōu)點如果應(yīng)用程序能針對連接的數(shù)據(jù)庫,事先就將SQL語句解釋為數(shù)據(jù)庫底層的內(nèi)部命令,然后直接讓數(shù)據(jù)庫去執(zhí)行這個命令,顯然不僅減輕了數(shù)據(jù)庫的負(fù)擔(dān),而且也提高了訪問數(shù)據(jù)庫的速度。Connection和某個數(shù)據(jù)庫建立了連接對象con,那么con就可以調(diào)用prepareStatement(Stringsql)方法對參數(shù)sql指定的SQL語句進(jìn)行預(yù)編譯處理,生成該數(shù)據(jù)庫底層的內(nèi)部命令,并將該命令封裝在PreparedStatement對象中,那么該對象調(diào)用下列方法都可以使得該底層內(nèi)部命令被數(shù)據(jù)庫執(zhí)行。ResultSet

executeQuery()booleanexecute()int

executeUpdate()11.8.2使用通配符?Stringstr="select*frommesswhereheight<?andname=?"PreparedStatement

sql=con.prepareStatement(str);

在sql對象執(zhí)行之前,必須調(diào)用相應(yīng)的方法設(shè)置通配符?代表的具體值,如:sql.setFloat(1,1.76f);sql.setString(2,"武澤");預(yù)處理SQL語句sql中第1個通配符?代表的值是1.76,第2個通配符?代表的值是'武澤'。通配符按著它們在預(yù)處理SQL語句中從左到右依次出現(xiàn)的順序分別被稱為第1個、第2個、……、第m個通配符。例子5中使用預(yù)處理語句向mess表添加記錄并查詢了姓張的記錄(使用了例子2中GetDBConnection類)。11.9通用查詢本節(jié)的目的是編寫一個類,只要用戶將數(shù)據(jù)庫名、SQL語句傳遞給該類對象,那么該對象就用一個二維數(shù)組返回查詢的記錄。結(jié)果集ResultSet對象rs調(diào)用getMetaData()方法返回一個ResultSetMetaData對象(結(jié)果集的元數(shù)據(jù)對象):ResultSetMetaData

metaData=rs.getMetaData();metaData,調(diào)用getColumnCount()方法就可以返回結(jié)果集rs中的列的數(shù)目:int

columnCount=metaData.getColumnCount();metaData調(diào)用getColumnName(inti)方法就可以返回結(jié)果集rs中的第i列的名字:StringcolumnName=metaData.getColumnName(i);例子6將數(shù)據(jù)庫名以及SQL語句傳遞給Query類的對象,用表格(JTable組件,見9.7.2)顯示查詢到的記錄。效果如圖11.10事

務(wù)11.10.1事務(wù)及處理事務(wù)由一組SQL語句組成,所謂事務(wù)處理是指:應(yīng)用程序保證事務(wù)中的SQL語句要么全部都執(zhí)行,要么一個都不執(zhí)行。11.10.2JDBC事務(wù)處理步驟1.用setAutoCommit(booeanb)方法關(guān)閉自動提交模式2.用commit()方法處理事務(wù)3.用rollback()方法處理事務(wù)失敗下面的例子7使用了事務(wù)處理,將mess表中number字段是R1001的height的值減少n,并將減少的n增加到字段是R1002的height上(使用了例子2中GetDBConnection類)。11.11連接SQLServer數(shù)據(jù)庫加載SQLServer驅(qū)動程序代碼如下:try{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");}catch(Exceptione){}連接的代碼如下:try{Stringuri="jdbc:sqlserver://:1433;DatabaseName=warehouse";Stringuser="sa";Stringpassword="dog123456";con=DriverManager.getConnection(uri,user,password);}catch(SQLExceptione){System.out.println(e);}11.12連接Derby數(shù)據(jù)庫加載Derby數(shù)據(jù)庫驅(qū)動程序的代碼是:Class.forName("org.apache.derby.jdbc.EmbeddedDriver");連接(create取值是true)的代碼是:Connectioncon=DriverManager.getConnection("jdbc:derby:students;create=true");例8使用了Derby數(shù)據(jù)庫管理系統(tǒng)創(chuàng)建了名字是students的數(shù)據(jù)庫,并在數(shù)據(jù)庫中建立了chengji表,效果如圖11.22。11.13連接Access數(shù)據(jù)庫加載Access數(shù)據(jù)庫驅(qū)動程序的代碼是:Class.forName("com.hxtt.sql.access.AccessDriver");連接students.accdb的數(shù)據(jù)庫的代碼是(students.accdb在當(dāng)前目錄下,即C:/chapter11下):例子9和例子1類似,僅僅是把MySQL數(shù)據(jù)庫更換了成Access數(shù)據(jù)庫。StringdatabasePath="./students.accdb";StringloginName="";Stringpassword="";con=DriverManager.getConnection("jdbc:Access://"+databasePath,loginName,password);//

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論