版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《Java面向?qū)ο蟪绦蛟O(shè)計(jì)》數(shù)據(jù)庫(kù)編程應(yīng)用主要內(nèi)容JDBC連接數(shù)據(jù)庫(kù)查詢操作更新、添加與刪除操作查詢Excel電子表格使用預(yù)處理語(yǔ)句事務(wù)難點(diǎn)使用預(yù)處理語(yǔ)句事務(wù)導(dǎo)讀本章將學(xué)習(xí)怎樣使用Java提供的JDBC技術(shù)操作數(shù)據(jù)庫(kù)。JDBC概述JDBC的概念數(shù)據(jù)庫(kù)是收集、存儲(chǔ)和組織數(shù)據(jù)常用的方法,大部分應(yīng)用系統(tǒng)不可避免地需要訪問(wèn)數(shù)據(jù)庫(kù)。
Java語(yǔ)言通過(guò)JDBC(Java
DataBaseConnection,Java數(shù)據(jù)庫(kù)連接)API提供了一個(gè)標(biāo)準(zhǔn)SQL(StructuredQueryLanguage,結(jié)構(gòu)化查詢語(yǔ)言)數(shù)據(jù)庫(kù)訪問(wèn)接口。JDBC的任務(wù)
(1)與一個(gè)數(shù)據(jù)庫(kù)建立連接
(2)向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句
(3)處理數(shù)據(jù)庫(kù)返回的結(jié)果
JDBC是一種低級(jí)的APIJDBC和ODBC及其他API的比較
(1)ODBC不適合在Java中直接使用,因?yàn)樗且粋€(gè)C語(yǔ)言實(shí)現(xiàn)的API,從Java程序調(diào)用本地的C程序會(huì)在安全性、完整性、健壯性方面都有許多缺點(diǎn)。
(2)不能完全精確地實(shí)現(xiàn)從ODBC,C,API到JavaAPI的翻譯。
(3)ODBC很難學(xué),它把簡(jiǎn)單和高級(jí)功能混雜在一起,甚至對(duì)非常簡(jiǎn)單的查詢,其選項(xiàng)也非常復(fù)雜。而JDBC恰好相反,其盡量保證簡(jiǎn)單功能的簡(jiǎn)便性,而同時(shí)在必要時(shí)允許使用高級(jí)功能。
(4)啟用純Java需要象JDBC這樣的JavaAPI
JDBC概述JDBC與數(shù)據(jù)庫(kù)系統(tǒng)獨(dú)立的API包含兩部分,一部分是面向應(yīng)用系統(tǒng)開(kāi)發(fā)人員的JDBCAPI,另一部分是面向驅(qū)動(dòng)程序開(kāi)發(fā)人員的JDBCDriverAPI。Java程序通過(guò)JDBCAPI訪問(wèn)JDBC驅(qū)動(dòng)程序管理器(DriverManager),驅(qū)動(dòng)程序管理器再通過(guò)JDBCDriverAPI訪問(wèn)不同的JDBC驅(qū)動(dòng)程序,從而實(shí)現(xiàn)對(duì)不同類(lèi)型數(shù)據(jù)庫(kù)的訪問(wèn)。JDBC提供了一個(gè)通用的JDBCDriverManager,用來(lái)管理各數(shù)據(jù)庫(kù)軟件商提供的JDBC驅(qū)動(dòng)程序,訪問(wèn)其數(shù)據(jù)庫(kù)。幾乎所有數(shù)據(jù)庫(kù)廠商都提供其數(shù)據(jù)庫(kù)產(chǎn)品的JDBC驅(qū)動(dòng)程序,包括微軟公司的SQLServer2000。JDBCURLJDBCURL是JDBC用來(lái)標(biāo)識(shí)數(shù)據(jù)庫(kù)的方法,JDBC驅(qū)動(dòng)程序管理器根據(jù)JDBCURL選擇正確的驅(qū)動(dòng)程序,由驅(qū)動(dòng)程序識(shí)別該數(shù)據(jù)庫(kù)并與之建立連接。構(gòu)造JDBCURL時(shí)具有特定的規(guī)范。首先,它們應(yīng)允許不同的驅(qū)動(dòng)程序使用不同的方案來(lái)命名數(shù)據(jù)庫(kù)。例如,odbc子協(xié)議允許URL含有屬性值。其次,JDBCURL應(yīng)允許程序員將連接數(shù)據(jù)庫(kù)所需的全部信息編入其中。這樣就可以讓Java程序直接打開(kāi)數(shù)據(jù)庫(kù)連接,而不需要最終用戶去做任何系統(tǒng)管理工作。第三,JDBCURL可指向邏輯主機(jī)或數(shù)據(jù)庫(kù)名,而這種邏輯主機(jī)或數(shù)據(jù)庫(kù)名將由網(wǎng)絡(luò)命名系統(tǒng)動(dòng)態(tài)地轉(zhuǎn)換為實(shí)際的名稱。網(wǎng)絡(luò)命名服務(wù)(例如DNS、NIS)有多種,而對(duì)于使用哪種命名服務(wù)并無(wú)限制。
JDBCURL的標(biāo)準(zhǔn)語(yǔ)法由三部分組成,各部分間用冒號(hào)分隔jdbc:<子協(xié)議>:<子名稱>三個(gè)部分可分解如下:
jdbc:協(xié)議名。JDBCURL中的協(xié)議總是jdbc。
<子協(xié)議>:驅(qū)動(dòng)程序名或數(shù)據(jù)庫(kù)連接機(jī)制(這種機(jī)制可由一個(gè)或多個(gè)驅(qū)動(dòng)程序支持)的名稱。
<子名稱>:一種標(biāo)識(shí)數(shù)據(jù)庫(kù)的方法。子名稱可以依不同的子協(xié)議而變化,使用子名稱的目的是為定位數(shù)據(jù)庫(kù)提供足夠的信息。例如,odbc用于指定ODBC數(shù)據(jù)源名稱的URL的使用。JDBCURL通過(guò)ODBC驅(qū)動(dòng)程序來(lái)訪問(wèn)某個(gè)數(shù)據(jù)庫(kù):
jdbc:odbc:fred
這里,子協(xié)議為odbc,子名稱fred是本地ODBC數(shù)據(jù)源名。例如,通過(guò)Internet訪問(wèn)SQLServer數(shù)據(jù)庫(kù)服務(wù)器,則在JDBCURL中應(yīng)將網(wǎng)絡(luò)地址作為子名稱的一部分包括進(jìn)去。如:jdbc:microsoft:sqlserver://localhost:1433;User=sa;Password=;DatabaseName=DemoDBJDBC-ODBC橋ODBC(OpenDatabaseConnectivity,開(kāi)放數(shù)據(jù)庫(kù)互連)是微軟公司開(kāi)放服務(wù)結(jié)構(gòu)(WindowsOpenServicesArchitecture,WOSA)中有關(guān)數(shù)據(jù)庫(kù)的一個(gè)組成部分。它建立了一組規(guī)范,提供對(duì)數(shù)據(jù)庫(kù)訪問(wèn)的標(biāo)準(zhǔn)API,利用SQL來(lái)完成其大部分任務(wù)。ODBC標(biāo)準(zhǔn)出現(xiàn)較早,幾乎所有的數(shù)據(jù)庫(kù)系統(tǒng)都提供ODBC驅(qū)動(dòng)程序。Sun公司對(duì)沒(méi)有提供相應(yīng)JDBC驅(qū)動(dòng)程序的數(shù)據(jù)庫(kù)系統(tǒng),但開(kāi)發(fā)了特殊的驅(qū)動(dòng)程序:JDBC-ODBC橋,該驅(qū)動(dòng)程序支持JDBC通過(guò)現(xiàn)有的ODBC驅(qū)動(dòng)程序訪問(wèn)相應(yīng)的數(shù)據(jù)庫(kù)系統(tǒng)。JDBC-ODBC橋子協(xié)議名為odbc,允許在子名稱(數(shù)據(jù)源名稱)后面指定任意多個(gè)屬性值。odbc
子協(xié)議的完整語(yǔ)法為
jdbc:odbc:<數(shù)據(jù)資源名稱>[;<屬性名>=<屬性值>]*jdbc:odbc:<數(shù)據(jù)資源名稱>[;<屬性名>=<屬性值>]*表示可有多個(gè)屬性。下面都是合法的jdbc:odbc
名稱:jdbc:odbc:qeor7jdbc:odbc:wombatjdbc:odbc:wombat;CacheSize=20;ExtensionCase=LOWERjdbc:odbc:qeora;UID=kgh;PWD=fooey
使用JDBC開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用常用API介紹:驅(qū)動(dòng)管理類(lèi):getConnection(String
url,String
user,Stringpassword)
用來(lái)獲得數(shù)據(jù)庫(kù)的連接數(shù)據(jù)庫(kù)連接類(lèi)(connection)會(huì)話聲明類(lèi)(Ststement)預(yù)編譯(PreparedStatement)結(jié)果集(ResultSet)接口常用方法連接sql200的完整程序使用JDBC開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用可分為下面幾個(gè)步驟:
(1)裝載驅(qū)動(dòng)程序;(2)建立與數(shù)據(jù)庫(kù)的連接;(3)發(fā)送SQL語(yǔ)句;(4)處理結(jié)果;(5)關(guān)閉數(shù)據(jù)庫(kù)連接1.裝載JDBC驅(qū)動(dòng)程序2.創(chuàng)建與數(shù)據(jù)庫(kù)的連接3.創(chuàng)建語(yǔ)句對(duì)象
-Statement-PreparedStatement4.利用語(yǔ)句對(duì)象執(zhí)行SQL語(yǔ)句得到的結(jié)果5.處理結(jié)果6.JDBC應(yīng)用結(jié)束利用JDBC開(kāi)發(fā)web數(shù)據(jù)庫(kù)步驟數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序
-JDBC:各數(shù)據(jù)廠商提供
-ODBC:sun提供
(sun.jdbc.odbc.JdbcOdbcDriver)1.裝載驅(qū)動(dòng)程序
Class.forName(“驅(qū)動(dòng)名稱”)例:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”)Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver
”)JDBC使用(1)2.連接數(shù)據(jù)庫(kù)
connection
conn=DriverManager.getConnection(url)
connection
conn=DriverManager.getConnection(url,user,password)注意一:采用JDBC-ODBC橋連接,
url=jdbc:odbc:ODBC數(shù)據(jù)源例如:Connectionconn=DriverManager.getConnection(“jdbc:odbc:student”)注意二:DriverManager.getConnection(“jdbc:microsoft:sqlserver://localhost:1433;DatebaseName=SCMIS”)DriverManager.getConnection(“jdbc:microsoft:sqlserver://localhost:1433;DatebaseName=SCMIS”,”john”,”123”)JDBC使用(2)OracleDriver-Oracle.jdbc.driver.OracleDriverURL-jdbc:oracle:thin:@hostname:1521:dbnameSQLServerDriver-com.microsoft.jdbc.sqlserver.SQLServerDriverURL-jdbc:microsoft:sqlserver://hostname:1433;DatebaseName=dbnameMySQLDriver-org.gjt.mm.mysql.DriverURL-jdbc:mysql://hostname:3306/dbnameJDBC-ODBC橋形式Driver-sun.jdbc.odbc.JdbcOdbcDriverURL-
jdbc:odbc:ODBC數(shù)據(jù)源幾種典型數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序和URL3.創(chuàng)建語(yǔ)句對(duì)象-Statement-PreparedStatement例:Statementstmt=conn.createStatement()JDBC使用(3)書(shū)寫(xiě)具體的SQL語(yǔ)句Stringsql="insertintoperson(name,password,age)values(‘john’,’123’,20)“;Stringsql=“updatepersonsetage=age+1“;Stringsql=“deletefrompersonwhereid=2”Stringsql=“select*fromperson“;4.執(zhí)行SQL語(yǔ)句(1)stmt.executeUpdate(sql);返回是所影響記錄的個(gè)數(shù)
Insert;update;delete(2)stmt.executeQuery(sql);返回ResultSet實(shí)例化對(duì)象
select使用JDBC使用(4)5.處理結(jié)果ResultSet的幾個(gè)主要方法介紹如下:next():將游標(biāo)從當(dāng)前位置向下移動(dòng)一行,返回值為boolean。在數(shù)據(jù)處理時(shí),通常用于判斷是否有符合條件的記錄。getString():獲取記錄的數(shù)據(jù)。JDBC使用(5)6.關(guān)閉數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)在每次使用后必須關(guān)閉,關(guān)閉數(shù)據(jù)庫(kù)操作的順序與打開(kāi)數(shù)據(jù)庫(kù)操作的順序相反,即:先關(guān)閉結(jié)果集ResultSet
再關(guān)閉操作Statement
最后關(guān)閉連接Connection例如:
ResultSet.close();
Statement.close();
Connection.close();
JDBC使用(6)連接sql2000的完整程序importjava.sql.*;publicclassL{publicstaticvoidmain(String[]args){Stringsql;Connectionconn;//數(shù)據(jù)庫(kù)連接
Statementstmt;//發(fā)送到數(shù)據(jù)庫(kù)執(zhí)行的SQL命令
ResultSet
rs;//讀取的數(shù)據(jù)
try{//加載sql2000數(shù)據(jù)庫(kù)的紅運(yùn)程序Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
//定義URL連接路徑Stringurl="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=student";Stringuser="sa";//數(shù)據(jù)庫(kù)用戶名
Stringpassword="";//數(shù)據(jù)庫(kù)密碼(為空)
conn=DriverManager.getConnection(url,user,password);//建立數(shù)據(jù)庫(kù)連接
stmt=conn.createStatement();//建立連接聲明
sql="select*frominfo";//定義sql語(yǔ)句
rs=stmt.executeQuery(sql);//執(zhí)行SQL語(yǔ)句
while(rs.next()){//返回不為空System.out.println(rs.getString(1));//打印顯示第一列System.out.println(rs.getString(2));//打印顯示第二列}
rs.close();//關(guān)閉數(shù)據(jù)庫(kù)操作
stmt.close();//關(guān)閉數(shù)據(jù)連接聲明
conn.close();//關(guān)閉數(shù)據(jù)庫(kù)連接}
catch(Exceptione){
e.printStackTrace();//打印錯(cuò)誤棧內(nèi)容}}}JDBC相關(guān)類(lèi)介紹前面介紹了使用JDBC訪問(wèn)數(shù)據(jù)庫(kù)的一般步驟,下面對(duì)其中涉及到的一些類(lèi)和接口再作一個(gè)簡(jiǎn)單的介紹。1.DriverManager類(lèi)
DriverManager
類(lèi)是JDBC的管理層,作用于用戶和驅(qū)動(dòng)程序之間。它跟蹤可用的驅(qū)動(dòng)程序,并在數(shù)據(jù)庫(kù)和相應(yīng)驅(qū)動(dòng)程序之間建立連接。另外,DriverManager
類(lèi)也處理諸如驅(qū)動(dòng)程序登錄時(shí)間限制及登錄和跟蹤消息的顯示等事務(wù)。對(duì)于簡(jiǎn)單的應(yīng)用程序,程序員僅需直接使用該類(lèi)的方法getConnection建立與數(shù)據(jù)庫(kù)的連接。JDBC還允許用戶調(diào)用DriverManager
的方法getDriver、getDrivers
和registerDriver以及Driver的方法connect。Driver為jdbc中定義的一個(gè)接口,每一個(gè)JDBC驅(qū)動(dòng)程序都需要實(shí)現(xiàn)這個(gè)接口。一般情況下不需直接調(diào)用registerDriver,而是在加載驅(qū)動(dòng)程序時(shí)由驅(qū)動(dòng)程序自動(dòng)調(diào)用。加載驅(qū)動(dòng)程序有兩種方法:(1)調(diào)用方法Class.forName顯式地加載驅(qū)動(dòng)程序類(lèi)。這種方法與外部設(shè)置無(wú)關(guān),因此推薦使用這種加載驅(qū)動(dòng)程序的方法。例如,加載SQLServer2000的JDBC驅(qū)動(dòng)程序:Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");(2)將驅(qū)動(dòng)程序添加到j(luò)ava.lang.System
的屬性jdbc.drivers
中,這是一個(gè)由DriverManager
類(lèi)加載的驅(qū)動(dòng)程序類(lèi)名的列表,由冒號(hào)分隔。初始化DriverManager
類(lèi)時(shí),它搜索系統(tǒng)屬性jdbc.drivers,DriverManager
類(lèi)將試圖加載該屬性指定的驅(qū)動(dòng)程序。程序員可在Java虛擬機(jī)的配置文件中設(shè)置系統(tǒng)屬性jdbc.drivers。這種方法很少使用。DriverManager類(lèi)常用的方法有,用于建立與數(shù)據(jù)庫(kù)的連接:
staticvoidderegisterDriver(Driverdriver):從驅(qū)動(dòng)程序列表中刪除已登記的驅(qū)動(dòng)程序。
staticConnection getConnection(String
url)。
staticConnection getConnection(String
url,Propertiesinfo)。
staticConnection getConnection(String
url,Stringuser,Stringpassword)。用于獲得或設(shè)置連接數(shù)據(jù)庫(kù)時(shí)驅(qū)動(dòng)程序與可以等待的最大時(shí)間staticDriver getDriver(String
url):根據(jù)JDBCURL獲得對(duì)應(yīng)的驅(qū)動(dòng)程序。staticEnumeration getDrivers():獲取當(dāng)前已裝載的JDBC驅(qū)動(dòng)程序列表。staticint
getLoginTimeout()。staticvoidsetLoginTimeout(intseconds)。用于獲得或設(shè)置寫(xiě)日志的PrintWriter對(duì)象staticPrintWriter
getLogWriter()staticvoid setLogWriter(PrintWriterout)staticvoid println(Stringmessage):輸出信息到當(dāng)前JDBC日志流staticvoid registerDriver(Driverdriver):登記給定的JDBC驅(qū)動(dòng)程序。DriverManager類(lèi)的靜態(tài)方法getConnection用于與數(shù)據(jù)庫(kù)建立連接,返回一個(gè)Connection接口類(lèi)型的對(duì)象,用于表示JDBC驅(qū)動(dòng)程序與數(shù)據(jù)庫(kù)的連接。getConnection方法遍歷驅(qū)動(dòng)程序清單,將URL及參數(shù)傳遞給驅(qū)動(dòng)程序類(lèi)的connect方法,如果驅(qū)動(dòng)程序支持該URL指定的子協(xié)議和子名稱,則連接數(shù)據(jù)庫(kù)并返回Connection對(duì)象。Statement接口及其子接口向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句的任務(wù)是由Statement對(duì)象完成的,Connection對(duì)象可以創(chuàng)建三種類(lèi)型的Statement對(duì)象。它們分別是:
(1)Statement:用于執(zhí)行不帶參數(shù)的簡(jiǎn)單SQL語(yǔ)句。
(2)PreparedStatement:用于執(zhí)行預(yù)編譯的SQL語(yǔ)句,并允許在SQL語(yǔ)句中使用IN參數(shù)。
(3)Callablestatement:用于執(zhí)行數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的調(diào)用。它允許使用IN、OUT或INOUT三種類(lèi)型的參數(shù)。Statement對(duì)象用于執(zhí)行靜態(tài)SQL語(yǔ)句(即不帶參數(shù)的SQL語(yǔ)句)并獲取處理結(jié)果。創(chuàng)建一個(gè)Statement對(duì)象,需調(diào)用Connection的方法createStatement。一般形式如下:Connectionconn=DriverManager.getConnection(URL,"USER","password");Statementstmt=conn.createStatement();
創(chuàng)建了Statement對(duì)象后,可調(diào)用其中的方法執(zhí)行SQL語(yǔ)句。JDBC中提供了三種執(zhí)行方法:execute、executeQuery和executeUpdate。executeUpdate方法
executeUpdate方法的形式為
publicint
executeUpdate(String
sql)throwSQLException
方法一般用于執(zhí)行SQL的INSERT、UPDATE或DELETE語(yǔ)句,或者執(zhí)行無(wú)返回值的SQLDDL語(yǔ)句(即SQL數(shù)據(jù)定義語(yǔ)言),如CREATE或DROP等。當(dāng)執(zhí)行INSERT等SQL語(yǔ)句時(shí),此方法的返回值是這個(gè)SQL語(yǔ)句所影響的記錄的總行數(shù)。若返回值為0,則表示執(zhí)行未對(duì)數(shù)據(jù)庫(kù)造成影響。若執(zhí)行的語(yǔ)句是SQLDDL語(yǔ)句,返回值也是0。例一、使用executeUpdate執(zhí)行SQL語(yǔ)句。publicclassInsertRec{ publicstaticvoidmain(String
args[]) { Stringurl="jdbc:odbc:AccessDB"; try{//加載jdbc-odbcbridge驅(qū)動(dòng)程序
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//Class.forName("com.ms.jdbc.odbc.JdbcOdbcDriver");//VisualJ++//與驅(qū)動(dòng)器建立連接
Connectioncon=DriverManager.getConnection(url);//創(chuàng)建一個(gè)Statement對(duì)象
Statementstmt=con.createStatement();//執(zhí)行SQL語(yǔ)句intcount1=stmt.executeUpdate("INSERTINTOtable1(name,sex,age)VALUES('吳化龍','男',30)");intcount2=stmt.executeUpdate("INSERTINTOtable1(name,sex,age)VALUES('王一飛','男',28)");//打印執(zhí)行結(jié)果
System.out.println("Insertsuccessfully!");
System.out.println("Updatedrowsis"+(count1+count2)+".");//關(guān)閉連接stmt.close();
con.close(); }catch(Exceptionex){ //打印異常信息
System.out.println(ex.getMessage()); } }}execute方法的形式為
publicboolean
execute(String
sql)throwSQLException
這個(gè)方法比較特殊,一般只有在用戶不知道執(zhí)行SQL語(yǔ)句后會(huì)產(chǎn)生什么結(jié)果或可能有多種類(lèi)型的結(jié)果產(chǎn)生時(shí)才會(huì)使用。例如,執(zhí)行一組既包含DELETE語(yǔ)句又包含了SELECT語(yǔ)句的SQL命令,執(zhí)行后既產(chǎn)生了一個(gè)ResultSet,又影響了相關(guān)記錄,有兩種類(lèi)型的結(jié)果產(chǎn)生,這時(shí)必須用方法execute()執(zhí)行以獲取完整的結(jié)果。execute()的執(zhí)行結(jié)果允許產(chǎn)生多個(gè)ResultSet,或多條記錄被影響,或是兩者都有。由于執(zhí)行結(jié)果的特殊性,因此對(duì)調(diào)用execute后產(chǎn)生的結(jié)果的查詢也有特定方法。Execute()方法本身的返回值是一個(gè)布爾值,當(dāng)?shù)谝粋€(gè)結(jié)果為ResultSet時(shí)它返回true,否則返回false。Statement接口定義了getResultSet、getUpdateCount、getMoreResult等方法來(lái)查詢執(zhí)行execute()的結(jié)果。詳細(xì)的參數(shù)可以查閱API幫助PreparedStatement的對(duì)象所包含的SQL語(yǔ)句中允許有一個(gè)或多個(gè)IN(輸入)參數(shù)。創(chuàng)建PreparedStatement對(duì)象時(shí),IN參數(shù)用“?”代替。在執(zhí)行帶參數(shù)的SQL語(yǔ)句前,必須對(duì)“?”進(jìn)行賦值。PreparedStatement定義了很多方法,完成對(duì)IN參數(shù)賦值。創(chuàng)建一個(gè)PreparedStatement類(lèi)的對(duì)象只需在建立連接后調(diào)用Connection中的prepareStatement方法:publicPreparedStatement
prepareStatement(String
sql)throwsSQLException例如,下面的語(yǔ)句用于創(chuàng)建一個(gè)PreparedStatement的對(duì)象,其中包含一條帶參數(shù)的SQL聲明:PreparedStatement
pstmt=con.prepareStatement("INSERTINTOtestTable(id,name)VALUES(?,?)");為IN參數(shù)賦值可以使用PreparedStatement中定義的形如setXXX的方法來(lái)完成,應(yīng)根據(jù)IN參數(shù)的SQL類(lèi)型選用合適的setXXX方法。例如對(duì)上面的SQL語(yǔ)句,若需將第一個(gè)參數(shù)設(shè)為3,第二個(gè)參數(shù)設(shè)為“XU”,即插入的記錄id=3,name="XU",可用下面的語(yǔ)句實(shí)現(xiàn):
pstmt.setInt(1,3);pstmt.setString(2,"XU");CallableStatement接口為JDBC程序調(diào)用數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程提供了一種標(biāo)準(zhǔn)方式,允許調(diào)用的存儲(chǔ)過(guò)程帶有IN參數(shù)、OUT(輸出)參數(shù)或INOUT參數(shù)。CallableStatement除了繼承了PreparedStatement中的方法外,還增加了處理OUT參數(shù)的方法。
CallableStatement對(duì)象可通過(guò)調(diào)用Connection中的prepareCall方法來(lái)創(chuàng)建,該方法的形式為
publicCallableStatement
prepareCall(String
sql)throwsSQLException創(chuàng)建CallableStatement對(duì)象主要用于執(zhí)行存儲(chǔ)過(guò)程,在使用前應(yīng)了解使用的數(shù)據(jù)庫(kù)系統(tǒng)是否支持存儲(chǔ)過(guò)程。Mysql不支持這個(gè)功能ResultSet接口結(jié)果集ResultSet是用來(lái)代表執(zhí)行SQL查詢語(yǔ)句后產(chǎn)生的結(jié)果集合的抽象接口類(lèi)。它的對(duì)象一般由Statement類(lèi)及其子類(lèi)通過(guò)方法execute或executeQuery執(zhí)行SQL查詢語(yǔ)句后產(chǎn)生,包含這些語(yǔ)句的執(zhí)行結(jié)果。
ResultSet的通常形式類(lèi)似于數(shù)據(jù)庫(kù)中的表,包含符合查詢要求的所有行。由于一個(gè)結(jié)果集可能包含多行數(shù)據(jù),為讀取方便,使用指針(cursor)來(lái)標(biāo)記當(dāng)前行,指針的初始位置指向第一行之前。ResultSet接口定義了next方法來(lái)移動(dòng)指針,每調(diào)用一次next方法,指針下移一行:
publicbooleannext()
指針指向最后一行時(shí),再調(diào)用next方法,返回值為false,表明結(jié)果集已處理完畢。通常,處理結(jié)果集的程序段采用下面的結(jié)構(gòu):
while(rs.next()){
//處理每一結(jié)果行
}結(jié)果集的指針指向要訪問(wèn)的記錄后,可以通過(guò)ResultSet接口定義的一系列g(shù)etXXX方法提供從當(dāng)前行獲得指定字段的值。例如:
rs.getInt("id");
rs.getString("name");ResultSet常用的方法還有:
publicint
findColumn(String
Columnname):根據(jù)指定的字段名找出對(duì)應(yīng)的列序號(hào)。
publicboolean
wasNull():檢查最新讀入的一個(gè)列值是否為SQL的空(Null)類(lèi)型值。
publicvoidclose():關(guān)閉結(jié)果集。大部分時(shí)候結(jié)果集不需要顯式關(guān)閉,當(dāng)產(chǎn)生結(jié)果集的Statement對(duì)象關(guān)閉或再次執(zhí)行SQL語(yǔ)句時(shí),將自動(dòng)關(guān)閉相應(yīng)的結(jié)果集;當(dāng)讀取多個(gè)結(jié)果集的下一結(jié)果集時(shí),前一個(gè)結(jié)果集也將自動(dòng)關(guān)閉。publicstaticvoidmain(String[]args){Stringsql;Connectionconn;//數(shù)據(jù)庫(kù)連接
Statementstmt;//發(fā)送到數(shù)據(jù)庫(kù)執(zhí)行的SQL命令
ResultSet
rs;//讀取的數(shù)據(jù)
try{//加載sql2000數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");//定義URL連接路徑Stringurl="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=student";Stringuser="sa";//數(shù)據(jù)庫(kù)用戶名
Stringpassword="";//數(shù)據(jù)庫(kù)密碼(為空)
conn=DriverManager.getConnection(url,user,password);//建立數(shù)據(jù)庫(kù)連接
stmt=conn.createStatement();//建立連接聲明
sql="select*frominfo";//定義sql語(yǔ)句
rs=stmt.executeQuery(sql);//執(zhí)行SQL語(yǔ)句并返回?cái)?shù)據(jù)
while(rs.next()){//返回不為空
System.out.println(rs.getString(1));//打印顯示第一列
System.out.println(rs.getString(2));//打印顯示第二列
}
rs.close();//關(guān)閉數(shù)據(jù)庫(kù)操作
stmt.close();//關(guān)閉數(shù)據(jù)連接聲明
conn.close();//關(guān)閉數(shù)據(jù)庫(kù)連接}
catch(Exceptione){
e.printStackTrace();//打印錯(cuò)誤棧內(nèi)容§19.3數(shù)據(jù)庫(kù)連接
MicrosoftAccess數(shù)據(jù)庫(kù)管理系統(tǒng)
19.3.1建立數(shù)據(jù)庫(kù)建立一個(gè)名字為factory的數(shù)據(jù)庫(kù)。操作步驟如下:?jiǎn)螕簟伴_(kāi)始”→“所有程序”→“MicrosoftAccess”,在新建數(shù)據(jù)庫(kù)界面選擇“空Access數(shù)據(jù)庫(kù)”,然后命名、保存新建的數(shù)據(jù)庫(kù),在這里我們命名的數(shù)據(jù)庫(kù)是factory,保存在當(dāng)前目錄中?!?9.1.2創(chuàng)建表在factory管理的“表”的界面上選擇“使用設(shè)計(jì)器創(chuàng)建表”,然后單擊界面上的“設(shè)計(jì)”菜單,將出現(xiàn)相應(yīng)的建表界面,我們建立的表是employee,該表的字段(屬性)為:number(文本)name(文本)birthday(日期)salary(數(shù)字,雙精度)。其中,“number”字段為主鍵。在factory管理的“表”的界面上,用鼠標(biāo)雙擊已創(chuàng)建的表可以為該表添加記錄。§19.3.2JDBC
JDBC(Java
DataBaseConnection)是Java數(shù)據(jù)庫(kù)連接API。簡(jiǎn)單地說(shuō),JDBC能完成3件事:
與一個(gè)數(shù)據(jù)庫(kù)建立連接。向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句。處理數(shù)據(jù)庫(kù)返回的結(jié)果。§19.4連接數(shù)據(jù)庫(kù)
§19.4.1
連接方式的選擇和數(shù)據(jù)庫(kù)建立連接的常用兩種方式是:建立JDBC─ODBC橋接器和加載純Java數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序。使用JDBC─ODBC橋接器方式的機(jī)制是,應(yīng)用程序只需建立JDBC和ODBC之間的連接,即所謂的建立JDBC─ODBC橋接器,而和數(shù)據(jù)庫(kù)的連接由ODBC去完成。
使用JDBC─ODBC橋接器連接數(shù)據(jù)庫(kù)的3個(gè)步驟建立JDBC-ODBC橋接器建ODBC數(shù)據(jù)源和ODBC數(shù)據(jù)源建立連接§19.4.2建立JDBC-ODBC橋接器
JDBC使用java.lang包中的Class類(lèi)建立JDBC-ODBC橋接器。建立橋接器時(shí)可能發(fā)生異常,必須捕獲這個(gè)異常,建立橋接器的代碼是:try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(ClassNotFoundExceptione){
System.out.println(e);}§19.4.3ODBC數(shù)據(jù)源1.創(chuàng)建、修改或刪除數(shù)據(jù)源選擇“控制面板”→“管理工具”→“ODBC數(shù)據(jù)源”(某些window/xp系統(tǒng),需選擇“控制面板”→“性能和維護(hù)”→“管理工具”→“ODBC數(shù)據(jù)源”)。雙擊ODBC數(shù)據(jù)源圖標(biāo),出現(xiàn)的界面顯示了用戶已有的數(shù)據(jù)源的名稱。選擇“系統(tǒng)DSN”或“用戶DSN”,單擊“添加”按鈕,可以創(chuàng)建新的數(shù)據(jù)源;單擊“配置”按鈕,可以重新配置已有的數(shù)據(jù)源;單擊“刪除”按鈕,可以刪除已有的數(shù)據(jù)源。2.為數(shù)據(jù)源選擇驅(qū)動(dòng)程序因?yàn)橐L問(wèn)Access數(shù)據(jù)庫(kù),選擇MicrosoftAcessDriver(*.mdb)。3.?dāng)?shù)據(jù)源名稱及對(duì)應(yīng)數(shù)據(jù)庫(kù)的所在位置
在名稱欄里為數(shù)據(jù)源起一個(gè)自己喜歡的名字,這里我們起的名字是star。這個(gè)數(shù)據(jù)源就是指某個(gè)數(shù)據(jù)庫(kù)。在“數(shù)據(jù)庫(kù)選擇”欄中選擇一個(gè)數(shù)據(jù)庫(kù),這里我們選擇的是當(dāng)前目錄下的factory.mdb數(shù)據(jù)庫(kù)。
§19.4.4建立連接編寫(xiě)連接數(shù)據(jù)庫(kù)代碼不會(huì)出現(xiàn)數(shù)據(jù)庫(kù)的名稱,只能出現(xiàn)數(shù)據(jù)源的名字。首先使用java.sql包中的Connection類(lèi)聲明一個(gè)對(duì)象,然后再使用類(lèi)DriverManager調(diào)用它的靜態(tài)方法getConnection創(chuàng)建這個(gè)連接對(duì)象,建立連接時(shí)應(yīng)捕獲SQLException異常:try{Connectioncon=DriverManager.getConnection(“jdbc:odbc:數(shù)據(jù)源名字”,"loginname","password");}
catch(SQLExceptione){}
例題19-1§19.4.5查詢操作對(duì)一個(gè)數(shù)據(jù)庫(kù)中表進(jìn)行查詢操作的具體步驟如下。
1.向數(shù)據(jù)庫(kù)發(fā)送SQL查詢語(yǔ)句try{Statementsql=con.createStatement();}
catch(SQLExceptione){}2.處理查詢結(jié)果
ResultSet
rs=sql.executeQuery("SELECT*FROMemployee");
一、順序查詢
通過(guò)使用JDBC提供的API,可以在查詢之前知道表中的字段的個(gè)數(shù)和名字,步驟如下:1.連接對(duì)象con調(diào)用getMetaData()方法可以返回一個(gè)DatabaseMetaData對(duì)象,例如:
DatabaseMetaDatametadata=con.getMetaData();2.Metadata對(duì)象再調(diào)用getColumns可以將表的字段信息以行列的形式存儲(chǔ)在一個(gè)ResultSet對(duì)象中,例如:
ResultSet
tableMessage=metadata.getColumns(null,null,"employee",null);
3.tableMessage對(duì)象調(diào)用next方法使游標(biāo)向下移動(dòng)一行(游標(biāo)的初始位置在第1行之前),然后tableMessage調(diào)用getXXX方法可以查看該行中列的信息,其中最重要的信息是第4列,該列上的信息為字段的名字。例題19-2二、隨機(jī)查詢需要在結(jié)果集中前后移動(dòng)、顯示結(jié)果集指定的一條記錄或隨機(jī)顯示若干條記錄等。這時(shí),必須要返回一個(gè)可滾動(dòng)的結(jié)果集。為了得到一個(gè)可滾動(dòng)的結(jié)果集,需使用下述方法先獲得一個(gè)Statement對(duì)象:Statementstmt=con.createStatement(inttype,intconcurrency);然后,根據(jù)參數(shù)的type、concurrency的取值情況,stmt返回相應(yīng)類(lèi)型的結(jié)果集:
ResultSetre=stmt.executeQuery(SQL語(yǔ)句);滾動(dòng)查詢經(jīng)常用到ResultSet的下述方法:publicbooleanprevious():將游標(biāo)向上移動(dòng)publicvoidbeforeFirst():將游標(biāo)移動(dòng)到結(jié)果集的初始位置。publicvoidafterLast():將游標(biāo)移到結(jié)果集最后一行之后。publicvoidfirst():將游標(biāo)移到結(jié)果集的第一行。publicvoidlast():將游標(biāo)移到結(jié)果集的最后一行。publicboolean
isAfterLast():判斷游標(biāo)是否在最后一行之后。publicboolean
isBeforeFirst():判斷游標(biāo)是否在第一行之前publicboolean
ifFirst():判斷游標(biāo)是否指向結(jié)果集的第一行。publicboolean
isLast():判斷游標(biāo)是否指向結(jié)果集的最后一行。publicint
getRow():得到當(dāng)前游標(biāo)所指行的行號(hào).0publicboolean
absolute(introw):將游標(biāo)移到參數(shù)row指定的行號(hào)。例題19-3三、條件查詢?cè)谙旅娴睦?中QueryByNumber和QueryBySalary是例子2中Query類(lèi)的子類(lèi),二者分別能按雇員號(hào)和薪水查詢記錄。主類(lèi)將查詢條件傳遞QueryByNumber和QueryBySalary類(lèi)的實(shí)例。例題19-4四、排序查詢可以在SQL語(yǔ)句中使用ORDERBY子語(yǔ)句,對(duì)記錄排序。按薪水排序查詢的SQL語(yǔ)句:SELECT*FROMemployeeORDERBYsalary例題19-5五、模糊查詢可以用SQL語(yǔ)句操作符LIKE進(jìn)行模式般配,使用“%”代替0個(gè)或多個(gè)字符,用一個(gè)下劃線“_”代替1個(gè)字符。下述語(yǔ)句查詢姓氏是“張”或“李”的記錄:
rs=sql.executeQuery(“SELECT*FROMstudentsWHERE姓名
LIKE‘[張李]%’”);例題19-6§19.5更新、添加與刪除操作Statement對(duì)象調(diào)用方法:publicint
executeUpdate(String
sqlStatement);通過(guò)參數(shù)sqlStatement指定的方式實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表中記錄的更新、添加和刪除操作。
更新、添加和刪除記錄的SQL語(yǔ)法分別是:◆UPDATE<表名>SET<字段名>=新值WHERE<條件子句>◆
INSERTINTO表(字段列表)VALUES(對(duì)應(yīng)的具體的記錄)或INSERTINTO表(VALUES(對(duì)應(yīng)的具體的記錄)◆DELETEFROM<表名>WHERE<條件子句>例題15-7§19.6查詢Excel電子表格訪問(wèn)Exel電子表格和訪問(wèn)其它的數(shù)據(jù)庫(kù)有所不同,假設(shè)有電子表格Goods.xls。連接Excel電子表格的步驟如下。1.設(shè)置表必須在電子表格中選出一工作區(qū)作為連接時(shí)使用的表。2.設(shè)置數(shù)據(jù)源為數(shù)據(jù)源選擇的驅(qū)動(dòng)程序必須是:MicrosoftExcelDriver。例題19-8§19.7使用預(yù)處理語(yǔ)句
Java提供了更高效率的數(shù)據(jù)庫(kù)操作機(jī)制,就是PreparedStatement對(duì)象,該對(duì)象被習(xí)慣地稱作預(yù)處理語(yǔ)句對(duì)象?!?9.7.1預(yù)處理語(yǔ)句優(yōu)點(diǎn)
預(yù)處理不僅減輕了數(shù)據(jù)庫(kù)的負(fù)擔(dān),而且也提高了訪問(wèn)數(shù)據(jù)庫(kù)的速度。對(duì)于JDBC,如果使用Connection和某個(gè)數(shù)據(jù)庫(kù)建立了連接對(duì)象con,那么con就可以調(diào)用prepareStatement(String
sql)方法對(duì)參數(shù)sql指定的SQL語(yǔ)句進(jìn)行預(yù)編譯處理,生成該數(shù)據(jù)庫(kù)底層的內(nèi)部命令,并將該命令封裝在Pre
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鼻中隔膿腫的健康宣教
- 肩先露的健康宣教
- 《嵌入式系統(tǒng)原理與開(kāi)發(fā)》課件-第3章
- 胎兒宮內(nèi)發(fā)育遲緩的健康宣教
- 萎縮性鼻炎的健康宣教
- 顳骨巖部炎的健康宣教
- 鰓源性囊腫與瘺的健康宣教
- 理財(cái)規(guī)劃師課件-財(cái)務(wù)
- 清華大學(xué)Java課件l
- 《詞類(lèi)活用笑笑草》課件
- 車(chē)輛二級(jí)維護(hù)檢測(cè)單參考模板范本
- 亮化照明維護(hù)服務(wù)方案
- 疼痛評(píng)估方法與管理
- 測(cè)定總固體原始記錄
- (最新整理)夜市一條街建設(shè)方案
- 2020年最新人教版七年級(jí)上英語(yǔ)短文填空(共35篇)
- 住院醫(yī)師解讀心電圖
- T∕CSES 09-2020 燃煤電廠大氣污染物超低排放技術(shù)驗(yàn)證評(píng)價(jià)規(guī)范
- 第2章偵查文書(shū)
- 羊奶培訓(xùn)手冊(cè)
- 2019超星爾雅航空與航天答案
評(píng)論
0/150
提交評(píng)論