雅典之夏的小站
          知人者智 自知者明 Fighting!!
          二、通過PreparedStatement對象訪問數(shù)據(jù)庫



          前面,我們討論了用連接對象Connection產(chǎn)生Statement對象,然后用Statement與數(shù)據(jù)庫管理系統(tǒng)進(jìn)行交互。Statement對象在每次執(zhí)行SQL語句時都將該語句傳遞給數(shù)據(jù)庫。在多次執(zhí)行同一語句時,這樣做效率較低。解決這個問題的辦法是使用PreparedStatement對象。如果數(shù)據(jù)庫支持預(yù)編譯,可以在創(chuàng)建PreparedStatement對象時將SQL語句傳遞給數(shù)據(jù)庫做預(yù)編譯,以后每次執(zhí)行這個SQL語句時,速度就可以提高很多。如果數(shù)據(jù)庫不支持預(yù)編譯,則在語句執(zhí)行時,才將其傳給數(shù)據(jù)庫。這對于用戶來說是完全透明的。

          PreparedStatement對象的SQL語句還可以接受參數(shù)。在語句中指出需要接受那些參數(shù),然后進(jìn)行預(yù)編譯。在每一次執(zhí)行時,可以將不同的參數(shù)傳遞給SQL語句,大大提高了程序的效率與靈活性。一般情況下,使用PreparedStatement對象都是帶輸入?yún)?shù)的。



          為了更好的理解,請看下面這個例子:



          package com.rongji.demo;



          import java.sql.Connection;

          import java.sql.DriverManager;

          import java.sql.Statement;

          import java.sql.DatabaseMetaData;

          import java.sql.PreparedStatement;





          public class DataConn {

          public DataConn() {

          }

          public static void main(String[] args) {

          try

          {

          //加載驅(qū)動程序

          //下面的代碼為加載JDBD-ODBC驅(qū)動程序

          Class.forName("oracle.jdbc.driver.OracleDriver");

          //建立連接

          //第二步是用適當(dāng)?shù)尿?qū)動程序連接到DBMS,看下面的代碼[自行修改您所連接的數(shù)據(jù)庫相關(guān)信息]:

          String url="jdbc:oracle:thin:@192.168.4.45:1521:oemrep";

          String user = "ums1";

          String password = "rongji";

          //用url創(chuàng)建連接

          Connection con=DriverManager.getConnection(url,user,password);

          //當(dāng)前的表中有如下幾個字段:ID,NAME,PASSWORD,TEXT,NOTE

          PreparedStatement insertStatement = con.prepareStatement(

          "INSERT INTO rbac_application values(?,?,?,?,?)");

          insertStatement.setInt(1,10);

          insertStatement.setString(2,"thinkersky");

          insertStatement.setString(3,"88888");

          insertStatement.setString(4,"這是個測試的應(yīng)用程序");

          insertStatement.setString(5,"備注");

          int result = insertStatement.executeUpdate();

          System.out.println("the result is" + result);

          con.close();

          }

          catch (Exception e)

          {

          //輸出異常信息

          System.err.println("SQLException :"+e.getMessage());

          e.printStackTrace();

          }

          }

          }



          相信通過這個例子,對PreparedStatement這個類的應(yīng)用應(yīng)該有了初步的了解。恩,讓我詳細(xì)介紹一下這個例子吧:)

          1、 創(chuàng)建一個PreparedStatement對象



          PreparedStatement類是Statement類的子類。同Statemetn類一樣,PreparedStatement類的對象也是建立在Connection對象之上的。如下所示:

          PreparedStatement insertStatement = con.prepareStatement(

          "INSERT INTO rbac_application values(?,?,?,?,?)");

          創(chuàng)建該P(yáng)reparedStatement對象時,相應(yīng)的插入記錄的SQL語句已經(jīng)被傳遞到數(shù)據(jù)庫管理系統(tǒng)中進(jìn)行預(yù)編譯。



          2、 為PreparedStatement對象提供參數(shù)



          如果以帶輸入?yún)?shù)的SQL語句形式創(chuàng)建了一個PreparedStatement對象(絕大多數(shù)情況下都是如此)。在SQL語句被數(shù)據(jù)庫管理系統(tǒng)正確執(zhí)行之前,必須為參數(shù)(也就是SQL語句中是’?’的地方)進(jìn)行初始化。初始化的方法是調(diào)用PreparedStatement類的一系列setXXX()方法。如果輸入?yún)?shù)的數(shù)據(jù)類型是int型,則調(diào)用setInt()方法;如果輸入?yún)?shù)是String型,則調(diào)用setString()方法。一般說來,Java中提供的簡單和復(fù)合數(shù)據(jù)類型,都可以找到相應(yīng)的setXXX()方法。

          現(xiàn)在,讓我們再回頭看看我們例子中對幾個參數(shù)的初始化情況:

          insertStatement.setInt(1,10);

          insertStatement.setString(2,"thinkersky");

          insertStatement.setString(3,"88888");

          insertStatement.setString(4,"這是個測試的應(yīng)用程序");

          insertStatement.setString(5,"備注");

          這里,setXXX()方法一般有兩個參數(shù),第一個參數(shù)都是int型,該參數(shù)指示JDBC PreparedStatement對象的第幾個參數(shù)將要被初始化。第二個參數(shù)的值就是PreparedStatemetn將要被初始化的參數(shù)取值,數(shù)據(jù)類型自然也就相同。這里要說明的是當(dāng)PreparedStatement的一個對象的參數(shù)被初始化以后,該參數(shù)的值一直保持不變,直到他被再一次賦值為止。



          3、 調(diào)用PreparedStatement對象的executeUpdate()方法



          這里,要清楚PreparedStatement對象的executeUpdate()方法不同于Statement對象的executeUpdate()方法,前者是不帶參數(shù)的,其所需要的SQL語句型的參數(shù)已經(jīng)在實(shí)例化該對象時提供了。另外,executeUpdate()方法將返回一個整數(shù),這個整數(shù)代表executeUpdate()方法執(zhí)行后所更新的數(shù)據(jù)庫中記錄的行數(shù)。執(zhí)行完上面的例子,其結(jié)果返回為1。那么什么情況下返回0呢?其實(shí)啊,當(dāng)PreparedStatement對象的executeUpdate()方法的返回值是0時。有兩種可能:

          (1) 所執(zhí)行的SQL語句是對數(shù)據(jù)庫管理系統(tǒng)的記錄進(jìn)行操作;并且沒有記錄被 更新

          (2) 所執(zhí)行的SQL語句是對數(shù)據(jù)庫管理系統(tǒng)的表、視圖等對象進(jìn)行操作的DDL語言,沒有數(shù)據(jù)記錄被直接修改。
          posted on 2005-10-27 12:52 rkind 閱讀(1817) 評論(1)  編輯  收藏 所屬分類: JAVA基礎(chǔ)&數(shù)據(jù)庫

          FeedBack:
          # re: jdbc 學(xué)習(xí)筆記3(PreparedStatement對象) [未登錄]
          2010-10-21 16:12 | 無名
          很詳細(xì),很好,頂  回復(fù)  更多評論
            
          主站蜘蛛池模板: 呼玛县| 夹江县| 威远县| 浦江县| 大同县| 武宁县| 乐陵市| 松潘县| 淮阳县| 博爱县| 无锡市| 房产| 崇信县| 高密市| 固镇县| 内江市| 长泰县| 同心县| 新建县| 綦江县| 沁源县| 辽阳县| 永顺县| 新源县| 延庆县| 鄂托克前旗| 松桃| 东海县| 辉南县| 黄山市| 瓦房店市| 荣成市| 黄梅县| 咸丰县| 乐平市| 休宁县| 伊宁县| 涪陵区| 长宁区| 大连市| 绥江县|