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

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


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


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


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


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


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


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


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


 


 


可滚动的结果集


 


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


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


1
Statement stmt = conn.createStatement(type, concurrency);
1
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)只想滚动遍历结果集,而不想编辑数据


1
2
3
4
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.获得可更新的结果集


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方法之前的位置


1
2
3
4
5
6
7
8
9
10
11
12
13
//插入行的游标位置是特定的,无需指定
rs.moveToInsertRow();
 
//在插入行插入数据
rs.updateString("Title", title);
rs.updateString("ISBN", isbn);
rs.updateString("Publisher_Id", pubid);
 
//提交创建
rs.insertRow();
 
//游标回到原来的行
rs.moveToCurrentRow();
  注意:你无法控制在结果集或数据库中添加新数据的位置;对于在插入行中没有指定值的列,将被设为NULL值,但如果有NOT NULL约束,将抛出异常且这一行是无法插入的


 


3)删除操作


1
2
//删除当前游标所指的行
rs.deleteRow();
  deleteRow会立即将该行从结果集和数据库中删除


 


4)总结


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


 


 


 


4.应用场景示例:


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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
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适用于将查询结果移动到复杂应用的其他层,或者其他设备当中
已标记关键词 清除标记
相关推荐
<p> <b><span style="background-color:#FFE500;">【超实用课程内容】</span></b> </p> <p> <br /> </p> <p> <br /> </p> <p> 本课程内容包含讲解<span>解读Nginx的基础知识,</span><span>解读Nginx的核心知识、带领学员进行</span>高并发环境下的Nginx性能优化实战,让学生能够快速将所学融合到企业应用中。 </p> <p> <br /> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><br /> </b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><span style="background-color:#FFE500;">【课程如何观看?】</span></b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> PC端:<a href="https://edu.csdn.net/course/detail/26277"><span id="__kindeditor_bookmark_start_21__"></span></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 移动端:CSDN 学院APP(注意不是CSDN APP哦) </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 本课程为录播课,课程永久有效观看时长,大家可以抓紧时间学习后一起讨论哦~ </p> <p style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <strong><span style="background-color:#FFE500;">【学员专享增值服务】</span></strong> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b>源码开放</b> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化 </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 下载方式:电脑登录<a href="https://edu.csdn.net/course/detail/26277"></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a>,播放页面右侧点击课件进行资料打包下载 </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p>
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页