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:
- 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:
- 6.3)relative printing results as follows:
總結
以上是生活随笔為你收集整理的java数据库编程——可滚动和可更新的结果集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论云桌面在远程办公中的优势论云桌面在远程
- 下一篇: 迅雷会员支付电脑网页版(迅雷会员微信支付