日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java数据库编程——可滚动和可更新的结果集

發布時間:2023/12/3 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java数据库编程——可滚动和可更新的结果集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【0】README

1) 本文部分文字描述轉自 core java volume 2 , 測試源代碼均為原創, 旨在理解 java數據庫編程——可滾動和可更新的結果集 的基礎知識 ;
2)for database connection config, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/database.properties
3)用戶通常希望在結果集上前后滾動。在可滾動結果集中, 可以在其中向前或向后移動, 甚至可以跳過任意位置;


【1】可滾動結果集

1)默認情況,結果集是不可滾動的;

  • 1.1)為了從查詢中獲得可滾動的結果集, 必須使用下面的方法得到一個不同的Statement 對象:
    Statement stat = conn.createStatement(type, concurrency); (干貨——獲得滾動的結果集)
  • 1.2)如果要獲得預備語句, 請調用下面的方法:
    PreparedStatement stat = conn.preparedStatement(command, type, concurrency);

Attention)下表列出了 type 和 concurrency 的所有可能值:

  • A1)是否希望結果集是滾動的?
  • A2)如果結果集是滾動的, 且數據庫在查詢生成結果集后發生了變化, 那么是否希望結果集反應出這些變化?
  • A3)是否希望通過編輯結果集就可以更新數據庫?
    (干貨——以上3個Attention都是干貨)

2)看個荔枝:

  • 2.1)如果只想滾動遍歷結果集, 而不想編輯它 的數據,那么可以使用以下語句:

    Statement stat = conn.createStatement(ResultSet.Type_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

  • 2.2)現在,通過調用以下方法獲得 的所有結果集都將是可滾動的:

    ResultSet rs = stat.executeQuery(query);

  • 2.3) 可滾動的 結果集有一個游標, 用以指示當期位置;

Attention)

  • A1)并不是所有的數據庫驅動程序都支持可滾動和可更新的結果集;
  • A2)使用 DatabaseMetadata 接口中的 supportsResultSetType 和 supportsResultSetConcurrency 方法, 我們可以獲知在使用特定的驅動程序時, 某個數據庫究竟支持哪些結果集類型以及哪些并發模式; (干貨——查看某個數據庫究竟支持哪些結果集類型以及哪些并發模式)
  • A3)也可以使用 ResultSet 接口中的 getType 和 getConcurrency 方法 查看結果集實際支持的模式;

3)滾動操作: (干貨——滾動集的滾動操作)

  • 3.1)向后滾動: rs.previous(); 如果游標位于一個實際的行上,那么該方法將返回true; 如果游標位于第一行之前,那么就返回false;
  • 3.2)將游標向后或向前移動多行: rs.relative(n); n為正數, 向前移動;或負數, 向后移動; n為0, 不移動;
  • 3.3)將游標設置到指定的行號上: rs.absolute(n);
  • 3.4) 調用以下方法將返回當前行的行號: int curRow = rs.getRow();
  • 3.5)結果的第一行是1, 而不是0;如果返回0, 那么當前游標不在任何行上, 它要么位于第一行前,或最后一行之后; (干貨——可滾動結果集的第一行的index是1, 而不是0)
  • 3.6)其他操作: first, last, beforeFirst, afterLast 方法 , 與 isFirst , isLast, isBeforeFirst, isAfterLast 方法;

Attention) rs.isAfterLast() 表示當前行游標是在最后一行之后嗎。 而 rs.isLast() 表示這是最后一行嗎。他們是有差別的。

4)看個荔枝:(只打印奇數行的name)

  • 4.1)for souce code, please visit : (https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/ScrollResultSet.java)
  • 4.2)key source code at a glance:
public static void main(String[] args){try{try(Connection conn = getConnection()){String sql = "select name from student";// TYPE_SCROLL_INSENSITIVE == 結果集可以滾動但對數據庫變化不敏感;// CONCUR_READ_ONLY == 且結果集不能用于更新數據庫(default);Statement stat = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);ResultSet rs = stat.executeQuery(sql);int rowno;while(true){rowno = rs.getRow(); if(rowno < 1){rs.absolute(1); // 將游標設置到指定的行號上}System.out.println("rowno = " + rs.getRow());// attention for rs.getString not changing row cursorSystem.out.println("row[" + rs.getRow() + "] = " + rs.getString(1));if(!rs.isLast()){// 將游標向后或向前移動多行: rs.relative(n); n為正數, 向前移動;或負數, 向后移動; n為0, 不移動;rs.relative(2);}if(rs.isLast()){break;}}stat.close();conn.close();}}catch(Exception e){e.printStackTrace();}
  • 4.3)relative printing results as follows:

【2】可更新的結果集

1)如果希望編輯結果集中的數據,并且將結果集上的數據變更自動反應到數據庫中, 那么就必須使用可更新的結果集;可更新的結果集并非必須是可滾動的, 但如果將 數據提供給用戶去編輯, 那么通常也會希望結果集時可滾動的;
(干貨——可更新的結果集并非必須是可滾動的, 但如果將 數據提供給用戶去編輯, 那么通常也會希望結果集時可滾動的;)
(干貨——為什么引入可滾動的結果集? 是為了將結果集上的數據變更自動反應到數據庫中)
2)如果要獲得可更新的結果集,應該使用以下方法創建一條語句:

Statement stat = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATEABLE);
這樣, 調用 executeQuery 方法返回的結果集就將是可更新的 結果集了;

Attention)

  • A1)并非所有的查詢都會返回可更新的結果集;
  • A2)如果查詢涉及多個表的連接操作, 那么它所產生的結果集將是不可更新的;
  • A3)可以調用 ResultSet 接口中的 getConcurrency 方法來確定結果集是否是可更新的;

3)看個荔枝: 迭代遍歷所有圖書并更新它們的價格:

String query = "select * from book"; ResultSet rs = stat.executeQuery(query); while(rs.next) {if(...){double price = rs.getDouble("price");rs.updateDouble("price", price + 1000);rs.updateRow(); // 干貨——以上兩行是更新數據庫的操作} }

Attention)

  • A1)在使用第一個參數為列序號的updateXXX 方法時, 請注意這里的列序號指的是該列在結果集中的序號, 而不是數據庫的中的列序號;
  • A2)udpateXXX 方法:改變的只是結果集中的行值, 而非數據庫 中的值;當更新完字段后,必須調用 updateRow 方法, 這個方法將當前行中的更新信息發送給數據庫; (干貨——當更新完字段后,必須調用updateRow 方法)
  • A3)cancelRowUpdates方法:取消對當前行的更新;

4)如果想在數據庫中添加一行新紀錄,按如下步驟進行: (干貨——在可更新結果集中添加一行新記錄到數據庫)

  • step1) 使用 moveToInsertRow 方法: 將游標移動到特定的位置, 我們稱之為插入行;
  • step2)調用 udpateXXX 方法 在插入行的位置上創建一個新的行;
  • step3) 調用insertRow 方法:將新建的行發送給 數據庫;
  • step4)完成插入后,調用 moveToCurrentRow 方法: 將游標移動會調用  moveToCurrentRow  方法之前的位置;

5)看個實例程序:

rs.moveToInsertRow(); rs.updateString("title", title); rs.updateString("title1", title1); rs.updateString("title2", title2); ... rs.updateDouble("price", price); rs.insertRow(); rs.moveToCurrentRow();

Attention)

  • A1)你無法控制在結果集或數據庫中添加新數據的位置;
  • A2) 對于在插入行中沒有指定值的列,將被設置為 null, 而如果這個列有 not null 約束的話, 那么將會拋出異常,而這一行無法插入;
  • A3)你可以使用以下方法刪除游標所指的行:
    • A3.1) rs.deleteRow();
    • A3.2)deleteRow 方法: 會立即將該行從結果集和數據庫中刪除;
    • A3.3)ResultSet 接口中的方法: updateRow, insertRow, deleteRow 方法的執行效果等同于 sql 命令中的update, insert 和 delete 方法;



6)看個荔枝:(將奇數行的name追加_odd, 偶數行的name追加_even)

  • 6.1)for souce code, please visit :
    (https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/UpdatableResultSet.java)
  • 6.2)key source code at a glance:
public static void main(String[] args){try{try(Connection conn = getConnection()){String sql = "select id, name from student";// TYPE_SCROLL_SENSITIVE == 結果集可以滾動且對數據庫變化不敏感;// CONCUR_UPDATABLE == 且結果集能夠應用于更新數據庫;Statement stat = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);// get 可更新的 結果集ResultSet rs = stat.executeQuery(sql);int rowno;while(true){rowno = rs.getRow(); if(rowno < 1){rs.absolute(1); // 將游標設置到指定的行號上}if(rs.getRow() % 2 != 0){rs.updateString("name", rs.getString("name") + "_odd");}else{rs.updateString("name", rs.getString("name") + "_even");}rs.updateRow();// attention for rs.getString not changing row cursorSystem.out.println("row[" + rs.getRow() + "] = " + rs.getString(2));// 將游標向后或向前移動多行: rs.relative(n); n為正數, 向前移動;或負數, 向后移動; n為0, 不移動;rs.relative(1);if(rs.isAfterLast()){break;}}stat.close();conn.close();}}catch(Exception e){e.printStackTrace();}
  • 6.3)relative printing results as follows:

總結

以上是生活随笔為你收集整理的java数据库编程——可滚动和可更新的结果集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。