可滚动和可更新的结果集ResultSet

@author ixenos

需求背景


1.对于一个只需要分析数据的程序来说,普通的ResultSet已够用

2.但如果ResultSet用于显示一张表或查询结果的可视化数据显示,

  1)会希望用户在结果集上前后移动的需求,

  2)而且一旦展示了结果集的内容,用户会希望修改这些内容,这有两种方式:

    (1)一般通过UPDATE语句修改(更高效)

    (2)通过SELECT得到ResultSet,再遍历修改(意味着可以细化修改操作!)

3.需求总结:细化修改操作,且让用户能任意修改数据的交互程序,需要可滚动和可更新的结果集

4.注意:不是所有的数据库驱动程序都支持可滚动和可更新的结果集

可滚动的结果集


1.默认的结果集不可滚动

2.通过在Statement创建时填入ResultSet的相关参数(type,concurrency)开启功能

Statement stmt = conn.createStatement(type, concurrency);
PreparedStatement preStmt = conn.prepareStatement(command , type , concurrency);

3.ResultSet类的type值

TYPE_FORWARD_ONLY      结果集不能滚动(默认值)

TYPE_SCROLL_INSENSITIVE   结果集可以滚动,但对数据库变化不敏感

TYPE_SCROLL_SENSITIVE    结果集可以滚动,对数据库变化敏感

4.ResultSet类的concurrency值

CONCUR_READ_ONLY      结果集不能用于更新数据库(默认值)

CONCUR_UPDATABLE      结果集可以用于更新数据库

5.示例

1)只想滚动遍历结果集,而不想编辑数据

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

//现在调用执行得到的结果集就是可滚动的
ResultSet rs = stmt.executeQuery(query);

  可滚动的结果集有一个游标,用以指示当前位置

2)结果集的滚动API

(1)将游标向后移动:rs.previous()  (越界返回boolean值)

(2)相对位置:将游标向前或向后移动n行:rs.relative(n)  (n为正数向前移动,n为负数向后移动,n为0不移动,越界返回boolean值)

(3)绝对位置:将游标移动到指定行:rs.absolute(n)

(4)返回行号:int currentRow = rs.getRow()  (第一行行号是1,越界返回boolean值)

(5)其他位置:first、last、beforeFirst、afterLast

(6)判断:isFirst、isLast、isBeforeFirst、isAfterLast

可更新的结果集


1.获得可更新的结果集

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

2.并不是设置参数之后所有的查询都会返回可更新的结果集!

(1)如果查询涉及多个表的连接,那么它所产生的结果集是不可更新的;

(2)如果查询只涉及一个表,或者是使用主键连接多个表的,那么它将产生可更新的结果集;

(3)可调用ResultSet的getConcurrency方法来确定可否更新;

3.API(CRUD操作)

1)更新操作

(1)所有对应于SQL类型的数据类型都有updateXXX方法,与getXXX方法类似用法:必须指定列的名称或序号;

  ()同样,这里序号指的是该列在ResultSet中的序号

(2)updateXXX改变的只是结果集中对应行的值,而非数据库中的值,当更新完行中的字段后,必须要调用updateRow方法提交到数据库中,否则所有更新操作将被丢弃

2)新建操作

(1)插入行:使用moveToInsertRow将游标移动到特定的位置

(2)创建行:调用updateXXX在插入行的位置上创建一个新的行

(3)回原行:调用moveToCurrentRow将游标移回到调用moveToInsetRow方法之前的位置

//插入行的游标位置是特定的,无需指定
rs.moveToInsertRow(); //在插入行插入数据
rs.updateString("Title", title);
rs.updateString("ISBN", isbn);
rs.updateString("Publisher_Id", pubid); //提交创建
rs.insertRow(); //游标回到原来的行
rs.moveToCurrentRow();

  注意:你无法控制在结果集或数据库中添加新数据的位置;对于在插入行中没有指定值的列,将被设为NULL值,但如果有NOT NULL约束,将抛出异常且这一行是无法插入的

3)删除操作

//删除当前游标所指的行
rs.deleteRow();

  deleteRow会立即将该行从结果集和数据库中删除

4)总结

  ResultSet接口中的updateRow、insertRow和deleteRow方法 的执行效果等同于SQL命令中的UPDATE、INSERT和DELETE

4.应用场景示例:

(1)想提高某些图书的价格,但在执行UPDATE语句时又没有一个简单而同一个提价标准,这时需要遍历来修改,所以就用到了可滚动可更新的结果集,这时就比UPDATE灵活

String query = "SELECT * FROM Books";
ResultSet rs = stmt.executeQUERY(query); while(rs.next()){
//迭代结果集时,我们就可以根据业务条件来细化修改
if(...){
double increase = 。。。
double price = rs.getDouble("Price");
//更改结果集中当前行的字段值
rs.updateDouble("Price", price + increase);
//将更改提交到数据库,很关键不能漏
rs.updateRow();
}
}

优缺点


优点:细化修改操作,且让用户能任意修改数据的交互程序

缺点:1.在与用户的整个交互过程中,必须始终与数据库保持连接;

  后果:当用户长时间离开时,数据库连接长时间被占用,而这属于稀缺资源;

  解决:使用行集RowSet,RowSet继承了ResultSet接口,却无需始终保持与数据库的连接~

     2.结果集不便于移动,因为数据结构复杂,且依赖于连接

  解决:使用行集RowSet,RowSet适用于将查询结果移动到复杂应用的其他层,或者其他设备当中

JavaEE JDBC 可滚动和可更新的结果集ResultSet的更多相关文章

  1. java数据库编程——读写LOB、可滚动和可更新的结果集、元数据

    java 数据库编程 1. 读写LOB 除了数字.字符串和日期之外,许多数据库还可以存储大对象,例如图片或其它数据.在SQL中,二进制大对象称为BLOB,字符型大对象称为CLOB. 要读取LOB,需要 ...

  2. JavaEE JDBC ResultSet内外移动

    ResultSet内外移动 @author ixenos 内外移动指位置光标的移动 内移动就是一个ResultSet得到后的那个光标! 外移动就是多个ResultSet的迭代 内移动 一般的数据库都不 ...

  3. JDBC获取sql server存储过程查询结果集(没有出参)

    对于一些较为复杂的统计条件查询,可以通过存储过程来实现,既可以提高效率,减少网络流量,也可以避免sql语句耦合在代码中.但是存储过程返回的结果集如何获取(类似表数据),却着实让我费劲心力. 如下: C ...

  4. Power BI 3-4月功能更新培训合集

    ​Power BI 3-4月功能更新培训合集 Power BI每月功能的更新,都有很多大咖精辟解读,我们一直也都是积极中期待,相信所有P友如是或更甚. 视频学习可以结合微软Power BI 3-4月文 ...

  5. jdbc调用存储过程获取多个结果集

    jdbc调用存储过程获取多个结果集 2017年07月26日 21:20:22 Kenny-Liu 阅读数:1486 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...

  6. JAVA基础知识之JDBC——JDBC事务处理及批量更新

    JDBC事务 JDBC的事务由Connection提供,默认是打开的. 要开启事务,则要关闭自动提交, conn.setAutoCommit(false); 提交事务使用 conn.commit(); ...

  7. JavaEE JDBC 了解JNDI

    了解JNDI @author ixenos Web与企业应用中的连接管理 1. 数据库连接方式: (1)使用配置文件 (2)使用JNDI 2. 在Web或企业环境中部署 JDBC应用时,数据库连接管理 ...

  8. JavaEE JDBC 事务

    JDBC 事务 @author ixenos 事务 1.概念:我们将一组语句构建成一个事务(trans action),当所有语句顺利执行之后,事务可以被提交(commit):否则,如果其中某个语句遇 ...

  9. JavaEE JDBC RowSet行集

    RowSet行集 @author ixenos 应用背景 1.基于结果集的缺点:在与用户的整个交互过程中,必须始终与数据库保持连接 后果:当用户长时间离开时,数据库连接长时间被占用,而这属于稀缺资源: ...

随机推荐

  1. 题解报告:NYOJ #311完全背包(恰好装满)

    描述: 直接说题意,完全背包定义有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的体积是c,价值是w.求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大.本题 ...

  2. ACM_不知所措的统计员

    Problem Description: GDUFE-GAME完美结束,按照惯例,会有一篇报道,描述活动期间的盛况,因此相关人员找到负责统计的ASDF,但是ASDF只知道第i个人在S_i时进场,在E_ ...

  3. $.ajax json 在本地正常 上传服务器不正常

    $.ajax( {                        url:"url",// 跳转到 action                        data:{name ...

  4. GCC的函数声明问题

    Thinking in C++ 第四章 GCC 不需要再MAIN函数前声明 编译也能通过. G++不行.

  5. Android BitmapFactory.decodeFile(filePath, options) 返回 Null 6.0权限

    今天在做拍照上传的时候遇到个问题,根据路径获取Bitmap 失败,一直返回空,以为这个路径获取Bitmap代码久经考验,不怀疑它,找参数传入是否正确,初步怀疑是 filePath 没传进去,打印 fi ...

  6. Android学习笔记(十二) 线程

    Android中的线程和Java中的线程使用方法类似,参考(四)Java基础知识回顾 MainThread与WorkerThread UI相关的线程都运行在主线程(MainThread/UIThrea ...

  7. javaEE web 系统安装时自定义初始化

    通常JavaWeb项目在第一次启动时我们需要做一些初始化工作,比如:初始化一个管理员的登录账户和密码,配置缓存.定时任务等,这些操作可以通过手工修改数据库完成,但是容易出错且繁琐,而且也很麻烦.如果这 ...

  8. Windows 8.1设置WIFI共享以及无法启动承载链接解决方案.

    1.设置WIFI共享方法 2.无法启动承载链接解决方案 1.设置WIFI共享方法 Windows8 windows8.1笔记本wifi热点 wifi共享.快速将笔记本或者台式机的网络共享给手机,平板等 ...

  9. 强大的云存储与应用管理工具DzzOffice1.0 Beta(大桌子办公)发布下载

    之前在9月份我们发布了一份内测版,得到了1000多位朋友参与下载测试.经过2个月,结合测试后朋友们反馈的问题,和开发建议.终于完成了这次Beta版的开发.感谢这两个月中参与测试,和帮助我们完善程序的朋 ...

  10. [安卓开发板]迅为IMX6 四核Android开发板

    工业级核心板-Android开发板 10层高速PCB设计,充分保证电磁兼容 处理器:开发板默认是四核商业扩展级芯片,可根据用户需求更换单核.双核.工业级.汽车级处理器,批量更省成本. 扩展引脚:320 ...