Connection Statement ResultSet

來源:互聯網
上載者:User

 JDBC是由一系列串連(Connection)、SQL語句(Statement)和結果集(ResultSet)構成的,其主要作用概括起來有如下3個方面:
     建立與資料庫的串連。
     向資料庫發起查詢請求。
     處理資料庫返回結果。

   這些作用是通過一系列API實現的,其中的幾個重要介面如表13-1所示。

表13-1 JDBC API中的重要介面
接    口                          作    用
java.sql.DriverManager 處理驅動程式的載入和建立新資料庫連接
java.sql.Connection    處理與特定資料庫的串連
java.sql.Statement         在指定串連中處理SQL語句
java.sql.ResultSet         處理資料庫操作結果集

    這些JDBC API的組成結構13-2所示。

圖13-2 JDBC API的組成結構

     DriverManager

     DriverManager類是Java.sql包中用於資料庫驅動程式管理的類,作用於使用者和驅動程式之間。它跟蹤可用的驅動程式,並在資料庫和相應驅動程式之間建立串連,也處理諸如驅動程式登入時間限制及登入和跟蹤訊息的顯示等事務。DriverManager 類直接繼承自java.lang.object,其主要成員方法如表13-2所示。

表13-2 DriverManager的主要成員方法及其含義

    對於簡單的應用程式,程式開發人員需要在此類中直接使用的惟一方法是 DriverManager.getConnection。該方法是用來建立與資料庫的串連的。JDBC 允許使用者調用 DriverManager 的方法 getDriver、getDrivers 和 registerDriver 及 Driver 的方法 connect。但多數情況下,最好讓 DriverManager 類管理建立串連的細節。

    Connection

     Connection是用來表示資料庫連接的對象,對資料庫的一切操作都是在這個串連的基礎上進行的。Connection類的主要成員方法如表13-3所示。

表13-3 Connection類的主要成員方法及其含義
方    法                    含    義
void clearWarnings     清除串連的所有警告資訊
Statement createStatement()    建立一個statement對象
Statement createStatement(int resultSetType, int resultSetConcurrency)
建立一個statement對象,它將產生具有特定類型和並發性的結果集
void commit()    提交對資料庫的改動並釋放當前串連持有的資料庫的鎖
void rollback()    復原當前事務中的所有改動並釋放當前串連持有的資料庫的鎖
String getCatalog()    擷取連線物件的目前的目錄名
boolean isClosed()     判斷串連是否已關閉
boolean isReadOnly()   判斷串連是否為唯讀模式
void setReadOnly()     設定串連的唯讀模式
void close()   立即釋放連線物件的資料庫和JDBC資源

    Statement

     Statement用於在已經建立的串連的基礎上向資料庫發送SQL語句的對象。它只是一個介面的定義,其中包括了執行SQL語句和擷取返回結果的方法。實際上有3種 Statement 對象:Statement、PreparedStatement(繼承自Statement )和 CallableStatement(繼承自PreparedStatement)。它們都作為在給定串連上執行 SQL 陳述式的容器,每個都專用於發送特定類型的 SQL 陳述式: Statement 對象用於執行不帶參數的簡單 SQL 陳述式;PreparedStatement
對象用於執行帶或不帶 IN 參數的先行編譯 SQL 陳述式;CallableStatement 對象用於執行對資料庫已預存程序的調用。Statement 介面提供了執行語句和擷取結果的基本方法;PreparedStatement 介面添加了處理 IN 參數的方法;而 CallableStatement 添加了處理 OUT 參數的方法。

    建立statement對象的方法如下:
     Statement stmt = con.createStatement();

     Statement介面定義中包括的方法如表13-4所示。

表13-4 Statement介面的主要成員方法及其含義
方    法                            含    義
void addBatch(String sql)      在Statement語句中增加用於資料庫操作的SQL批處理語句
void cancel()             取消Statement中的SQL語句指定的資料庫操作命令
void clearBatch()              清除Statement中的SQL批處理語句
void clearWarnings()       清除Statement語句中的操作引起的警告
void close()               關閉Statement語句指定的資料庫連接
boolean execute(String sql)    執行SQL語句
int[] executeBatch()        執行多個SQL語句
ResultSet executeQuery(String sql)    進行資料庫查詢,返回結果集
int executeUpdate(String sql) 進行資料庫更新
Connection getConnection()     擷取對資料庫的串連
int getFetchDirection()             擷取從資料庫表中擷取行資料的方向
int getFetchSize()              擷取返回的資料庫結果集行數
int getMaxFieldSize()      擷取返回的資料庫結果集最大欄位數
int getMaxRows()                擷取返回的資料庫結果集最大行數
boolean getMoreResults()       擷取Statement的下一個結果
int getQueryTimeout()     擷取查詢逾時設定
ResultSet getResultSet()       擷取結果集
int getUpdateCount()       擷取更新記錄的數量
void setCursorName(String name)       設定資料庫Cursor的名稱
void setFetchDirection(int dir)       設定資料庫表中擷取行資料的方向
void setFetchSize(int rows)        設定返回的資料庫結果集行數
void setMaxFieldSize(int max) 設定最大欄位數
void setMaxRows(int max)            設定最大行數
void setQueryTimeout(int seconds)設定查詢逾時時間

    值得注意的是,Statement 介面提供了3種執行SQL語句的方法:executeQuery、executeUpdate和execute。使用哪一個方法由SQL語句所產生的內容決定。executeQuery方法用於產生單個結果集的SQL語句,如SELECT語句。executeUpdate方法用於執行INSERT、UPDATE、DELETE及DDL(資料定義語言 (Data Definition Language))語句,例如CREATE TABLE 和 DROP TABLE。executeUpdate 的傳回值是一個整數,表示它執行的SQL語句所影響的資料庫中的表的行數(更新計數)。execute
方法用於執行返回多個結果集或多個更新計數的語句。

     PreparedStatement介面繼承了Statement介面,但PreparedStatement語句中包含了經過先行編譯的SQL語句,因此可以獲得更高的執行效率。在PreparedStatement語句中可以包含多個用"?"代表的欄位,在程式中可以利用setXXX方法設定該欄位的內容,從而增強了程式設計的動態性。PreparedStatement介面的主要成員方法及其含義如表13-5所示。

表13-5 PreparedStatement介面的主要成員方法及其含義
方    法                           含    義
void addBatch(String sql)      在Statement語句中增加用於資料庫操作的SQL批處理語句
void clearparameters ()             清除PreparedStatement中的設定參數
ResultSet executeQuery(String sql)    執行SQL查詢語句
ResultSetMetaData getMetaData()       進行資料庫查詢,擷取資料庫中繼資料
void setArray(int index,Array x)      設定為數群組類型
void setAsciiStream(int index,InputStream stream,int length)設定為ASCII輸入資料流
void setBigDecimal(int index,BigDecimal x)    設定為十進位長類型
void setBinaryStream
(int index,InputStream stream,int length)     設定為二進位輸入資料流
void setCharacterStream
(int index,InputStream stream,int length)     設定為字元輸入資料流
void setBoolean(int index, boolean x) 設定為邏輯類型
void setByte(int index,byte b) 設定為位元組類型
void setBytes(int byte[] b)    設定為位元組數群組類型
void setDate(int index,Date x) 設定為日期類型
void setFloat(int index,float x)      設定為浮點類型
void setInt(int index,int x)   設定為整數類型
void setLong(int index,long x) 設定為長整數類型
void setRef(int index,int ref) 設定為參考型別
void setShort(int index,short x)      設定為短整數類型
void setString(int index,String x)    設定為字串類型
void setTime(int index,Time x) 設定為時間類型

     PreparedStatement與Statement的區別在於它構造的SQL語句不是完整的語句,而需要在程式中進行動態設定。這一方面增強了程式設計的靈活性;另一方面,由於PreparedStatement語句是經過先行編譯的,因此它構造的SQL語句的執行效率比較高。所以對於某些使用頻繁的SQL語句,用PreparedStatement語句比用Statement具有明顯的優勢。

     PreparedStatement對象的建立方法如下:
     PreparedStatement pstmt = con.prepareStatement("update tbl_User set reward = ? where userId = ?");

    在該語句中,包括兩個可以進行動態設定的欄位:reward和userId。

    例如,我們想給第一個註冊的使用者5000點獎勵,則可以用下面的方法設定空欄位的內容:

pstmt.setInt(1, 5000);
pstmt. setInt (2, 1);

    如果我們想給前50個註冊的使用者每人5000點獎勵,則可以用迴圈語句對空欄位進行設定:

pstmt.setInt(1, 5000);
for (int i = 0; i < 50; i++)
{
   pstmt.setInt(2,i);
   int rowCount = pstmt.executeUpdate();
}

    如果傳遞的資料量很大,則可以通過將 IN 參數設定為 Java 輸入資料流來完成。當語句執行時,JDBC驅動程式將重複調用該輸入資料流,讀取其內容並將它們當做實際參數資料轉送。JDBC 提供了3種將IN參數設定為輸入資料流的方法:setBinaryStream用於含有未說明位元組的流;setAsciiStream用於含有ASCII字元的流;setUnicodeStream用於含有Unicode字元的流。這些方法比其他的setXXX方法要多一個用於指定流的總長度的參數,因為一些資料庫在發送資料之前需要知道它傳送的資料的大小。

    下面是一個使用流作為 IN 參數傳送檔案內容的例子:

java.io.File file = new java.io.File("/tmp/data");
int fileLength = file.length();
java.io.InputStream fin = new java.io.FileInputStream(file);
java.sql.PreparedStatement pstmt = con.prepareStatement(
"update table set stuff = ? where index = 4");
pstmt.setBinaryStream (1, fin, fileLength);
pstmt.executeUpdate();

    當語句執行時,將反覆調用輸入資料流 fin 以傳遞其資料。

     CallableStatement 對象用於執行對資料庫已預存程序的調用。在CallableStatement對象中,有一個通用的成員方法call,這個方法用於以名稱的方式調用資料庫中的預存程序。在資料庫調用過程中,可以通過設定IN參數向調用的預存程序提供執行所需的參數。另外,在預存程序的調用中,通過OUT參數擷取預存程序的執行結果。

     CallableStatement 介面的主要成員方法及其含義如表13-6所示。

表13-6 CallableStatement 介面的主要成員方法及其含義
方    法                     含    義
Array getArray(int I) 擷取數組
BigDecimal getBigDecimal(int index)
BigDecimal getBigDecimal(int index,int scale)        擷取十進位小數
boolean getBoolean(int index) 擷取邏輯類型
byte getByte(int index)        擷取位元組類型
Date getDate(int index)Date getDate
(int index,Calendar cal)       擷取日期類型
double getDouble(int index) 擷取日期類型雙精確度類型
float getFloat(int index)     擷取日期類型浮點類型
int getint(int index)         擷取日期類型整數類型
long getLong(int index)       擷取日期類型長整數類型
Object getObject(int index)
Object getObject(int index,Map map) 擷取物件類型
Ref getRef(int I)               擷取日期類型Ref類型
short getShort(int index)     擷取日期類型短整數類型
String getString(int index)    擷取日期類型字串類型
Time getTime(int index) Time
getTime(int index,Calendar cal)      擷取時間類型
void registerOutputParameter(int index)
void registerOutputParameter(int index,int type)
void registerOutputParameter
(int index,int type,int scale)   註冊輸出參數
     調用預存程序的文法為:
{call procedure_name}              // 過程不需要參數
{call procedure_name[(?,?,?,...)]}    // 過程需要若干個參數
{? = call procedure_name[(?,?,?,...)]} //過程需要若干個參數並返回一個參數

    其中procedure_name為預存程序的名字,方括弧中的內容是可選的多個用於預存程序執行的參數。CallableStatement 對象的建立方法如下:
     CallableStatement cstmt = con.prepareCall("{call getData(?, ?)}");

    向預存程序傳遞執行需要參數的方法是通過setXXX陳述式完成的。例如,我們可以將兩個參數設定如下:

cstmt.setByte(1, 25);
cstmt.setInt(2,64.85);

    如果需要預存程序返回運行結果,則需要調用registerOutParameter方法設定預存程序的輸出參數,然後調用getXXX方法來擷取預存程序的執行結果。例如:

cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.registerOutParameter(1, java.sql.Types. INTEGER);
cstmt.executeUpdate();
byte a = cstmt.getByte(1);
int b = cstmt.getInt(2);

    從上面的程式可以看出,Java的基礎資料型別 (Elementary Data Type)和SQL中支援的資料類型有一定的對應關係。這種對應關係如表13-7所示。

表13-7 SQL的資料類型與Java資料類型的對應關係
SQL資料類型    Java資料類型
CHAR         String
VARCHAR        String
LONGVARCHAR String
NUMERIC        java.math.BigDecimal
DECIMAL        java.math.BigDecimal
BIT          boolean
TINYINT        byte
SMALLINT       short
INTEGER        int
BIGINT      long
REAL        float
FLOAT     double
DOUBLE     double
BINARY         byte[]
VARBINARY      byte[]
LONGVARBINARY byte[]
DATE    java.sql.Date
TIME    java.sql.Time
TIMESTAMP      java.sql.Timestamp

    ResultSet

    結果集(ResultSet)用來暫時存放資料庫查詢操作獲得的結果。它包含了符合 SQL 陳述式中條件的所有行,並且它提供了一套 get 方法對這些行中的資料進行訪問。ResultSet類的主要成員方法及其含義如表13-8所示。

表13-8 ResultSet類的主要成員方法及其含義
方    法                           含    義
boolean absolute(int row)      將指標移動到結果集對象的某一行
void afterLast()       將指標移動到結果集對象的末尾
void beforeFirst()     將指標移動到結果集對象的頭部
boolean first() 將指標移動到結果集對象的第一行
Array getArray(int row)        擷取結果集中的某一行並將其存入一個數組
boolean getBoolean(int columnIndex)   擷取當前行中某一列的值,返回一個布爾型值
byte getByte(int columnIndex) 擷取當前行中某一列的值,返回一個位元組型值
short getShort(int columnIndex)       擷取當前行中某一列的值,返回一個短整型值
int getInt(int columnIndex)    擷取當前行中某一列的值,返回一個整型值
long getLong(int columnIndex) 擷取當前行中某一列的值,返回一個長整型值
double getDouble(int columnIndex)     擷取當前行中某一列的值,返回一個雙精確度型值
float getFloat(int columnIndex)       擷取當前行中某一列的值,返回一個浮點型值
String getString(int columnIndex)     擷取當前行中某一列的值,返回一個字串
Date getDate(int columnIndex) 擷取當前行中某一列的值,返回一個日期型值
Object getObject(int columnIndex)     擷取當前行中某一列的值,返回一個對象
Statement getStatement()       獲得產生該結果集的Statement對象
URL getURL(int columnIndex)    擷取當前行中某一列的值,返回一個java.net.URL型值
boolean isBeforeFirst()        判斷指標是否在結果集的頭部
boolean isAfterLast() 判斷指標是否在結果集的末尾
boolean isFirst()      判斷指標是否在結果集的第一行
boolean isLast()       判斷指標是否在結果集的最後一行
boolean last() 將指標移動到結果集的最後一行
boolean next() 將指標移動到當前行的下一行
boolean previous()     將指標移動到當前行的前一行

    從表13-8中可以看出,ResultSet類不僅提供了一套用於訪問資料的get方法,還提供了很多移動指標(cursor,有時也譯為游標)的方法。cursor是ResultSet 維護的指向當前資料行的指標。最初它位於第一行之前,因此第一次訪問結果集時通常調用 next方法將指標置於第一行上,使它成為當前行。隨後每次調用 next 指標向下移動一行。(T111)

本文選自飛思圖書《精通Java核心技術》
來源http://hi.baidu.com/lycxq521/blog/item/552623fa0596b9dbb48f319a.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.