《Java程序設計教程》課件第十四章:JDBC與MySQL編程_第1頁
《Java程序設計教程》課件第十四章:JDBC與MySQL編程_第2頁
《Java程序設計教程》課件第十四章:JDBC與MySQL編程_第3頁
《Java程序設計教程》課件第十四章:JDBC與MySQL編程_第4頁
《Java程序設計教程》課件第十四章:JDBC與MySQL編程_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

本章學習目標:●

了解JDBC概念以及驅動類型●

掌握使用JDBC連接MySQL數據庫的基本步驟●

掌握數據庫環(huán)境的搭建●

掌握使用JDBC訪問數據庫的步驟●

掌握使用JavaAPI操作數據庫●

掌握數據庫事務的使用第十四章JDBC與MySQL編程第1節(jié)partJDBC基礎

通過使用JDBC,Java程序可以輕松地操作各種主流數據庫,例如,Oracle、MSSQLServer、MySQL等。由于Java語言本身的跨平臺性,所以使用JDBC編寫的程序不僅可以實現跨數據庫,還具有跨平臺性和可移植性。使用JDBC訪問數據庫具有操作簡單、獲取方便且安全可靠等優(yōu)勢。JDBC基礎本節(jié)概述JDBC(JavaDatabaseConnectivity,Java數據庫連接)是一種執(zhí)行SQL語句的JavaAPI。程序可以通過JDBCAPI連接到關系數據庫,并使用SQL結構化語言來完成對數據庫的增、刪、改、查等操作。與其他數據庫編程語言相比,JDBC為數據開發(fā)者提供了標準的API,使用JDBC開發(fā)的數據庫應用程序可以訪問不同的數據庫,并在不同平臺上運行,既可以在Windows平臺上運行,也可以在UNIX平臺上運行。JDBC程序訪問不同的數據庫時,需要數據庫廠商提供相應的驅動程序。通過JDBC驅動程序的轉換,使得相同的代碼在訪問不同的數據庫時運行良好。JDBC驅動示意圖如圖14.1所示。14.1.1JDBC簡介JDBC簡介JDBC應用程序可以對數據庫進行訪問和操作,JDBC訪問數據庫時主要完成以下工作:

●建立與數據庫的連接;

●執(zhí)行SQL語句;

●獲取執(zhí)行結果。

數據庫驅動程序是JDBC程序和數據庫之間的轉換層,數據庫驅動程序負責將JDBC調用映射成特定的數據庫調用,JDBC訪問示意圖如圖14.2所示。14.1.2JDBC驅動JDBC驅動

當今市場上主流數據庫都提供了JDBC驅動程序,甚至一些流行的數據庫還提供了多種不同版本的JDBC驅動程序。JDBC驅動程序有以下4種類型:

●JDBC-ODBC橋:是最早實現的JDBC驅動程序,主要目的是快速推廣JDBC。ODBC(OpenDatabaseConnectivity,開放數據庫連接)是通過一組通用的API訪問不同的數據庫管理系統,也需要各數據庫廠商提供相應的驅動程序,而ODBC則對這些驅動程序進行管理。JDBC-ODBC橋驅動是將JDBCAPI映射到ODBCAPI,驅動速度很慢,只適用于訪問沒有其他JDBC驅動的數據庫。由于Java語言的廣泛應用,所有數據庫廠商都提供了JDBC驅動,因此在Java8中不再支持JDBC-ODBC數據訪問方式。JDBC驅動14.1.2

●本地API驅動:直接將JDBCAPI映射成數據庫特定的客戶端API,包含特定的數據庫本地代碼,用于訪問特定數據庫的客戶端。本地API驅動比起JDBC-ODBC橋執(zhí)行效率要高,但是仍然需要在客戶端加載數據庫廠商提供的代碼庫,不適合基于網絡的應用。本地API驅動雖然速度有所提升,但相對后面兩種JDBC驅動還是不夠高。

●網絡協議驅動:將JDBC調用翻譯成中間件供應商的協議,然后再由中間件服務器翻譯成數據庫訪問協議。網絡協議驅動是基于服務器的,不需要在客戶端加載數據庫廠商提供的代碼庫,且執(zhí)行效率比較好,便于維護和升級。

●本地協議驅動:是純Java編寫的,可以直接連接到數據庫。本地協議驅動不需要將JDBC的調用傳給ODBC,或本地數據庫接口,或中間層服務器,因此執(zhí)行效率非常高;而且根本不需要在客戶端或服務器裝載任何軟件或驅動。本地協議驅動是智能的,能夠知道數據庫使用的底層協議,是目前最流行的JDBC驅動。通常JDBC訪問數據庫時建議使用第4種本地協議驅動,該驅動使用純Java編寫,且避開了本地代碼,減少了應用開發(fā)的復雜性,降低了產生沖突和出錯的可能。JDBC驅動14.1.2JDBCAPI提供了一組用于與數據庫進行通信的接口和類,這些接口和類都定義在java.sql包中,常用的接口和類如表14-1所示。14.1.3JDBC

APIJDBC

API

需要注意的是:使用JDBCAPI中的類或接口訪問數據庫時,容易引發(fā)SQLException異常,SQLException異常類是檢查型異常,需要放在try…catch語句中進行異常處理,SQLException是JDBC中其他異常類型的基礎。1.DriverManager類DriverManager是數據庫驅動管理類,用于管理一組JDBC驅動程序的基本服務。應用程序和數據庫之間可以通過DriverManager建立連接,其常用的靜態(tài)方法如表14-2所示。JDBC

API14.1.32.Connection接口Connection接口用于連接數據庫,每個Connection對象代表一個數據庫連接會話,要想訪問數據庫,必須先獲得數據庫連接。一個應用程序可與單個數據庫建立一個或多個連接,也可以與多個數據庫建立連接。通過DriverManager類的getConnection()方法可以返回一個Connection對象,該對象中提供了創(chuàng)建SQL語句的方法,以完成基本的SQL操作,同時為數據庫事務提供了提交和回滾的方法。Connection接口中常用的方法如表14-3所示。JDBC

API14.1.33.Statement接口Statement接口一般用于執(zhí)行SQL語句。在JDBC中要執(zhí)行SQL查詢語句的方式有一般查詢(Statement)、參數查詢(PreparedStatement)和存儲過程(CallableStatement)三種方式。Connection接口中提供的createStatement()、prepareStatement()和prepareCall()方法分別返回一個Statement對象,PreparedStatement對象和CallableStatement對象。Statement、PreparedStatement和CallableStatement三個接口具有繼承關系,其中PreparedStatement是Statement的子接口,而CallableStatement又是PreparedStatement的子接口。Statement接口的主要功能是將SQL語句傳送給數據庫,并返回SQL語句的執(zhí)行結果。Statement提交的SQL語句是靜態(tài)的,不需要接收任何參數,SQL語句可以包含以下三種類型的語句:

●SELECT查詢語句;

●DML語句,如INSERT、UPDATE或DELETE;

●DDL語句,如CREATETABLE和DROPTABLE。JDBC

API14.1.3Statement接口中常用的方法及功能如表14-4所示。JDBC

API

需要注意的是:closeOnCompletion()和isCloseOnCompletion()方法是從Java7開始新增的方法,executeLargeUpdate()方法是從Java8開始新增的方法,在開發(fā)過程中使用這幾個方法時需要注意JDK的版本??紤]到目前應用程序所處理的數據量越來越大,使用executeLargeUpdate()方法具有更好的適應性,但目前有的數據庫驅動暫不支持該方法,例如MySQL驅動。14.1.34.ResultSet接口ResultSet接口用于封裝結果集對象,該對象包含訪問查詢結果的方法。使用Statement中的executeQuery()方法可以返回一個ResultSet結果集的對象,該對象封裝了所有符合查詢條件的記錄。ResultSet具有指向當前數據行的游標,并提供了許多方法來操作結果集中的游標,同時還提供了一套getXXX()方法對結果集中的數據進行訪問,這些方法可以通過列索引或列名獲得數據。ResultSet接口中常用的方法如表14-5所示。JDBC

API14.1.3ResultSet對象具有指向當前數據行的游標。最初游標位于第一行之前,每調用一次next()方法,游標會自動向下移一行,從而可以從上到下依次獲取所有數據行。getXXX()方法用于對游標所指向的行的數據進行訪問。在使用getXXX()方法取值時,數據庫的字段數據類型要與Java的數據類型相匹配,例如,數據庫中的整數字段對應Java數據類型中的int類型,此時使用getInt()方法來讀取該字段中的數據。常用的SQL數據類型和Java數據類型之間的對應關系如表14-6所示。JDBC

API14.1.3第2節(jié)part數據庫環(huán)境搭建14.2.1創(chuàng)建數據庫表

本章JDBC數據庫訪問基于MySQL數據庫,因此所有的代碼及環(huán)境都是基于MySQL數據庫的。在進行數據庫訪問操作之前,需要先創(chuàng)建數據庫和表并錄入測試數據。在root用戶下創(chuàng)建student數據庫,并在該庫下創(chuàng)建t_user表,并添加測試數據,其SQL代碼如下所示。創(chuàng)建數據庫表創(chuàng)建數據庫表

【代碼14.1】student.sqlCREATEDATABASE`student`;CREATETABLE`t_user`(`Id`int(11)NOTNULLAUTO_INCREMENT,`sid`varchar(20)DEFAULTNULL,`name`varchar(20)DEFAULTNULL,`password`varchar(20)DEFAULTNULL,`sex`varchar(20)DEFAULTNULL,`major`varchar(20)DEFAULTNULL,`hobby`varchar(20)DEFAULTNULL,PRIMARYKEY(`Id`));#添加測試數據INSERTINTO`t_user`VALUES(19,'159110909','向守超','111','男','物聯網工程','籃球足球'),(20,'159110901','張恒','123','男','物聯網工程','籃球足球');

創(chuàng)建完庫student、表t_user和添加完數據以后,在MySQL-Front圖形化界面工具中打開,其表中的數據如圖14.3所示。14.2.2設置MySQL驅動類Java項目在訪問MySQL數據庫時,需要在項目中設置MySQL驅動類路徑,即將MySQL數據庫所提供的JDBC驅動程序(mysql-connector-java-5.1.12-bin0)導入到工程中。mysql-connector-java-5.1.12-bin.jar驅動文件可在網絡上直接下載,當然也可以下載其他的版本。

配置MySQL數據庫驅動程序有兩種方法:一種方法是將驅動程序配置到CLASSPATH中,與配置JDK的環(huán)境變量類似,這種方法的配置將對本機中所有創(chuàng)建的項目起作用,但程序員一般不用這種方法;第二種方法是在基礎開發(fā)工具Eclipse中選中項目,右鍵單擊,在彈出的快捷菜單中選擇“Properties→JavaBuildPath→libraries→AddExternalJARs…”命令,在彈出的對話框中,選擇mysql-connector-java-5.1.12-bin.jar文件。如圖14.4所示。設置MySQL驅動類設置MySQL驅動類

設置完MySQL數據庫驅動類路徑之后,項目的目錄如圖14.5所,ReferencedLibraries文件夾中的mysql-connector-java-5.1.12-bin.jar表示對該jar包的引用。14.2.2第3節(jié)part數據庫訪問使用JDBC訪問數據庫的步驟:●加載數據庫驅動;●建立數據連接;●創(chuàng)建Statement對象;●執(zhí)行SQL語句;●訪問結果集;數據庫訪問本節(jié)概述14.3.1加載數據庫驅動

通常使用Class類的forName()靜態(tài)方法來加載數據庫的驅動,其語法格式如下所示://加載驅動Class.forName(數據庫驅動類名);

例如:Class.forName("com.mysql.jdbc.Driver");//加載MySQL驅動

需要注意的是:不同的數據庫其數據庫驅動類是不同的,例如:Oracle數據庫的驅動類是oracle.jdbc.driver.OracleDriver,而MySQL的數據庫驅動類是com.mysql.jdbc.Driver。數據庫廠商在提供數據庫驅動(通常是一個或幾個jar文件)時,會有相應的文檔說明。加載數據庫驅動14.3.2建立數據庫連接

在使用JDBC操作數據庫之前,需要先創(chuàng)建一個數據庫連接,使用DriverManager類的getConnection()靜態(tài)方法來獲取數據庫連接對象,其語法格式如下所示:DriverManager.getConnection(Stringurl,Stringuser,Stringpass);

其中,getConnection()方法有三個參數,具體如下:

●url:數據庫連接字符串,遵循的格式是“jdbc:驅動:其他”,不同的數據庫連接的URL也有所不同。

●user:連接數據庫的用戶名;

●pass:密碼。建立數據庫連接14.3.2建立數據庫連接例如,訪問MySQL數據庫的URL連接字符串"jdbc:mysql://:3306/student"在上面的URL連接字符串中:●jdbc:mysql是協議名稱●“”是本機服務器IP地址,也可以使用“l(fā)ocalhost”;●“3306”是MySQL數據庫的端口號;●“student”是數據庫實例名。例如:獲取MySQL數據庫連接對象Class.forName("com.mysql.jdbc.Driver");Connectionconn=DriverManager.getConnection( "jdbc:mysql://:3306/student",//URL連接字符串 "root",//用戶名 "root");//密碼14.3.3創(chuàng)建Statement對象

對數據庫進行操作或訪問時,需要使用SQL語句。在Java語言中,SQL語句是通過Statement對象進行封裝后,發(fā)送給數據庫。Statement對象不是通過Statement類直接創(chuàng)建的,而是通過Connection對象所提供的方法來創(chuàng)建各種Statement對象。

通過Connection對象來獲得Statement的方法有以下三種:

●createStatement()方法:創(chuàng)建一個基本的Statement對象;

●prepareStatement(Stringsql)方法:根據參數化的SQL語句創(chuàng)建一個預編譯的PreparedStatement對象;

●prepareCall(Stringsql)方法:根據SQL語句來創(chuàng)建一個CallableStatement對象,用于調用數據庫的存儲過程。

例如://創(chuàng)建Statment對象Statementstmt=conn.createStatement();創(chuàng)建Statement對象14.3.4執(zhí)行SQL語句

獲取Statement對象之后,就可以調用該對象的不同方法來執(zhí)行SQL語句。所有的Statement都有三種執(zhí)行SQL語句的方法,具體使用哪一種方法由SQL語句產生的結果來決定:

●executeQuery()方法:只能執(zhí)行查詢語句,例如SELECT語句,用于產生單個結果集;

●executeUpdate()和executeLargeUpdate()方法:用于執(zhí)行DML和DDL語句,執(zhí)行DML(INSERT、UPDATE或DELETE語句)時返回受SQL語句所影響的行數(整數值),而執(zhí)行DDL語句(CREATETABLE、DROPTABLE等)返回值總為0;●execute()方法:可以執(zhí)行任何SQL語句,此方法比較特殊,也比較麻煩,返回結果為多個結果集、多個更新計數或二者的組合。通常不建議使用該方法,只有在不知道執(zhí)行SQL語句會產生什么結果或可能有多種類型結果的情況下才會使用。如果SQL語句運行后能產生結果集,Statement對象則將結果集封裝成ResultSet對象并返回。下述代碼調用Statement對象的executeQuery()方法來執(zhí)行SQL查詢語句,并返回一個ResultSet結果集對象。例如:執(zhí)行SQL查詢語句并返回結果集ResultSetrs=smt.executeQuery("SELECT*FROMt_user");執(zhí)行SQL語句14.3.5訪問結果集SQL的查詢結果使用ResultSet封裝,ResultSet結果集包含了滿足SQL查詢條件的所有的行,使用getXXX()方法對結果集中的數據進行訪問。

當使用getXXX()方法訪問結果集中的數據時,可通過列索引或列名來獲取游標所指行中的列數據,其語法格式如下;getXXX(列索引)

或getXXX(“列名”)

例如:循環(huán)輸出結果集中第三列數據。while(rs.next()){ System.out.println(rs.getString(3));}

或while(rs.next()){ System.out.println(rs.getString("name"));}訪問結果集訪問結果集

需要注意的是:在使用getXXX()方法來獲得數據庫表中的對應字段的數據時,盡可能使用序列號參數,這樣可以提高效率。除Blob類型外,其他任意類型的字段都可以通過getString()方法來獲取,因為所有數據類型都可以自動轉換成字符串。

當數據庫操作執(zhí)行完畢或退出應用前,需將數據庫訪問過程中建立的對象按順序關閉,防止系統資源浪費。關閉的次序是:

①關閉結果集:rs.close();

②關閉Statement對象:stmt.close();

③關閉連接:conn.close();

下述案例用于示例訪問數據庫的一般步驟,代碼如下所示。14.3.5訪問結果集【代碼14.2】ConnectionExample.javapackagecom;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;publicclassConnectionExample{ publicstaticvoidmain(String[]args){ try{ //加載驅動 Class.forName("com.mysql.jdbc.Driver"); //建立數據庫連接 Connectionconn=DriverManager.getConnection( "jdbc:mysql://:3306/student","root","root"); System.out.println("連接成功!"); //創(chuàng)建Statment對象 Statementstmt=conn.createStatement(); //獲取查詢結果集 ResultSetrs=stmt.executeQuery("SELECT*FROMt_user"); 14.3.5訪問結果集 System.out.println("查詢成功!"); //訪問結果集中的數據 while(rs.next()){ System.out.println(rs.getString(1)+"" +rs.getString("name")); } //關閉結果集 rs.close(); //關閉載體 stmt.close(); //關閉連接 conn.close(); }catch(ClassNotFoundExceptione){ e.printStackTrace(); }catch(SQLExceptione){ e.printStackTrace(); } }}14.3.5訪問結果集

上述代碼按照訪問數據庫的一般步驟編寫。

①通過Class.forName()方法加載MySQL數據庫驅動;

②調用DriverManager.getConnection()方法來建立MySQL數據庫連接,在獲取連接時需要指明數據庫連接的URL、用戶名和密碼;

③通過連接對象的createStatement()方法來獲取Statement對象,調用Statement對象的executeQuery()方法執(zhí)行SQL語句;

④調用ResultSet結果集對象的next()方法將游標移動到下一條記錄,再通過getXXX()方法來獲取指定列中的數據;

⑤最后調用close()方法關閉所有創(chuàng)建的對象。

程序運行結果如下所示:

連接成功!

查詢成功!19向守超20張恒14.3.5第4節(jié)part操作數據庫JDBC不僅可以執(zhí)行數據庫查詢,還可以執(zhí)行DDL、DML等SQL語句,以便最大限度地操作數據庫。操作數據庫本節(jié)概述14.4.1execute()方法Statement接口的execute()方法幾乎可以執(zhí)行任何SQL語句,如果不清楚SQL語句的類型,則只能通過使用execute()方法來執(zhí)行SQL語句。

使用execute()方法執(zhí)行SQL語句的返回值是boolean值,表明執(zhí)行該SQL語句是否返回了ResultSet對象:

●當返回值為true時,可以使用Statement的getResultSet()方法,來獲取execute()方法執(zhí)行SQL查詢語句所返回的ResultSet對象;

●當返回值為false時,可以使用getUpdateCount()方法,來獲取execute()方法執(zhí)行DML語句所影響的行數。下述案例示例了Statement對象的execute()方法的使用,代碼如下所示。execute()方法【代碼14.3】ExecuteExample.javapackagecom;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.Statement;publicclassExecuteExample{ privateStringdriver="com.mysql.jdbc.Driver"; privateStringurl="jdbc:mysql://:3306/student"; privateStringuser="root"; privateStringpass="root"; publicvoidexecuteSql(Stringsql)throwsException{ //加載驅動 Class.forName(driver); try( //獲取數據庫連接 Connectionconn=DriverManager.getConnection(url,user,pass); //使用Connection來創(chuàng)建一個Statement對象 Statementstmt=conn.createStatement()){execute()方法14.4.1 //執(zhí)行SQL,返回boolean值表示是否包含ResultSet booleanhasResultSet=stmt.execute(sql); //如果執(zhí)行后有ResultSet結果集 if(hasResultSet){ try( //獲取結果集 ResultSetrs=stmt.getResultSet()){ //迭代輸出ResultSet對象 while(rs.next()){ //依次輸出第1列的值 System.out.print(rs.getString(1)+"\t"); } System.out.println(); } }else{ System.out.println("該SQL語句影響的記錄有" +stmt.getUpdateCount()+"條"); } } }execute()方法14.4.1 publicstaticvoidmain(String[]args)throwsException{ ExecuteExampleexecuteObj=newExecuteExample(); System.out.println("------執(zhí)行建表的DDL語句-----"); executeObj.executeSql("createtablemy_test"+ "(test_idintprimarykey,test_namevarchar(25))"); System.out.println("------執(zhí)行插入數據的DML語句-----"); executeObj.executeSql("insertintomy_test(test_id,test_name)" +"selectid,namefromt_user"); System.out.println("------執(zhí)行查詢數據的查詢語句-----"); executeObj.executeSql("selecttest_namefrommy_test"); System.out.println("------執(zhí)行刪除表的DDL語句-----"); executeObj.executeSql("droptablemy_test"); }}execute()方法14.4.1

上述代碼先定義了一個executeSql()方法,用于執(zhí)行不同的SQL語句,當執(zhí)行結果有ResultSet結果集時,則循環(huán)輸出結果集中第3列的信息;否則輸出該SQL語句所影響的記錄條數。在main()方法中,調用executeSql()方法,分別執(zhí)行建表、插入、查詢和刪除表四個SQL語句。程序運行結果如下:------執(zhí)行建表的DDL語句-----

該SQL語句影響的記錄有0條------執(zhí)行插入數據的DML語句-----

該SQL語句影響的記錄有2條------執(zhí)行查詢數據的查詢語句-----

向守超

張恒

------執(zhí)行刪除表的DDL語句-----

該SQL語句影響的記錄有0條

需要注意的是:使用Statement執(zhí)行DDL和DML語句的步驟與執(zhí)行普通查詢語句的步驟基本相似。區(qū)別在于執(zhí)行DDL語句后返回值為0,而執(zhí)行了DML語句后返回值為受影響的行數。execute()方法14.4.114.4.2executeUpdate()方法executeUpdate()和executeLargeUpdate()方法用于執(zhí)行DDL和DML語句,其中executeLargeUpdate()方法是Java8新增的方法,是增強版的executeUpdate()方法。executeLargeUpdate()方法的返回值類型為long,當DML語句影響的記錄超過Integer.MAX_VALUE時,建議使用該方法。

下述案例示例了Statement對象的executeUpdate()方法的使用,目前MySQL數據庫驅動暫不支持executeLargeUpdate()方法功能。代碼如下所示。executeUpdate()方法executeUpdate()方法【代碼14.4】ExecuteUpdateExample.javapackagecom;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.Statement;publicclassExecuteUpdateExample{ privateStringdriver="com.mysql.jdbc.Driver"; privateStringurl="jdbc:mysql://:3306/student"; privateStringuser="root"; privateStringpass="root"; publicvoidcreateTable(Stringsql)throwsException{ //加載驅動 Class.forName(driver); try( //獲取數據庫連接 Connectionconn=DriverManager.getConnection(url,user,pass); //使用Connection來創(chuàng)建一個Statment對象 Statementstmt=conn.createStatement()){ //執(zhí)行DDL,創(chuàng)建數據表 stmt.executeUpdate(sql); } }14.4.2executeUpdate()方法 publiclonginsertData(Stringsql)throwsException{ //加載驅動 Class.forName(driver); try( //獲取數據庫連接 Connectionconn=DriverManager.getConnection(url,user,pass); //使用Connection來創(chuàng)建一個Statment對象 Statementstmt=conn.createStatement()){ //執(zhí)行DML,返回受影響的記錄條數 returnstmt.executeUpdate(sql); } }

publicstaticvoidmain(String[]args)throwsException{ ExecuteUpdateExampleelud=newExecuteUpdateExample(); elud.createTable("createtablemy_test1"+ "(test_idintprimarykey,test_namevarchar(25))"); System.out.println("-----建表成功-----"); longresult=elud.insertData( "insertintomy_test1(test_id,test_name)selectid,namefromt_user"); System.out.println("--系統中共有"+result+"條記錄受影響--"); }}14.4.2executeUpdate()方法

上述代碼定義了createTable()方法來創(chuàng)建表,insertData()方法用于插入數據,不管是執(zhí)行DDL語句還是執(zhí)行DML語句,最終都是通過調用Statement對象的executeUpdate()方法來實現的。運行該程序,結果如下所示:-----建表成功-------系統中共有2條記錄受影響--14.4.214.4.3PreparedStatement接口PreparedStatement接口繼承Statement接口,該接口具有以下兩個特點:

●PreparedStatement對象中所包含的SQL語句將進行預編譯,當需要多次執(zhí)行同一條SQL語句時,直接執(zhí)行預先編譯好的語句,其執(zhí)行速度比Statement對象快;

●PreparedStatement可用于執(zhí)行動態(tài)的SQL語句,即在SQL語句中提供參數,大大提高了程序的靈活性和執(zhí)行效率。

動態(tài)SQL語句使用“?”作為動態(tài)參數的占位符,示例如下所示。

例如:參數化的動態(tài)SQL語句,創(chuàng)建PreparedStatement對象StringinsertSql="INSERTINTOuserdetails(sid,name,password,sex)VALUES(?,?,?,?)";PreparedStatementpstmt=conn.prepareStatement(insertSql);PreparedStatement接口PreparedStatement接口

在執(zhí)行帶參數的SQL語句前,必須對“?”占位符參數進行賦值。PreparedStatement接口中提供了大量的setXXX()方法,通過占位符的索引完成對輸入參數的賦值,根據參數的類型來選擇對應的setXXX()方法,PreparedStatement接口中提供的常用setXXX()方法如表14-7所示。14.4.3PreparedStatement接口下述案例示例了PreparedStatement的使用,代碼如下所示?!敬a14.5】PreparedStatementExample.javapackagecom;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;publicclassPreparedStatementExample{ publicstaticvoidmain(String[]args){ try{ //加載oracle驅動 Class.forName("com.mysql.jdbc.Driver"); //建立數據庫連接 Connectionconn=DriverManager.getConnection( "jdbc:mysql://:3306/student","root","root"); //定義帶參數的sql語句 StringinsertSql="INSERTINTOt_user(sid,name,password,sex)" +"VALUES(?,?,?,?)"; //創(chuàng)建PreparedStatement對象 PreparedStatementpstmt=conn.prepareStatement(insertSql); 14.4.3PreparedStatement接口 //使用setXXX()方法對參數賦值 pstmt.setInt(1,7); pstmt.setString(2,"Tom"); pstmt.setString(3,"123456"); pstmt.setByte(4,(byte)1); //執(zhí)行 intresult=pstmt.executeUpdate(); System.out.println("插入"+result+"行!"); //關閉載體 pstmt.close(); //關閉連接 conn.close(); }catch(ClassNotFoundExceptione){ e.printStackTrace(); }catch(SQLExceptione){ e.printStackTrace(); } }}14.4.3PreparedStatement接口

上述代碼先定義一個帶參數的SQL語句;再使用該語句來創(chuàng)建一個PreparedStatement對象;然后調用PreparedStatement對象的setXXX()方法對參數進行賦值,并調用PreparedStatement對象的executeUpdate()方法來執(zhí)行SQL語句。運行該程序,結果如下所示:

插入1行!14.4.3第5節(jié)part事務處理

事務是保證底層數據完整的重要手段,對于任何數據庫都是非常重要的。事務是由一步或幾步數據庫操作序列組成的邏輯執(zhí)行單元,這系列操作要么全部執(zhí)行,要么全部放棄執(zhí)行。事務具有ACID四個特性:

●原子性(Atomicity):事務是應用中的最小執(zhí)行單位,就如原子是自然界的最小顆粒一樣,具有不可再分的特性。事務中的全部操作要么全部完成,要么都不執(zhí)行。

●一致性(Consistency):事務執(zhí)行之前和執(zhí)行之后,數據庫都必須處于一致性狀態(tài),即從執(zhí)行前的一個一致狀態(tài)變?yōu)榱硪粋€一致性的狀態(tài)。

●隔離性(Isolation):各個事務的執(zhí)行互不干擾,任意一個事務的內部操作對其他并發(fā)事務都是隔離的,即并發(fā)執(zhí)行的事務之間不能看到對方的中間狀態(tài),并發(fā)事務之間是互不影響的。

●持久性(Durability):事務一旦提交,對數據庫所做的任何改變都永久地記錄到存儲器中,即保存到物理數據庫中,不被丟失。事務處理事務處理

事務處理過程中會涉及到事務的提交、中止和回滾三個概念?!笆聞仗峤弧笔侵赋晒?zhí)行完畢事務,事務提交又分顯示提交和自動提交兩種;“事務中止”是指未能成功完成事務,執(zhí)行中斷;“事務回滾”對于中止事務所造成的變更需要進行撤銷處理,即事務所做的修改全部失效,數據庫返回到事務執(zhí)行前的狀態(tài),事務回滾也有顯示回滾和自動回滾兩種。JDBC對事務操作提供了支持,其事務支持由Connection提供。JDBC的事務操作步驟如下:

①開啟事務;

②執(zhí)行任意多條DML語句;

③執(zhí)行成功,則提交事務;

④執(zhí)行失敗,則回滾事務;Connection在默認情況下會自動提交,即事務是關閉的。此種情況下,一條SQL語句更新成功后,系統會立即調用commit()方法提交到數據庫,而無法對其進行rollback回滾操作。事務處理

使用Connection對象的setAutoCommit()方法可開啟或者關閉自動提交模式,其參數是一個布爾類型,如果參數為false,表示關閉自動提交;如果參數

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論