9.5 通過(guò)JDBC 實(shí)現對數據庫的訪(fǎng)問(wèn)
(1)引用必要的包
import java.sql.*; //它包含有操作數據庫的各個(gè)類(lèi)與接口
(2)加載連接數據庫的驅動(dòng)程序類(lèi)
為實(shí)現與特定的數據庫相連接,JDBC必須加載相應的驅動(dòng)程序類(lèi)。這通??梢圆捎肅lass.forName()方法顯式地加載一個(gè)驅動(dòng)程序類(lèi),由驅動(dòng)程序負責向DriverManager登記注冊并在與數據庫相連接時(shí),DriverManager將使用此驅動(dòng)程序。
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
注意:這條語(yǔ)句直接加載了sun公司提供的JDBC-ODBC Bridge驅動(dòng)程序類(lèi)。
(3)創(chuàng )建與數據源的連接
String url="jdbc:odbc:DatabaseDSN";
Connection con=DriverManager.getConnection(url,"Login","Password");
注意:采用DriverManager類(lèi)中的getConnection()方法實(shí)現與url所指定的數據源建立連接并返回一個(gè)Connection類(lèi)的對象,以后對這個(gè)數據源的操作都是基于該Connection類(lèi)對象;但對于A(yíng)ccess等小型數據庫,可以不用給出用戶(hù)名與密碼。
String url="jdbc:odbc:DatabaseDSN";
Connection con=DriverManager.getConnection(url);
System.out.println(con.getCatalog()); //取得數據庫的完整路徑及文件名
JDBC借用了url語(yǔ)法來(lái)確定全球的數據庫(數據庫URL類(lèi)似于通用的URL),對由url所指定的數據源的表示格式為
jdbc::[ database locator]
jdbc---指出要使用JDBC
subprotocal---定義驅動(dòng)程序類(lèi)型
database locator---提供網(wǎng)絡(luò )數據庫的位置和端口號(包括主機名、端口和數據庫系統名等) jdbc:odbc://host.domain.com:port/databasefile
主協(xié)議jdbc 驅動(dòng)程序類(lèi)型為odbc,它指明JDBC管理器如何訪(fǎng)問(wèn)數據庫,該例指名為采用JDBC-ODBC橋接方式;其它為數據庫的位置表示。
例如:裝載mySQL JDBC驅動(dòng)程序
Class.forName("org.gjt.mm.mysql.Driver ");
String url
="jdbc:mysql://localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//testDB為你的數據庫名
Connection conn= DriverManager.getConnection(url);
例如:裝載Oracle JDBC OCI驅動(dòng)程序(用thin模式)
Class.forName("oracle.jdbc.driver.OracleDriver ");
String url="jdbc:oracle:thin:@localhost:1521:orcl";
//orcl為你的數據庫的SID
String user="scott";
String password="tiger";
Connection conn= DriverManager.getConnection(url,user,password);
注意:也可以通過(guò)con.setCatalog("MyDatabase")來(lái)加載數據庫。
例如:裝載DB2驅動(dòng)程序
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ")
String url="jdbc:db2://localhost:5000/sample";
//sample為你的數據庫名
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
例如:裝載MicroSoft SQLServer驅動(dòng)程序
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver ");
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";
//pubs為你的數據庫的
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
(4)查詢(xún)數據庫的一些結構信息
這主要是獲得數據庫中的各個(gè)表,各個(gè)列及數據類(lèi)型和存儲過(guò)程等各方面的信息。根據這些信息,從而可以訪(fǎng)問(wèn)一個(gè)未知結構的數據庫。這主要是通過(guò)DatabaseMetaData類(lèi)的對象來(lái)實(shí)現并調用其中的方法來(lái)獲得數據庫的詳細信息(即數據庫的基本信息,數據庫中的各個(gè)表的情況,表中的各個(gè)列的信息及索引方面的信息)。
DatabaseMetaData dbms=con.getMetaData();
System.out.println("數據庫的驅動(dòng)程序為 "+dbms.getDriverName());
(5)查詢(xún)數據庫中的數據:
在JDBC中查詢(xún)數據庫中的數據的執行方法可以分為三種類(lèi)型,分別對應Statement (用于執行不帶參數的簡(jiǎn)單SQL語(yǔ)句字符串),PreparedStatement(預編譯SQL語(yǔ)句)和CallableStatement(主要用于執行存儲過(guò)程)三個(gè)接口。
9.5.1、實(shí)現對數據庫的一般查詢(xún)Statement
1、創(chuàng )建Statement對象(要想執行一個(gè)SQL查詢(xún)語(yǔ)句,必須首先創(chuàng )建出Statement對象,它封裝代表要執行的SQL語(yǔ)句)并執行SQL語(yǔ)句以返回一個(gè)ResultSet對象,這可以通過(guò)Connection類(lèi)中的createStatement()方法來(lái)實(shí)現。
Statement stmt=con.createStatement();
2、執行一個(gè)SQL查詢(xún)語(yǔ)句,以查詢(xún)數據庫中的數據。Statement接口提供了三種執行SQL語(yǔ)句的方法:executeQuery()、executeUpdate() 和execute()。具體使用哪一個(gè)方法由SQL語(yǔ)句本身來(lái)決定。
l 方法 executeQuery 用于產(chǎn)生單個(gè)結果集的語(yǔ)句,例如 SELECT 語(yǔ)句等。
l 方法 executeUpdate 用于執行INSERT、UPDATE或DELETE 語(yǔ)句以及SQL DDL(數據定義語(yǔ)言)語(yǔ)句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或DELETE 語(yǔ)句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一個(gè)整數,指示受影響的行數(即更新計數)。對于 CREATE TABLE 或DROP TABLE 等不操作行的語(yǔ)句,executeUpdate 的返回值總為零。
l 方法 execute 用于執行返回多個(gè)結果集、多個(gè)更新計數或二者組合的語(yǔ)句。一般不會(huì )需要該高級功能。
下面給出通過(guò)Statement類(lèi)中的executeQuery()方法來(lái)實(shí)現的代碼段。executeQuery()方法的輸入參數是一個(gè)標準的SQL查詢(xún)語(yǔ)句,其返回值是一個(gè)ResultSet類(lèi)的對象。
ResultSet rs=stmt. executeQuery ("select * from DBTableName");
要點(diǎn):①JDBC在編譯時(shí)并不對將要執行的SQL查詢(xún)語(yǔ)句作任何檢查,只是將其作為一個(gè)String類(lèi)對象,直到驅動(dòng)程序執行SQL查詢(xún)語(yǔ)句時(shí)才知道其是否正確。對于錯誤的SQL查詢(xún)語(yǔ)句,在執行時(shí)將會(huì )產(chǎn)生 SQLException。
②一個(gè)Statement對象在同一時(shí)間只能打開(kāi)一個(gè)結果集,對第二個(gè)結果集的打開(kāi)隱含著(zhù)對第一個(gè)結果集的關(guān)閉。
③如果想對多個(gè)結果集同時(shí)操作,必須創(chuàng )建出多個(gè)Statement對象,在每個(gè)Statement對象上執行SQL查詢(xún)語(yǔ)句以獲得相應的結果集。
④如果不需要同時(shí)處理多個(gè)結果集,則可以在一個(gè)Statement對象上順序執行多個(gè)SQL查詢(xún)語(yǔ)句,對獲得的結果集進(jìn)行順序操作。
import java.sql.*;
public class ResultSetTest
{ public static void main(String args[])
{ try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection("jdbc:odbc:studlist");
Statement stmt=con.createStatement();
ResultSet rs1=stmt.executeQuery("select name from student");
ResultSet rs2=stmt.executeQuery("select age from student");
//此時(shí)rs1已經(jīng)被關(guān)閉
while(rs2.next())
{
System.out.println(rs2.getObject(1));
}
rs2.close();
stmt.close();
con.close();
}
catch(Exception e)
{
System.out.println(e);
}
}
}
注意:
此時(shí)顯示出的將是姓名還是年齡?(將顯示的是rs2的結果集的內容,即學(xué)生的年齡,因為采用JDBC-ODBC方式的驅動(dòng)程序時(shí),并且是采用同一個(gè)Statement對象,它只會(huì )保留最新的結果集,rs1中的內容將會(huì )被新的結果集所取代)。
3、關(guān)閉Statement對象:每一個(gè)Statement對象在使用完畢后,都應該關(guān)閉。
stmt.close()9.5.2、預編譯方式執行SQL語(yǔ)句PreparedStatement
由于Statement對象在每次執行SQL語(yǔ)句時(shí)都將該語(yǔ)句傳給數據庫,如果需要多次執行同一條SQL語(yǔ)句時(shí),這樣將導致執行效率特別低,此時(shí)可以采用PreparedStatement對象來(lái)封裝SQL語(yǔ)句。如果數據庫支持預編譯,它可以將SQL語(yǔ)句傳給數據庫作預編譯,以后每次執行該SQL語(yǔ)句時(shí),可以提高訪(fǎng)問(wèn)速度;但如果數據庫不支持預編譯,將在語(yǔ)句執行時(shí)才傳給數據庫,其效果類(lèi)同于Statement對象。
另外PreparedStatement對象的SQL語(yǔ)句還可以接收參數,可以用不同的輸入參數來(lái)多次執行編譯過(guò)的語(yǔ)句,較Statement靈活方便(詳見(jiàn)后文介紹)。
1、創(chuàng )建PreparedStatement對象:從一個(gè)Connection對象上可以創(chuàng )建一個(gè)PreparedStatement對象,在創(chuàng )建時(shí)可以給出預編譯的SQL語(yǔ)句。
PreparedStatement pstmt=con.prepareStatement("select * from DBTableName");
2、執行SQL語(yǔ)句:可以調用executeQuery()來(lái)實(shí)現,但與Statement方式不同的是,它沒(méi)有參數,因為在創(chuàng )建PreparedStatement對象時(shí)已經(jīng)給出了要執行的SQL語(yǔ)句,系統并進(jìn)行了預編譯。
ResultSet rs=pstmt.executeQuery(); // 該條語(yǔ)句可以被多次執行
3、關(guān)閉PreparedStatement
pstmt.close(); //其實(shí)是調用了父類(lèi)Statement類(lèi)中的close()方法
9.5.3、執行存儲過(guò)程CallableStatement
CallableStatement類(lèi)是PreparedStatement類(lèi)的子類(lèi),因此可以使用在PreparedStatement類(lèi)及Statement類(lèi)中的方法,主要用于執行存儲過(guò)程。
1、創(chuàng )建CallableStatement對象:使用Connection類(lèi)中的prepareCall方法可以創(chuàng )建一個(gè)CallableStatement對象,其參數是一個(gè)String對象,一般格式為:
l 不帶輸入參數的存儲過(guò)程“{call 存儲過(guò)程名()}”。
l 帶輸入參數的存儲過(guò)程“{call存儲過(guò)程名(?, ?)}”
l 帶輸入參數并有返回結果參數的存儲過(guò)程“{? = call 存儲過(guò)程名(?, ?, ...)}”
CallableStatement cstmt=con.prepareCall("{call Query1()}");
2、執行存儲過(guò)程:可以調用executeQuery()方法來(lái)實(shí)現。
ResultSet rs=cstmt.executeQuery();
3、關(guān)閉CallableStatement
cstmt.close(); //其實(shí)是調用了父類(lèi)Statement類(lèi)中的close()方法
(6)檢索記錄集以獲得當前記錄集中的某一記錄的各個(gè)字段的值
9.5.4、ResultSet對象:
① 執行完畢SQL語(yǔ)句后,將返回一個(gè)ResultSet類(lèi)的對象,它包含所有的查詢(xún)結果。但對ResultSet類(lèi)的對象方式依賴(lài)于光標(Cursor)的類(lèi)型,而對每一行中的各個(gè)列,可以按任何順序進(jìn)行處理(當然,如果按從左到右的順序對各列進(jìn)行處理可以獲得較高的執行效率);
ResultSet類(lèi)中的Course方式主要有:
ResultSet.TYPE_FORWARD_ONLY(為缺省設置):光標只能前進(jìn)不能后退,也就是只能從第一個(gè)一直移動(dòng)到最后一個(gè)。
ResultSet.TYPE_SCROLL_SENSITIVE:允許光標前進(jìn)或后退并感應到其它ResultSet的光標的移動(dòng)情形。
ResultSet.TYPE_SCROLL_INSENSITIVE:允許光標前進(jìn)或后退并不能感應到其它ResultSet的光標的移動(dòng)情形。
ResultSet類(lèi)中的數據是否允許修改主要有:
ResultSet.CONCUR_READ_ONLY(為缺省設置):表示數據只能只讀,不能更改。
ResultSet.CONCUR_UPDATABLE:表示數據允許被修改。
可以在創(chuàng )建Statement或PreparedStatement對象時(shí)指定ResultSet的這兩個(gè)特性。
Statement stmt=con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
或
PreparedStatement pstmt=con.PrepareStatement("insert into bookTable values (?,?,?)",ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
② ResultSet類(lèi)的對象維持一個(gè)指向當前行的指針,利用ResultSet類(lèi)的next()方法可以移動(dòng)到下一行(在JDBC中,Java程序一次只能看到一行數據),如果next()的返回值為false,則說(shuō)明已到記錄集的尾部。另外JDBC也沒(méi)有類(lèi)似ODBC 的書(shū)簽功能的方法。
③ 利用ResultSet類(lèi)的getXXX()方法可以獲得某一列的結果,其中XXX代表JDBC中的Java數據類(lèi)型,如 getInt()、getString()、getDate()等。訪(fǎng)問(wèn)時(shí)需要指定要檢索的列(可以采用 int值作為列號(從1開(kāi)始計數)或指定列(字段)名方式,但字段名不區別字母的大小寫(xiě))。
while(rs.next())
{ String name=rs.getString("Name"); //采用“列名”的方式訪(fǎng)問(wèn)數據
int age=rs.getInt("age");
float wage=rs.getFloat("wage");
String homeAddress=rs.getString(4); //采用“列號”的方式訪(fǎng)問(wèn)數據
}
9.5.5、數據轉換
利用ResultSet類(lèi)的getXXX()方法可以實(shí)現將ResultSet中的SQL數據類(lèi)型轉換為它所返回的Java數據類(lèi)型。
9.5.6、NULL結果值
要確定給定結果值是否是JDBC NULL,必須先讀取該列,然后使用ResultSet.wasNull
方法檢查該次讀取是否返回JDBC NULL。
當使用ResultSet.getXXX方法讀取JDBC NULL時(shí),方法wasNull將返回下列值之一:
(1)Javanull值
對于返回Java對象的getXXX方法(例如getString、getBigDecimal、getBytes、getDate、getTime、getTimestamp、getAsciiStream、getUnicodeStream、getBinaryStream、getObject等)。
(2)零值:對于getByte、getShort、getInt、getLong、getFloat和getDouble。
(3)false值:對于getBoolean
9.5.6、獲得結果集中的結構信息:利用ResultSet類(lèi)的getMetaData()方法來(lái)獲得結果集中的一些結構信息(主要提供用來(lái)描述列的數量、列的名稱(chēng)、列的數據類(lèi)型。利用ResulSetMetaData類(lèi)中的方法)。
ResultsetMetaData rsmd=rs.getMetaData();
rsmd.getColumnCount(); //返回結果集中的列數
rsmd.getColumnLabel(1); //返回第一列的列名(字段名)
例如:
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("select * from TableName");
for(int i=1; i<=rs.getMetaData().getColumnCount(); i++) //跟蹤顯示各個(gè)列的名稱(chēng)
{ System.out.print(rs. getColumnName (i)+"\t");
}
while(rs.next())
{ //跟蹤顯示各個(gè)列的值
for(int j=1; j<=rs.getMetaData().getColumnCount(); j++)
{ System.out.print(rs.getObject(j)+"\t");
}
}.6、更新數據庫
前面主要介紹如何實(shí)現對數據庫的查詢(xún)操作,但在許多應用中需要實(shí)現對數據庫的更新,這主要涉及修改、插入和刪除等(即SQL語(yǔ)句中的Insert、Update、Delete、Creat、Drap等)。仍然通過(guò)創(chuàng )建Statement對象來(lái)實(shí)現,但不再調用executeQuery()方法,而是使用executeUpdate()方法。
要點(diǎn)F:正確區分Statement類(lèi)中的executeQuery()、execute()和executeUpdate()方法的用法:(1)
executeQuery() 執行一般的SQL查詢(xún)語(yǔ)句(即SELECT語(yǔ)句)并返回Resultset對象;(2)execute()可以執行各種SQL查詢(xún)語(yǔ)句,并可能返回多個(gè)結果集(這一般主要發(fā)生在執行了返回多個(gè)結果集的存儲過(guò)程時(shí)),此時(shí)可以采用Resultset類(lèi)的getResultSet()來(lái)獲得當前的結果集;(3)executeUpdate()執行對數據庫的更新的SQL語(yǔ)句或DDL語(yǔ)句。
9.6.1 對表中的記錄進(jìn)行操作
對一個(gè)表中的記錄可以進(jìn)行修改、插入和刪除等操作,分別對應SQL的Update、 Insert、Delete操作;executeUpdate()方法的輸入參數仍然為一個(gè)String對象(即所要執行的SQL語(yǔ)句),但輸出參數不是ResultSet對象,而是一個(gè)整數(它代表操作所影響的記錄行數)。
Statement stmt=con.createStatement();
stmt.executeUpdate("Update bookTable set Title='Java2' where Author='zhang'");
stmt.executeUpdate("Delete from bookTable where Author='zhang'");
stmt.executeUpdate("Insert into bookTable(BookID,Author,Title) values(1,'Li Ming','Java2')"); //未給出的列,其值為NULL
程序實(shí)例:對數據庫中的表進(jìn)行更新操作并顯示操作前后的結果
import java.sql.*;
public class DBUpdateSetTest
{ public static void main(String args[])
{ try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection("jdbc:odbc:studlist");
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("select * from student");
System.out.println("Result before executeUpdate");
while(rs.next())
{
System.out.println(rs.getString("name"));
System.out.println(rs.getString("age"));
}
stmt.executeUpdate("Update student set name='Yang' where id=0");
stmt.executeUpdate("Delete from student where id=2");
stmt.executeUpdate("Insert into student(id,name,age,sex) values(2,'zhang',30,true)");
rs=stmt.executeQuery("select * from student");
System.out.println("Result After executeUpdate");
while(rs.next())
{
System.out.println(rs.getString("name"));
System.out.println(rs.getString("age"));
}
rs.close();
stmt.close();
con.close();
}
catch(Exception e)
{
System.out.println(e);
}
}
}
9.6.2 創(chuàng )建和刪除表
創(chuàng )建和刪除一個(gè)表主要對應于SQL的Create Table和Drop Table語(yǔ)句。這可以通過(guò)Statement對象的executeUpdate()方法來(lái)完成。
① 創(chuàng )建表
Statement stmt=con.createStatement();
stmt.executeUpdate("create table TableName(ID integer, Name VARCHAR(20), Age integer)");
stmt.executeUpdate("Insert into TableName(ID, Name, Age) values(1,'Yang Ming',30)");
② 刪除表
Statement stmt=con.createStatement();
stmt.executeUpdate("Drop Table TableName");
9.6.3 增加和刪除表中的列
對一個(gè)表的列進(jìn)行更新操作主要是使用SQL的ALTER Table語(yǔ)句。對列所進(jìn)行的更新操作會(huì )影響到表中的所有的行。
① 增加表中的一列
Statement stmt=con.createStatement();
stmt.executeUpdate("Alter Table TableName add Column Address VarChar(50)");
stmt.executeUpdate("Update TableName set Address='Beijing,China' where ID=1");
② 刪除表中的一列
Statement stmt=con.createStatement();
stmt.executeUpdate("Alter Table TableName Drop Column Address");
stmt.executeQuery("Select * from TableName");
9.6.4 利用PreparedStatement對象實(shí)現數據更新
同SQL查詢(xún)語(yǔ)句一樣,對數據更新語(yǔ)句時(shí)也可以在PreparedStatement對象上執行。使用PreparedStatement對象,只需傳遞一次SQL語(yǔ)句,可以多次執行它,并且可以利用數據庫的預編譯技術(shù),提高執行效率。另外也可以接受參數。
PreparedStatement pstmt=con.prepareStatement("Update TableName set Address='Beijing,China' where ID >1");
pstmt.executeUpdate();9.7 參數的輸入與輸出
要實(shí)現使用SQL語(yǔ)句的輸入與輸出參數,必須在PreparedStatement類(lèi)的對象上進(jìn)行操作;同時(shí)由于CallableStatement類(lèi)是PrepareStatement類(lèi)的子類(lèi),所以在CallableStatemen對象上的操作也可以使用輸入與輸出參數;其主要的編程原理是在生成CallableStatement或PreparedStatement類(lèi)的對象時(shí),可以在SQL語(yǔ)句中指定輸入或輸出參數,在執行這個(gè)SQL語(yǔ)句之前,要對輸入參數進(jìn)行賦值。
(1)使用PreparedStatement類(lèi)的對象
通過(guò)prepareStatement類(lèi)的對象可以實(shí)現在查詢(xún)語(yǔ)句與數據更新語(yǔ)句方面都可以設置輸入參數。
具體的方法是在SQL語(yǔ)句中用“?”標明參數,在執行SQL語(yǔ)句之前,使用setXXX方法給參數賦值,然后使用executeQuery()或executeUpdate()來(lái)執行這個(gè)SQL語(yǔ)句。每次執行SQL語(yǔ)句之前,可以給參數重新賦值。
setXXX方法用于給相應的輸入參數進(jìn)行賦值,其中XXX是JDBC的數據類(lèi)型,如:Int、String等。setXXX方法有兩個(gè)參數,第一個(gè)是要賦值的參數在SQL語(yǔ)句中的位置, SQL語(yǔ)句中的第一個(gè)參數的位置為1,第二個(gè)參數的位置為2;setXXX方法的第二個(gè)參數是要傳遞的值,如100、“Peking”等,隨XXX的不同而為不同的類(lèi)型。
PreparedStatement pstmt=con.prepareStatement("Update TableName set Name=? where ID=?");
pstmt.setString(1,"zhang Hua"); //設置第一個(gè)參數(Name)為 “zhang Hua”
for(int i=1;i<3;i++)
{ pstmt.setInt(2,i); //設置第二個(gè)參數(ID)為 1,2
pstmt.executeUpdate();
}
要點(diǎn):最終實(shí)現 Update TableName set Name=zhang Hua where ID=1 與Update TableName set Name=zhang Hua where ID=2的效果。
(2)使用CallableStatement對象
如果要求調用數據庫的存儲過(guò)程,要使用CallableStatement對象。另外還有些存儲過(guò)程要求用戶(hù)輸入參數,這可以在生成CallableStatement對象的存儲過(guò)程調用語(yǔ)句中設置輸入參數。在執行這個(gè)存儲過(guò)程之前使用setXXX方法給參數賦值,然后再執行這個(gè)存儲過(guò)程。
CallableStatement cstmt=con.prepareCall("{call Query(?)}"); //Query為存儲過(guò)程名
cstmt.setString(1,"輸入參數"); //為存儲過(guò)程提供輸入參數
ResultSet rs=cstmt.executeQuery();
(3)接收輸出參數
某些存儲過(guò)程可能會(huì )返回輸出參數,這時(shí)在執行這個(gè)存儲過(guò)程之前,必須使用CallableStatement的registerOutParameter方法首先登記輸出參數,在registerOutParameter方法中要給出輸出參數的相應位置以及輸出參數的SQL數據類(lèi)型。在執行完存儲過(guò)程以后,必須使用getXXX方法來(lái)獲得輸出參數的值。并在getXXX方法中要指出獲得哪一個(gè)輸出參數(通過(guò)序號來(lái)指定)的值。
實(shí)例:存儲過(guò)程getTestData有三個(gè)輸入參數并返回一個(gè)輸出參數,類(lèi)型分別為VARCHAR。在執行完畢后,分別使用getString()方法來(lái)獲得相應的值。
CallableStatement cstmt = con.prepareCall(“{? = call getTestData (?,?,?)}”);
cstmt.setString(1,Value); //設置輸入參數
cstmt.setInt(2,Value);
cstmt.setFloat(3,Value);
cstmt.registerOutParameter(1,java.sql.Types.VARCHAR); //登記輸出參數
ResultSet rs = cstmt.executeQuery(); //執行存儲過(guò)程
rs.getString(1); //獲得第一個(gè)字段的值
String returnResult=cstmt.getString(1); //獲得返回的輸出參數的值
要點(diǎn):由于getXXX方法不對數據類(lèi)型作任何轉換,在registerOutParameter方法中指明數據庫將返回的SQL數據類(lèi)型,在執行完存儲過(guò)程以后必須采用相應匹配的getXXX方法來(lái)獲得輸出參數的值。