<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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



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

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



    為了更好的理解,請(qǐng)看下面這個(gè)例子:



    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ū)動(dòng)程序

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

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

    //建立連接

    //第二步是用適當(dāng)?shù)尿?qū)動(dòng)程序連接到DBMS,看下面的代碼[自行修改您所連接的數(shù)據(jù)庫(kù)相關(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)前的表中有如下幾個(gè)字段: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,"這是個(gè)測(cè)試的應(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();

    }

    }

    }



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

    1、 創(chuàng)建一個(gè)PreparedStatement對(duì)象



    PreparedStatement類(lèi)是Statement類(lèi)的子類(lèi)。同Statemetn類(lèi)一樣,PreparedStatement類(lèi)的對(duì)象也是建立在Connection對(duì)象之上的。如下所示:

    PreparedStatement insertStatement = con.prepareStatement(

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

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



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



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

    現(xiàn)在,讓我們?cè)倩仡^看看我們例子中對(duì)幾個(gè)參數(shù)的初始化情況:

    insertStatement.setInt(1,10);

    insertStatement.setString(2,"thinkersky");

    insertStatement.setString(3,"88888");

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

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

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



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



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

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

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

    FeedBack:
    # re: jdbc 學(xué)習(xí)筆記3(PreparedStatement對(duì)象) [未登錄](méi)
    2010-10-21 16:12 | 無(wú)名
    很詳細(xì),很好,頂  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 亚洲一区二区三区写真| 亚洲熟妇色自偷自拍另类| 亚洲av成人一区二区三区观看在线| 久久久青草青青国产亚洲免观| 亚洲欧美黑人猛交群| 成人免费无码视频在线网站| 亚洲成a人片在线看| 成人免费一级毛片在线播放视频| 亚洲日本香蕉视频| 两个人的视频高清在线观看免费| 亚洲精品午夜国产va久久| 成人免费乱码大片A毛片| 亚洲日韩小电影在线观看| 亚洲av成人一区二区三区观看在线 | 女人体1963午夜免费视频| 亚洲av无码成人黄网站在线观看| 久9这里精品免费视频| 亚洲第一网站男人都懂| 国产福利电影一区二区三区,免费久久久久久久精 | 2022中文字字幕久亚洲| 天堂亚洲国产中文在线| 日本免费一本天堂在线| 污视频网站免费在线观看| 国内自产少妇自拍区免费| 羞羞网站免费观看| 在线A级毛片无码免费真人| 免费无码专区毛片高潮喷水| 日本红怡院亚洲红怡院最新| 四虎在线成人免费网站| 亚洲精品色在线网站| 在线免费视频一区二区| 人人公开免费超级碰碰碰视频 | 亚洲JIZZJIZZ中国少妇中文| 两个人看的www免费| 精品丝袜国产自在线拍亚洲| 免费又黄又爽的视频| 无码专区AAAAAA免费视频| 亚洲精品天堂无码中文字幕| 亚洲理论电影在线观看| 国产一卡2卡3卡4卡2021免费观看 国产一卡2卡3卡4卡无卡免费视频 | 久久国产亚洲观看|