版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
《Java面向?qū)ο蟪绦蛟O(shè)計》數(shù)據(jù)庫編程應(yīng)用主要內(nèi)容JDBC連接數(shù)據(jù)庫查詢操作更新、添加與刪除操作查詢Excel電子表格使用預(yù)處理語句事務(wù)難點使用預(yù)處理語句事務(wù)導(dǎo)讀本章將學(xué)習(xí)怎樣使用Java提供的JDBC技術(shù)操作數(shù)據(jù)庫。JDBC概述JDBC的概念數(shù)據(jù)庫是收集、存儲和組織數(shù)據(jù)常用的方法,大部分應(yīng)用系統(tǒng)不可避免地需要訪問數(shù)據(jù)庫。
Java語言通過JDBC(Java
DataBaseConnection,Java數(shù)據(jù)庫連接)API提供了一個標(biāo)準(zhǔn)SQL(StructuredQueryLanguage,結(jié)構(gòu)化查詢語言)數(shù)據(jù)庫訪問接口。JDBC的任務(wù)
(1)與一個數(shù)據(jù)庫建立連接
(2)向數(shù)據(jù)庫發(fā)送SQL語句
(3)處理數(shù)據(jù)庫返回的結(jié)果
JDBC是一種低級的APIJDBC和ODBC及其他API的比較
(1)ODBC不適合在Java中直接使用,因為它是一個C語言實現(xiàn)的API,從Java程序調(diào)用本地的C程序會在安全性、完整性、健壯性方面都有許多缺點。
(2)不能完全精確地實現(xiàn)從ODBC,C,API到JavaAPI的翻譯。
(3)ODBC很難學(xué),它把簡單和高級功能混雜在一起,甚至對非常簡單的查詢,其選項也非常復(fù)雜。而JDBC恰好相反,其盡量保證簡單功能的簡便性,而同時在必要時允許使用高級功能。
(4)啟用純Java需要象JDBC這樣的JavaAPI
JDBC概述JDBC與數(shù)據(jù)庫系統(tǒng)獨立的API包含兩部分,一部分是面向應(yīng)用系統(tǒng)開發(fā)人員的JDBCAPI,另一部分是面向驅(qū)動程序開發(fā)人員的JDBCDriverAPI。Java程序通過JDBCAPI訪問JDBC驅(qū)動程序管理器(DriverManager),驅(qū)動程序管理器再通過JDBCDriverAPI訪問不同的JDBC驅(qū)動程序,從而實現(xiàn)對不同類型數(shù)據(jù)庫的訪問。JDBC提供了一個通用的JDBCDriverManager,用來管理各數(shù)據(jù)庫軟件商提供的JDBC驅(qū)動程序,訪問其數(shù)據(jù)庫。幾乎所有數(shù)據(jù)庫廠商都提供其數(shù)據(jù)庫產(chǎn)品的JDBC驅(qū)動程序,包括微軟公司的SQLServer2000。JDBCURLJDBCURL是JDBC用來標(biāo)識數(shù)據(jù)庫的方法,JDBC驅(qū)動程序管理器根據(jù)JDBCURL選擇正確的驅(qū)動程序,由驅(qū)動程序識別該數(shù)據(jù)庫并與之建立連接。構(gòu)造JDBCURL時具有特定的規(guī)范。首先,它們應(yīng)允許不同的驅(qū)動程序使用不同的方案來命名數(shù)據(jù)庫。例如,odbc子協(xié)議允許URL含有屬性值。其次,JDBCURL應(yīng)允許程序員將連接數(shù)據(jù)庫所需的全部信息編入其中。這樣就可以讓Java程序直接打開數(shù)據(jù)庫連接,而不需要最終用戶去做任何系統(tǒng)管理工作。第三,JDBCURL可指向邏輯主機(jī)或數(shù)據(jù)庫名,而這種邏輯主機(jī)或數(shù)據(jù)庫名將由網(wǎng)絡(luò)命名系統(tǒng)動態(tài)地轉(zhuǎn)換為實際的名稱。網(wǎng)絡(luò)命名服務(wù)(例如DNS、NIS)有多種,而對于使用哪種命名服務(wù)并無限制。
JDBCURL的標(biāo)準(zhǔn)語法由三部分組成,各部分間用冒號分隔jdbc:<子協(xié)議>:<子名稱>三個部分可分解如下:
jdbc:協(xié)議名。JDBCURL中的協(xié)議總是jdbc。
<子協(xié)議>:驅(qū)動程序名或數(shù)據(jù)庫連接機(jī)制(這種機(jī)制可由一個或多個驅(qū)動程序支持)的名稱。
<子名稱>:一種標(biāo)識數(shù)據(jù)庫的方法。子名稱可以依不同的子協(xié)議而變化,使用子名稱的目的是為定位數(shù)據(jù)庫提供足夠的信息。例如,odbc用于指定ODBC數(shù)據(jù)源名稱的URL的使用。JDBCURL通過ODBC驅(qū)動程序來訪問某個數(shù)據(jù)庫:
jdbc:odbc:fred
這里,子協(xié)議為odbc,子名稱fred是本地ODBC數(shù)據(jù)源名。例如,通過Internet訪問SQLServer數(shù)據(jù)庫服務(wù)器,則在JDBCURL中應(yīng)將網(wǎng)絡(luò)地址作為子名稱的一部分包括進(jìn)去。如:jdbc:microsoft:sqlserver://localhost:1433;User=sa;Password=;DatabaseName=DemoDBJDBC-ODBC橋ODBC(OpenDatabaseConnectivity,開放數(shù)據(jù)庫互連)是微軟公司開放服務(wù)結(jié)構(gòu)(WindowsOpenServicesArchitecture,WOSA)中有關(guān)數(shù)據(jù)庫的一個組成部分。它建立了一組規(guī)范,提供對數(shù)據(jù)庫訪問的標(biāo)準(zhǔn)API,利用SQL來完成其大部分任務(wù)。ODBC標(biāo)準(zhǔn)出現(xiàn)較早,幾乎所有的數(shù)據(jù)庫系統(tǒng)都提供ODBC驅(qū)動程序。Sun公司對沒有提供相應(yīng)JDBC驅(qū)動程序的數(shù)據(jù)庫系統(tǒng),但開發(fā)了特殊的驅(qū)動程序:JDBC-ODBC橋,該驅(qū)動程序支持JDBC通過現(xiàn)有的ODBC驅(qū)動程序訪問相應(yīng)的數(shù)據(jù)庫系統(tǒng)。JDBC-ODBC橋子協(xié)議名為odbc,允許在子名稱(數(shù)據(jù)源名稱)后面指定任意多個屬性值。odbc
子協(xié)議的完整語法為
jdbc:odbc:<數(shù)據(jù)資源名稱>[;<屬性名>=<屬性值>]*jdbc:odbc:<數(shù)據(jù)資源名稱>[;<屬性名>=<屬性值>]*表示可有多個屬性。下面都是合法的jdbc:odbc
名稱:jdbc:odbc:qeor7jdbc:odbc:wombatjdbc:odbc:wombat;CacheSize=20;ExtensionCase=LOWERjdbc:odbc:qeora;UID=kgh;PWD=fooey
使用JDBC開發(fā)數(shù)據(jù)庫應(yīng)用常用API介紹:驅(qū)動管理類:getConnection(String
url,String
user,Stringpassword)
用來獲得數(shù)據(jù)庫的連接數(shù)據(jù)庫連接類(connection)會話聲明類(Ststement)預(yù)編譯(PreparedStatement)結(jié)果集(ResultSet)接口常用方法連接sql200的完整程序使用JDBC開發(fā)數(shù)據(jù)庫應(yīng)用可分為下面幾個步驟:
(1)裝載驅(qū)動程序;(2)建立與數(shù)據(jù)庫的連接;(3)發(fā)送SQL語句;(4)處理結(jié)果;(5)關(guān)閉數(shù)據(jù)庫連接1.裝載JDBC驅(qū)動程序2.創(chuàng)建與數(shù)據(jù)庫的連接3.創(chuàng)建語句對象
-Statement-PreparedStatement4.利用語句對象執(zhí)行SQL語句得到的結(jié)果5.處理結(jié)果6.JDBC應(yīng)用結(jié)束利用JDBC開發(fā)web數(shù)據(jù)庫步驟數(shù)據(jù)庫驅(qū)動程序
-JDBC:各數(shù)據(jù)廠商提供
-ODBC:sun提供
(sun.jdbc.odbc.JdbcOdbcDriver)1.裝載驅(qū)動程序
Class.forName(“驅(qū)動名稱”)例:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”)Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver
”)JDBC使用(1)2.連接數(shù)據(jù)庫
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ù)庫的驅(qū)動程序和URL3.創(chuàng)建語句對象-Statement-PreparedStatement例:Statementstmt=conn.createStatement()JDBC使用(3)書寫具體的SQL語句Stringsql="insertintoperson(name,password,age)values(‘john’,’123’,20)“;Stringsql=“updatepersonsetage=age+1“;Stringsql=“deletefrompersonwhereid=2”Stringsql=“select*fromperson“;4.執(zhí)行SQL語句(1)stmt.executeUpdate(sql);返回是所影響記錄的個數(shù)
Insert;update;delete(2)stmt.executeQuery(sql);返回ResultSet實例化對象
select使用JDBC使用(4)5.處理結(jié)果ResultSet的幾個主要方法介紹如下:next():將游標(biāo)從當(dāng)前位置向下移動一行,返回值為boolean。在數(shù)據(jù)處理時,通常用于判斷是否有符合條件的記錄。getString():獲取記錄的數(shù)據(jù)。JDBC使用(5)6.關(guān)閉數(shù)據(jù)庫
數(shù)據(jù)庫在每次使用后必須關(guān)閉,關(guān)閉數(shù)據(jù)庫操作的順序與打開數(shù)據(jù)庫操作的順序相反,即:先關(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ù)庫連接
Statementstmt;//發(fā)送到數(shù)據(jù)庫執(zhí)行的SQL命令
ResultSet
rs;//讀取的數(shù)據(jù)
try{//加載sql2000數(shù)據(jù)庫的紅運程序Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
//定義URL連接路徑Stringurl="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=student";Stringuser="sa";//數(shù)據(jù)庫用戶名
Stringpassword="";//數(shù)據(jù)庫密碼(為空)
conn=DriverManager.getConnection(url,user,password);//建立數(shù)據(jù)庫連接
stmt=conn.createStatement();//建立連接聲明
sql="select*frominfo";//定義sql語句
rs=stmt.executeQuery(sql);//執(zhí)行SQL語句
while(rs.next()){//返回不為空System.out.println(rs.getString(1));//打印顯示第一列System.out.println(rs.getString(2));//打印顯示第二列}
rs.close();//關(guān)閉數(shù)據(jù)庫操作
stmt.close();//關(guān)閉數(shù)據(jù)連接聲明
conn.close();//關(guān)閉數(shù)據(jù)庫連接}
catch(Exceptione){
e.printStackTrace();//打印錯誤棧內(nèi)容}}}JDBC相關(guān)類介紹前面介紹了使用JDBC訪問數(shù)據(jù)庫的一般步驟,下面對其中涉及到的一些類和接口再作一個簡單的介紹。1.DriverManager類
DriverManager
類是JDBC的管理層,作用于用戶和驅(qū)動程序之間。它跟蹤可用的驅(qū)動程序,并在數(shù)據(jù)庫和相應(yīng)驅(qū)動程序之間建立連接。另外,DriverManager
類也處理諸如驅(qū)動程序登錄時間限制及登錄和跟蹤消息的顯示等事務(wù)。對于簡單的應(yīng)用程序,程序員僅需直接使用該類的方法getConnection建立與數(shù)據(jù)庫的連接。JDBC還允許用戶調(diào)用DriverManager
的方法getDriver、getDrivers
和registerDriver以及Driver的方法connect。Driver為jdbc中定義的一個接口,每一個JDBC驅(qū)動程序都需要實現(xiàn)這個接口。一般情況下不需直接調(diào)用registerDriver,而是在加載驅(qū)動程序時由驅(qū)動程序自動調(diào)用。加載驅(qū)動程序有兩種方法:(1)調(diào)用方法Class.forName顯式地加載驅(qū)動程序類。這種方法與外部設(shè)置無關(guān),因此推薦使用這種加載驅(qū)動程序的方法。例如,加載SQLServer2000的JDBC驅(qū)動程序:Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");(2)將驅(qū)動程序添加到j(luò)ava.lang.System
的屬性jdbc.drivers
中,這是一個由DriverManager
類加載的驅(qū)動程序類名的列表,由冒號分隔。初始化DriverManager
類時,它搜索系統(tǒng)屬性jdbc.drivers,DriverManager
類將試圖加載該屬性指定的驅(qū)動程序。程序員可在Java虛擬機(jī)的配置文件中設(shè)置系統(tǒng)屬性jdbc.drivers。這種方法很少使用。DriverManager類常用的方法有,用于建立與數(shù)據(jù)庫的連接:
staticvoidderegisterDriver(Driverdriver):從驅(qū)動程序列表中刪除已登記的驅(qū)動程序。
staticConnection getConnection(String
url)。
staticConnection getConnection(String
url,Propertiesinfo)。
staticConnection getConnection(String
url,Stringuser,Stringpassword)。用于獲得或設(shè)置連接數(shù)據(jù)庫時驅(qū)動程序與可以等待的最大時間staticDriver getDriver(String
url):根據(jù)JDBCURL獲得對應(yīng)的驅(qū)動程序。staticEnumeration getDrivers():獲取當(dāng)前已裝載的JDBC驅(qū)動程序列表。staticint
getLoginTimeout()。staticvoidsetLoginTimeout(intseconds)。用于獲得或設(shè)置寫日志的PrintWriter對象staticPrintWriter
getLogWriter()staticvoid setLogWriter(PrintWriterout)staticvoid println(Stringmessage):輸出信息到當(dāng)前JDBC日志流staticvoid registerDriver(Driverdriver):登記給定的JDBC驅(qū)動程序。DriverManager類的靜態(tài)方法getConnection用于與數(shù)據(jù)庫建立連接,返回一個Connection接口類型的對象,用于表示JDBC驅(qū)動程序與數(shù)據(jù)庫的連接。getConnection方法遍歷驅(qū)動程序清單,將URL及參數(shù)傳遞給驅(qū)動程序類的connect方法,如果驅(qū)動程序支持該URL指定的子協(xié)議和子名稱,則連接數(shù)據(jù)庫并返回Connection對象。Statement接口及其子接口向數(shù)據(jù)庫發(fā)送SQL語句的任務(wù)是由Statement對象完成的,Connection對象可以創(chuàng)建三種類型的Statement對象。它們分別是:
(1)Statement:用于執(zhí)行不帶參數(shù)的簡單SQL語句。
(2)PreparedStatement:用于執(zhí)行預(yù)編譯的SQL語句,并允許在SQL語句中使用IN參數(shù)。
(3)Callablestatement:用于執(zhí)行數(shù)據(jù)庫存儲過程的調(diào)用。它允許使用IN、OUT或INOUT三種類型的參數(shù)。Statement對象用于執(zhí)行靜態(tài)SQL語句(即不帶參數(shù)的SQL語句)并獲取處理結(jié)果。創(chuàng)建一個Statement對象,需調(diào)用Connection的方法createStatement。一般形式如下:Connectionconn=DriverManager.getConnection(URL,"USER","password");Statementstmt=conn.createStatement();
創(chuàng)建了Statement對象后,可調(diào)用其中的方法執(zhí)行SQL語句。JDBC中提供了三種執(zhí)行方法:execute、executeQuery和executeUpdate。executeUpdate方法
executeUpdate方法的形式為
publicint
executeUpdate(String
sql)throwSQLException
方法一般用于執(zhí)行SQL的INSERT、UPDATE或DELETE語句,或者執(zhí)行無返回值的SQLDDL語句(即SQL數(shù)據(jù)定義語言),如CREATE或DROP等。當(dāng)執(zhí)行INSERT等SQL語句時,此方法的返回值是這個SQL語句所影響的記錄的總行數(shù)。若返回值為0,則表示執(zhí)行未對數(shù)據(jù)庫造成影響。若執(zhí)行的語句是SQLDDL語句,返回值也是0。例一、使用executeUpdate執(zhí)行SQL語句。publicclassInsertRec{ publicstaticvoidmain(String
args[]) { Stringurl="jdbc:odbc:AccessDB"; try{//加載jdbc-odbcbridge驅(qū)動程序
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//Class.forName("com.ms.jdbc.odbc.JdbcOdbcDriver");//VisualJ++//與驅(qū)動器建立連接
Connectioncon=DriverManager.getConnection(url);//創(chuàng)建一個Statement對象
Statementstmt=con.createStatement();//執(zhí)行SQL語句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
這個方法比較特殊,一般只有在用戶不知道執(zhí)行SQL語句后會產(chǎn)生什么結(jié)果或可能有多種類型的結(jié)果產(chǎn)生時才會使用。例如,執(zhí)行一組既包含DELETE語句又包含了SELECT語句的SQL命令,執(zhí)行后既產(chǎn)生了一個ResultSet,又影響了相關(guān)記錄,有兩種類型的結(jié)果產(chǎn)生,這時必須用方法execute()執(zhí)行以獲取完整的結(jié)果。execute()的執(zhí)行結(jié)果允許產(chǎn)生多個ResultSet,或多條記錄被影響,或是兩者都有。由于執(zhí)行結(jié)果的特殊性,因此對調(diào)用execute后產(chǎn)生的結(jié)果的查詢也有特定方法。Execute()方法本身的返回值是一個布爾值,當(dāng)?shù)谝粋€結(jié)果為ResultSet時它返回true,否則返回false。Statement接口定義了getResultSet、getUpdateCount、getMoreResult等方法來查詢執(zhí)行execute()的結(jié)果。詳細(xì)的參數(shù)可以查閱API幫助PreparedStatement的對象所包含的SQL語句中允許有一個或多個IN(輸入)參數(shù)。創(chuàng)建PreparedStatement對象時,IN參數(shù)用“?”代替。在執(zhí)行帶參數(shù)的SQL語句前,必須對“?”進(jìn)行賦值。PreparedStatement定義了很多方法,完成對IN參數(shù)賦值。創(chuàng)建一個PreparedStatement類的對象只需在建立連接后調(diào)用Connection中的prepareStatement方法:publicPreparedStatement
prepareStatement(String
sql)throwsSQLException例如,下面的語句用于創(chuàng)建一個PreparedStatement的對象,其中包含一條帶參數(shù)的SQL聲明:PreparedStatement
pstmt=con.prepareStatement("INSERTINTOtestTable(id,name)VALUES(?,?)");為IN參數(shù)賦值可以使用PreparedStatement中定義的形如setXXX的方法來完成,應(yīng)根據(jù)IN參數(shù)的SQL類型選用合適的setXXX方法。例如對上面的SQL語句,若需將第一個參數(shù)設(shè)為3,第二個參數(shù)設(shè)為“XU”,即插入的記錄id=3,name="XU",可用下面的語句實現(xiàn):
pstmt.setInt(1,3);pstmt.setString(2,"XU");CallableStatement接口為JDBC程序調(diào)用數(shù)據(jù)庫中的存儲過程提供了一種標(biāo)準(zhǔn)方式,允許調(diào)用的存儲過程帶有IN參數(shù)、OUT(輸出)參數(shù)或INOUT參數(shù)。CallableStatement除了繼承了PreparedStatement中的方法外,還增加了處理OUT參數(shù)的方法。
CallableStatement對象可通過調(diào)用Connection中的prepareCall方法來創(chuàng)建,該方法的形式為
publicCallableStatement
prepareCall(String
sql)throwsSQLException創(chuàng)建CallableStatement對象主要用于執(zhí)行存儲過程,在使用前應(yīng)了解使用的數(shù)據(jù)庫系統(tǒng)是否支持存儲過程。Mysql不支持這個功能ResultSet接口結(jié)果集ResultSet是用來代表執(zhí)行SQL查詢語句后產(chǎn)生的結(jié)果集合的抽象接口類。它的對象一般由Statement類及其子類通過方法execute或executeQuery執(zhí)行SQL查詢語句后產(chǎn)生,包含這些語句的執(zhí)行結(jié)果。
ResultSet的通常形式類似于數(shù)據(jù)庫中的表,包含符合查詢要求的所有行。由于一個結(jié)果集可能包含多行數(shù)據(jù),為讀取方便,使用指針(cursor)來標(biāo)記當(dāng)前行,指針的初始位置指向第一行之前。ResultSet接口定義了next方法來移動指針,每調(diào)用一次next方法,指針下移一行:
publicbooleannext()
指針指向最后一行時,再調(diào)用next方法,返回值為false,表明結(jié)果集已處理完畢。通常,處理結(jié)果集的程序段采用下面的結(jié)構(gòu):
while(rs.next()){
//處理每一結(jié)果行
}結(jié)果集的指針指向要訪問的記錄后,可以通過ResultSet接口定義的一系列g(shù)etXXX方法提供從當(dāng)前行獲得指定字段的值。例如:
rs.getInt("id");
rs.getString("name");ResultSet常用的方法還有:
publicint
findColumn(String
Columnname):根據(jù)指定的字段名找出對應(yīng)的列序號。
publicboolean
wasNull():檢查最新讀入的一個列值是否為SQL的空(Null)類型值。
publicvoidclose():關(guān)閉結(jié)果集。大部分時候結(jié)果集不需要顯式關(guān)閉,當(dāng)產(chǎn)生結(jié)果集的Statement對象關(guān)閉或再次執(zhí)行SQL語句時,將自動關(guān)閉相應(yīng)的結(jié)果集;當(dāng)讀取多個結(jié)果集的下一結(jié)果集時,前一個結(jié)果集也將自動關(guān)閉。publicstaticvoidmain(String[]args){Stringsql;Connectionconn;//數(shù)據(jù)庫連接
Statementstmt;//發(fā)送到數(shù)據(jù)庫執(zhí)行的SQL命令
ResultSet
rs;//讀取的數(shù)據(jù)
try{//加載sql2000數(shù)據(jù)庫的驅(qū)動程序Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");//定義URL連接路徑Stringurl="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=student";Stringuser="sa";//數(shù)據(jù)庫用戶名
Stringpassword="";//數(shù)據(jù)庫密碼(為空)
conn=DriverManager.getConnection(url,user,password);//建立數(shù)據(jù)庫連接
stmt=conn.createStatement();//建立連接聲明
sql="select*frominfo";//定義sql語句
rs=stmt.executeQuery(sql);//執(zhí)行SQL語句并返回數(shù)據(jù)
while(rs.next()){//返回不為空
System.out.println(rs.getString(1));//打印顯示第一列
System.out.println(rs.getString(2));//打印顯示第二列
}
rs.close();//關(guān)閉數(shù)據(jù)庫操作
stmt.close();//關(guān)閉數(shù)據(jù)連接聲明
conn.close();//關(guān)閉數(shù)據(jù)庫連接}
catch(Exceptione){
e.printStackTrace();//打印錯誤棧內(nèi)容§19.3數(shù)據(jù)庫連接
MicrosoftAccess數(shù)據(jù)庫管理系統(tǒng)
19.3.1建立數(shù)據(jù)庫建立一個名字為factory的數(shù)據(jù)庫。操作步驟如下:單擊“開始”→“所有程序”→“MicrosoftAccess”,在新建數(shù)據(jù)庫界面選擇“空Access數(shù)據(jù)庫”,然后命名、保存新建的數(shù)據(jù)庫,在這里我們命名的數(shù)據(jù)庫是factory,保存在當(dāng)前目錄中?!?9.1.2創(chuàng)建表在factory管理的“表”的界面上選擇“使用設(shè)計器創(chuàng)建表”,然后單擊界面上的“設(shè)計”菜單,將出現(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ù)庫連接API。簡單地說,JDBC能完成3件事:
與一個數(shù)據(jù)庫建立連接。向數(shù)據(jù)庫發(fā)送SQL語句。處理數(shù)據(jù)庫返回的結(jié)果。§19.4連接數(shù)據(jù)庫
§19.4.1
連接方式的選擇和數(shù)據(jù)庫建立連接的常用兩種方式是:建立JDBC─ODBC橋接器和加載純Java數(shù)據(jù)庫驅(qū)動程序。使用JDBC─ODBC橋接器方式的機(jī)制是,應(yīng)用程序只需建立JDBC和ODBC之間的連接,即所謂的建立JDBC─ODBC橋接器,而和數(shù)據(jù)庫的連接由ODBC去完成。
使用JDBC─ODBC橋接器連接數(shù)據(jù)庫的3個步驟建立JDBC-ODBC橋接器建ODBC數(shù)據(jù)源和ODBC數(shù)據(jù)源建立連接§19.4.2建立JDBC-ODBC橋接器
JDBC使用java.lang包中的Class類建立JDBC-ODBC橋接器。建立橋接器時可能發(fā)生異常,必須捕獲這個異常,建立橋接器的代碼是: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ū)動程序因為要訪問Access數(shù)據(jù)庫,選擇MicrosoftAcessDriver(*.mdb)。3.?dāng)?shù)據(jù)源名稱及對應(yīng)數(shù)據(jù)庫的所在位置
在名稱欄里為數(shù)據(jù)源起一個自己喜歡的名字,這里我們起的名字是star。這個數(shù)據(jù)源就是指某個數(shù)據(jù)庫。在“數(shù)據(jù)庫選擇”欄中選擇一個數(shù)據(jù)庫,這里我們選擇的是當(dāng)前目錄下的factory.mdb數(shù)據(jù)庫。
§19.4.4建立連接編寫連接數(shù)據(jù)庫代碼不會出現(xiàn)數(shù)據(jù)庫的名稱,只能出現(xiàn)數(shù)據(jù)源的名字。首先使用java.sql包中的Connection類聲明一個對象,然后再使用類DriverManager調(diào)用它的靜態(tài)方法getConnection創(chuàng)建這個連接對象,建立連接時應(yīng)捕獲SQLException異常:try{Connectioncon=DriverManager.getConnection(“jdbc:odbc:數(shù)據(jù)源名字”,"loginname","password");}
catch(SQLExceptione){}
例題19-1§19.4.5查詢操作對一個數(shù)據(jù)庫中表進(jìn)行查詢操作的具體步驟如下。
1.向數(shù)據(jù)庫發(fā)送SQL查詢語句try{Statementsql=con.createStatement();}
catch(SQLExceptione){}2.處理查詢結(jié)果
ResultSet
rs=sql.executeQuery("SELECT*FROMemployee");
一、順序查詢
通過使用JDBC提供的API,可以在查詢之前知道表中的字段的個數(shù)和名字,步驟如下:1.連接對象con調(diào)用getMetaData()方法可以返回一個DatabaseMetaData對象,例如:
DatabaseMetaDatametadata=con.getMetaData();2.Metadata對象再調(diào)用getColumns可以將表的字段信息以行列的形式存儲在一個ResultSet對象中,例如:
ResultSet
tableMessage=metadata.getColumns(null,null,"employee",null);
3.tableMessage對象調(diào)用next方法使游標(biāo)向下移動一行(游標(biāo)的初始位置在第1行之前),然后tableMessage調(diào)用getXXX方法可以查看該行中列的信息,其中最重要的信息是第4列,該列上的信息為字段的名字。例題19-2二、隨機(jī)查詢需要在結(jié)果集中前后移動、顯示結(jié)果集指定的一條記錄或隨機(jī)顯示若干條記錄等。這時,必須要返回一個可滾動的結(jié)果集。為了得到一個可滾動的結(jié)果集,需使用下述方法先獲得一個Statement對象:Statementstmt=con.createStatement(inttype,intconcurrency);然后,根據(jù)參數(shù)的type、concurrency的取值情況,stmt返回相應(yīng)類型的結(jié)果集:
ResultSetre=stmt.executeQuery(SQL語句);滾動查詢經(jīng)常用到ResultSet的下述方法:publicbooleanprevious():將游標(biāo)向上移動publicvoidbeforeFirst():將游標(biāo)移動到結(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)所指行的行號.0publicboolean
absolute(introw):將游標(biāo)移到參數(shù)row指定的行號。例題19-3三、條件查詢在下面的例子4中QueryByNumber和QueryBySalary是例子2中Query類的子類,二者分別能按雇員號和薪水查詢記錄。主類將查詢條件傳遞QueryByNumber和QueryBySalary類的實例。例題19-4四、排序查詢可以在SQL語句中使用ORDERBY子語句,對記錄排序。按薪水排序查詢的SQL語句:SELECT*FROMemployeeORDERBYsalary例題19-5五、模糊查詢可以用SQL語句操作符LIKE進(jìn)行模式般配,使用“%”代替0個或多個字符,用一個下劃線“_”代替1個字符。下述語句查詢姓氏是“張”或“李”的記錄:
rs=sql.executeQuery(“SELECT*FROMstudentsWHERE姓名
LIKE‘[張李]%’”);例題19-6§19.5更新、添加與刪除操作Statement對象調(diào)用方法:publicint
executeUpdate(String
sqlStatement);通過參數(shù)sqlStatement指定的方式實現(xiàn)對數(shù)據(jù)庫表中記錄的更新、添加和刪除操作。
更新、添加和刪除記錄的SQL語法分別是:◆UPDATE<表名>SET<字段名>=新值WHERE<條件子句>◆
INSERTINTO表(字段列表)VALUES(對應(yīng)的具體的記錄)或INSERTINTO表(VALUES(對應(yīng)的具體的記錄)◆DELETEFROM<表名>WHERE<條件子句>例題15-7§19.6查詢Excel電子表格訪問Exel電子表格和訪問其它的數(shù)據(jù)庫有所不同,假設(shè)有電子表格Goods.xls。連接Excel電子表格的步驟如下。1.設(shè)置表必須在電子表格中選出一工作區(qū)作為連接時使用的表。2.設(shè)置數(shù)據(jù)源為數(shù)據(jù)源選擇的驅(qū)動程序必須是:MicrosoftExcelDriver。例題19-8§19.7使用預(yù)處理語句
Java提供了更高效率的數(shù)據(jù)庫操作機(jī)制,就是PreparedStatement對象,該對象被習(xí)慣地稱作預(yù)處理語句對象。§19.7.1預(yù)處理語句優(yōu)點
預(yù)處理不僅減輕了數(shù)據(jù)庫的負(fù)擔(dān),而且也提高了訪問數(shù)據(jù)庫的速度。對于JDBC,如果使用Connection和某個數(shù)據(jù)庫建立了連接對象con,那么con就可以調(diào)用prepareStatement(String
sql)方法對參數(shù)sql指定的SQL語句進(jìn)行預(yù)編譯處理,生成該數(shù)據(jù)庫底層的內(nèi)部命令,并將該命令封裝在Pre
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版模板醫(yī)療設(shè)備租賃與維護(hù)合同4篇
- 二零二五版門禁系統(tǒng)與消防報警系統(tǒng)聯(lián)動施工合同3篇
- 二零二五版門窗行業(yè)產(chǎn)品追溯與防偽技術(shù)合同4篇
- 2025年度跨境電商平臺入駐商家租賃合同4篇
- 2025年度露營裝備研發(fā)與知識產(chǎn)權(quán)保護(hù)合同4篇
- 2025年個人借款咨詢與信用風(fēng)險控制服務(wù)協(xié)議3篇
- 2025版向日葵種子種子質(zhì)量檢測與認(rèn)證服務(wù)合同3篇
- 2025版企業(yè)租車服務(wù)合同范本(2025版)2篇
- 二零二五年離婚子女撫養(yǎng)權(quán)及財產(chǎn)分割執(zhí)行合同3篇
- 2025版汽車銷售場地租賃與智能化管理系統(tǒng)合作協(xié)議4篇
- 2024公路瀝青路面結(jié)構(gòu)內(nèi)部狀況三維探地雷達(dá)快速檢測規(guī)程
- 2024年高考真題-地理(河北卷) 含答案
- 2024光儲充一體化系統(tǒng)解決方案
- 處理后事授權(quán)委托書
- 食材配送服務(wù)方案投標(biāo)方案(技術(shù)方案)
- 足療店營銷策劃方案
- 封條(標(biāo)準(zhǔn)A4打印封條)
- 2024年北京控股集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 延遲交稿申請英文
- 運動技能學(xué)習(xí)與控制課件第十章動作技能的指導(dǎo)與示范
- 石油天然氣建設(shè)工程交工技術(shù)文件編制規(guī)范(SYT68822023年)交工技術(shù)文件表格儀表自動化安裝工程
評論
0/150
提交評論