欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Java的數據庫連接編程(JDBC)技術(shù)

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)決定。

     方法 executeQuery 用于產(chǎn)生單個(gè)結果集的語(yǔ)句,例如 SELECT 語(yǔ)句等。

     方法 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 的返回值總為零。

        方法 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對象,一般格式為:

        不帶輸入參數的存儲過(guò)程“{call 存儲過(guò)程名()}”。

     帶輸入參數的存儲過(guò)程“{call存儲過(guò)程名(?, ?)}”

        帶輸入參數并有返回結果參數的存儲過(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)獲得輸出參數的值。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
java_JDBC編程
java使用MySQL學(xué)習
jdbcl連接數據庫
mysql基本的JDBC概念
提升數據訪(fǎng)問(wèn)層的性能(二)
Java的JDBC操作
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久