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

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

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

    我的Blog我做主^_^

    走向一條通往JAVA的不歸路...

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      64 隨筆 :: 68 文章 :: 77 評論 :: 0 Trackbacks
    最近寫程序已經(jīng)很少直接用JDBC了,一直都是用ibaits,?Hibernate等來招呼,因為現(xiàn)在的集成框架已經(jīng)很穩(wěn)定了。不過對JDBC的直接使用還是不可以忽略的,JDBC3.0提供的n多的新特征還是要熟悉了解的,以前學jdbc的時候就是上網(wǎng)找些demo和介紹來學,使用很單一,對JDBC3.0的好多新的特征都忽略了,比如下面一個例子:?

    Statement?stmt?=?con.createStatement();
    ResultSet?rs?=?stmt.executeQuery("SELECT?*?FROM?user?WHERE?username='aa'");
    stmt.executeUpdate("UPDATE?user?SET?lastdatetime=now()?where?username='aa'");?

    這是一個用戶登錄時,經(jīng)常用到的代碼,先是根據(jù)用戶名aa查找該用戶的詳細信息,然后再更新該用戶的最后登錄時間(lastdatetime)。這這個里面,我們用了兩個sql語句,這個是我一直用的方法,但是如果用JDBC2.0給我們提供的便利,我們只要寫一條sql就夠了,其他的都交給jdbc,看下面的代碼:?

    Statement?stmt2?=?con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    ResultSet?rs2?=?stmt.executeQuery("SELECT?*?FROM?user?WHERE?username='aa'");
    rs2.next();
    rs2.updateDate("lastdatetime",?new?Date(Calendar.getInstance().getTimeInMillis()));
    rs2.updateRow();?

    這里面最主要的特征就是ResultSet.TYPE_FORWARD_ONLY和ResultSet.CONCUR_UPDATABLE,通過初始化Statement時傳不同的參數(shù),可以對ResultSet進行不用的錯作限制。con.createStatement的時候,有三種可以掉用的函數(shù):?

    1、createStatement();
    2、createStatement(int?resultSetType,?int?resultSetConcurrency)
    3、createStatement(int?resultSetType,?int?resultSetConcurrency,?int?resultSetHoldability)?

    其中resultSetType可選值是:
    ???1、ResultSet.TYPE_FORWARD_ONLY??在ResultSet中只能先前移動游標,
    ???2、ResultSet.TYPE_SCROLL_INSENSITIVE?在ResultSet中可以隨心所欲的先前向后移動游標,
    ???3、ResultSet.TYPE_SCROLL_SENSITIVE?在ResultSet中可以隨心所欲的先前向后移動游標,同時ResultSet的值有所改變的時候,他可以得到改變后的最新的值
    其中resultSetConcurrency可選值是:
    ???1、ResultSet.CONCUR_READ_ONLY??在ResultSet中的數(shù)據(jù)記錄是只讀的,可以修改
    ???2、ResultSet.CONCUR_UPDATABLE??在ResultSet中的數(shù)據(jù)記錄可以任意修改,然后更新會數(shù)據(jù)庫
    其中resultSetHoldability可選值是:
    ???1、ResultSet.HOLD_CURSORS_OVER_COMMIT?表示修改提交時,不關閉ResultSet的游標
    ???2、ResultSet.CLOSE_CURSORS_AT_COMMIT??表示修改提交時,關閉ResultSet的游標?

    對于查詢操作第一種初始化方法createStatement(),相當于第二種方法的createStatement(ResultSet.TYPE_FORWARD_ONLY,?ResultSet.CONCUR_READ_ONLY),第三種方法的createStatement(ResultSet.TYPE_FORWARD_ONLY,?ResultSet.CONCUR_READ_ONLY,?ResultSet.CLOSE_CURSORS_AT_COMMIT)?

    下面寫一段demo的代碼,我把一些特征函數(shù)都用出來,但是只是用來查考和說明名靈活性的。?

    ?Statement?stmt2?=?con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    ?ResultSet?rs2?=?stmt.executeQuery("SELECT?*?FROM?user");
    ?rs2.next();
    ?rs2.updateDate("lastdatetime",?new?Date(Calendar.getInstance().getTimeInMillis()));
    ?rs2.updateRow();
    ?rs2.afterLast();
    ?while(rs2.previous()){?/**....*/?}
    ?rs.beforeFirst();
    ?while(rs2.next()){??/**....*/?}
    ?rs.last();
    ?rs.first();
    ?rs.absolute(5);?//游標移動到第5條
    ?rs.absolute(-1);??//游標移動到最后一條
    ?rs.relative(-5);??//游標向上移動5條
    ?rs.relative(2);???//游標向下移動2條
    ?rs.deleteRow();?//刪除當前行
    ?rs.last();??//游標移動到最后
    ?rs.updateString("summary",?"This?is?...");?//設置更新的字段值
    ?rs.cancelRowUpdates();??//取消剛才輸入的更新
    ?rs.getRow();?//得到當前行號
    ?rs.moveToInsertRow();??//游標移動到要新增的那條記錄上
    ?rs.updateInt("id",?1);
    ?rs.updateString(2,?"my?name");
    ?rs.insertRow();?//插入新記錄?


    JDBC2.0提供的還有一個功能就是數(shù)據(jù)庫的批量操作:?

    ??con.setAutoCommit(false);
    ??Statement?stmt3?=?con.createStatement();
    ??stmt3.addBatch("insert?.....");
    ??stmt3.addBatch("insert?.....");
    ??int[]?rows?=?stmt3.executeBatch();
    ??con.commit();?

    但是有一點要注意,stmt3.executeBatch()他不會自動給你回滾數(shù)據(jù)操作,當你有5條update語句的時候,如果第三條發(fā)生錯誤,那么將無法自動回滾前兩條update語句的影響,所以一定要自己手工進行事務管理。?

    在您的事務中使用?Savepoint?
    JDBC3.0中最令人興奮的附加特點就是?Savepoint?了。有時候需要的是對事務多一點的控制,而不是在當前的事務中簡單地對每一個改變進行回滾。在JDBC3.0下,您就可以通過?Savepoint?獲得這種控制。Savepoint?接口允許您將事務分割為各個邏輯斷點,以控制有多少事務需要回滾。看下面的代碼:?

    conn.setAutoCommit(false);?
    conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);?
    Statement?stmt?=?conn.createStatement();?
    int?rows?=?stmt.executeUpdate(?"INSERT?INTO?authors?(first_name,?last_name)?valueS(′Lewis′,?′Carroll′)");?
    Savepoint?svpt?=?conn.setSavepoint("NewAuthor");?
    try{
    ?rows?=?stmt.executeUpdate(?"UPDATE?authors?set?type?=?′fiction′?WHERE?last_name?=?′Carroll′");?
    }catch(Exception?e){
    ?conn.rollback(svpt);
    ?rows?=?stmt.executeUpdate(?"?update?..........?other?sql?");
    }
    conn.commit();?

    上面代碼顯示,當UPDATE?authors失敗的時候,系統(tǒng)事務回滾UPDATE?authors的sql的影響,而INSERT?INTO?authors的sql仍然有效?


    檢索自動產(chǎn)生的關鍵字??
    為了解決對獲取自動產(chǎn)生的或自動增加的關鍵字的值的需求,JDBC?3.0現(xiàn)在將獲取這種值變得很輕松。要確定任何所產(chǎn)生的關鍵字的值,只要簡單地在語句的?execute()?方法中指定一個可選的標記,Statement.RETURN_GENERATED_KEYS和Statement.NO_GENERATED_KEYS。在執(zhí)行這條語句后,所產(chǎn)生的關鍵字的值就會通過從?Statement?的實例方法?getGeneratedKeys()?來檢索?ResultSet?而獲得。ResultSet?包含了每個所產(chǎn)生的關鍵字的列。看下面代碼:?

    Statement?stmt?=?conn.createStatement();?
    stmt.executeUpdate("INSERT?INTO?authors?(first_name,?last_name)?valueS?(′George′,?′Orwell′)",?Statement.RETURN_GENERATED_KEYS);?
    ResultSet?rs?=?stmt.getGeneratedKeys();?
    if?(?rs.next()?)?{?
    ?int?key?=?rs.getInt();?
    }

    http://www.netskycn.com/article/articleId2913.html

    posted on 2007-02-05 14:38 java_蟈蟈 閱讀(231) 評論(0)  編輯  收藏 所屬分類: JAVA
    主站蜘蛛池模板: 免费观看一区二区三区| 亚洲Aⅴ在线无码播放毛片一线天| 国产乱妇高清无乱码免费| 午夜亚洲福利在线老司机| 国产亚洲人成在线播放| 日产国产精品亚洲系列| 一级做a爰片久久毛片免费陪| 亚洲AV之男人的天堂| 一级A毛片免费观看久久精品| 亚洲精品视频免费观看| 黄色视频在线免费观看| 亚洲av中文无码乱人伦在线r▽ | 91久久亚洲国产成人精品性色 | 日本红怡院亚洲红怡院最新| 99精品全国免费观看视频..| 亚洲国产精品无码久久一线| 91av免费观看| 国产精品亚洲精品| 国产免费久久精品| 少妇性饥渴无码A区免费| 久久久久亚洲av无码专区喷水| 亚洲一区二区免费视频| 亚洲精品中文字幕无码A片老| 国产青草视频免费观看97 | 国产精品亚洲A∨天堂不卡| 久久久久久夜精品精品免费啦| 亚洲国产成人久久三区| 日韩高清免费在线观看| 99久久免费国产精品热| 亚洲成a人片毛片在线| 国产成人高清精品免费鸭子| a级特黄毛片免费观看| 亚洲国语在线视频手机在线| 四虎影视永久免费视频观看| 国产精品免费看久久久| 亚洲精品无码成人| 亚洲大尺度无码专区尤物| 无码少妇一区二区浪潮免费| 中文字幕版免费电影网站| 亚洲一级免费视频| 国产亚洲AV手机在线观看|