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

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

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

    Leo's Blog

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      13 隨筆 :: 3 文章 :: 18 評論 :: 0 Trackbacks

    最近寫程序已經很少直接用JDBC了,一直都是用ibaits, Hibernate等來招呼,因為現在的集成框架已經很穩定了。不過對JDBC的直接使用還是不可以忽略的,JDBC3.0提供的n多的新特征還是要熟悉了解的,以前學jdbc的時候就是上網找些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'");

    這是一個用戶登錄時,經常用到的代碼,先是根據用戶名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時傳不同的參數,可以對ResultSet進行不用的錯作限制。con.createStatement的時候,有三種可以掉用的函數:

    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中的數據記錄是只讀的,可以修改
    ?? 2、ResultSet.CONCUR_UPDATABLE? 在ResultSet中的數據記錄可以任意修改,然后更新會數據庫
    其中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的代碼,我把一些特征函數都用出來,但是只是用來查考和說明名靈活性的。

    ?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提供的還有一個功能就是數據庫的批量操作

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

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

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

    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失敗的時候,系統事務回滾UPDATE authors的sql的影響,而INSERT INTO authors的sql仍然有效


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

    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://java.sun.com/j2se/1.5.0/docs/api/java/sql/package-summary.html

    posted on 2006-05-08 10:49 Leo 閱讀(1539) 評論(2)  編輯  收藏 所屬分類: 技術隨文

    評論

    # re: JDBC2/3.0的特征點滴 2006-05-17 10:03 ztroma
    很不錯,謝謝.但是,我有個疑問:
    rs.absolute(5); //游標移動到第5條
    rs.absolute(-1); //游標移動到最后一條
    rs.relative(-5); //游標向上移動5條
    rs.relative(2); //游標向下移動2條
    rs.deleteRow(); //刪除當前行
    rs.last(); //游標移動到最后
    這幾行中,為什么rs.absolute(-1);和rs.last();的作用一樣呢?它們兩者的用法有什么區別呢?  回復  更多評論
      

    # re: JDBC2/3.0的特征點滴 2006-06-21 13:31 anyang
    蹭分,走人!  回復  更多評論
      

    主站蜘蛛池模板: 亚洲AV无码国产一区二区三区| 国产亚洲精品仙踪林在线播放| 男女一边摸一边做爽的免费视频 | 精品一区二区三区无码免费直播| 黄色a级免费网站| 国产无遮挡裸体免费视频| 亚洲精品无码久久久久A片苍井空| 美女网站在线观看视频免费的| 久久久久亚洲?V成人无码| sss在线观看免费高清| 亚洲愉拍99热成人精品热久久| 福利免费在线观看| 亚洲国产精品久久久久婷婷老年| 亚洲免费视频在线观看| 亚洲AV无码精品蜜桃| 国产免费播放一区二区| 亚洲欧洲无码AV电影在线观看| 国产久爱免费精品视频| 亚洲视频在线视频| 中国在线观看免费国语版| 亚洲欧洲av综合色无码| 免费播放春色aⅴ视频| 日本亚洲免费无线码 | 四虎永久在线精品免费观看视频| 青青草原亚洲视频| 日韩精品在线免费观看| 国产亚洲人成网站在线观看不卡| 免费国产成人18在线观看| 亚洲av永久无码精品三区在线4| 国产成人在线免费观看| 99久久免费国产特黄| 亚洲真人日本在线| 免费h片在线观看网址最新| 亚洲色大情网站www| 丁香五月亚洲综合深深爱| 国产男女爽爽爽爽爽免费视频| 亚洲AV日韩综合一区| 亚洲国产第一站精品蜜芽| 成人毛片视频免费网站观看| 亚洲已满18点击进入在线观看| 亚洲第一黄片大全|