java statement升级_JAVA基础知识之JDBC——ResultSet的滚动和更新(statement的额外参数)...

ResultSet不仅可以内存中的一张二维表一样保存statement执行SQL的结果集,还能通过结果集修改DB的数据。ResultSetMetaData则可以用来获得ResultSet对象的相关信息。

ResultSet支持滚动和并发,但需要在创建statement时候,额外传入参数

可滚动结果集

ResultSet用来定位行的方法有,next(),  last(), absolute(), previous(), afterLast()等等。

支持absolute(), previous(), afterLast()等方法的结果集,称为可滚动结果集。在创建PreparedStatement时,可以通过传入ResultSetType参数来支持可滚动结果集,

ResultSetType支持三种取值,

ResultSet.TYPE_FORWARD_ONLY, 只能向前移动(JDK1.4以前的默认值)

ResultSet.TYPE_SCROLL_INSENSITIVE, 可滚动,但是底层数据的改变不会影响结果集

ResultSet.TYPE_SCROLL_SENSITIVE, 可滚动,底层数据的改变会影响结果集

支持并发结果集

在创建statement时,传入resultSetConcurrency(即并发类型)可以控制结果集的并发性,resultSetConcurrency有两种取值

ResultSet.CONCUR_READ_ONLY,只读的并发模式(默认)

ResultSet.CONCUR_UPDATABLE,可更新的并发模式

另外,可更新的结果集还需要满足两个条件,

所有数据都来自一个表;

选出的数据集必须包含主键列

要通过结果集更新数据库,只需要调用ResultSet对象的updateXxx(index, value)方法修改和updateRow()方法提交即可。

对于支持以上两种特性的结果集,在创建statement时可以这么创建,

1 PreparedStatement pstmt =conn.prepareStatement(sql2 , ResultSet.TYPE_SCROLL_INSENSITIVE3 , ResultSet.CONCUR_UPDATABLE);

下面演示ResultSet的滚动和更新

1 packagedb;2

3 importjava.io.FileInputStream;4 importjava.io.FileNotFoundException;5 importjava.io.IOException;6 importjava.sql.Connection;7 importjava.sql.DriverManager;8 importjava.sql.PreparedStatement;9 importjava.sql.ResultSet;10 importjava.sql.SQLException;11 importjava.util.Properties;12

13 public classResultSetTest {14 privateString driver;15 privateString url;16 privateString user;17 privateString pass;18 public void initParam(String paramFile) throwsFileNotFoundException, IOException, ClassNotFoundException {19 //用Properties类加载属性文件

20 Properties prop = newProperties();21 prop.load(newFileInputStream(paramFile));22 driver = prop.getProperty("driver");23 url = prop.getProperty("url");24 user = prop.getProperty("user");25 pass = prop.getProperty("pass");26 Class.forName(driver);27 }28

29 public void query(String sql) throwsSQLException {30 try(31 Connection conn =DriverManager.getConnection(url, user, pass);32 //创建prepareStatement可以传入额外参数,用来控制结果集是否支持滚动和更新33 //传入两个额外参数,即ResultSet中的两个常量34 //TYPE_SCROLL_INSENSITIVE表示结果集可滚动,但底层数据改变不会影响ResultSet的内容35 //CONCUR_UPDATABLE支持ResultSet可更新的并发模式

36 PreparedStatement pstmt =conn.prepareStatement(sql37 , ResultSet.TYPE_SCROLL_INSENSITIVE38 , ResultSet.CONCUR_UPDATABLE);39 ResultSet rs =pstmt.executeQuery() ) {40 rs.last();41 int rowCount =rs.getRow();42 for (int i = rowCount; i > 0 ; i--) {43 rs.absolute(i);44 System.out.println("打印第 "+i+" 行: "+rs.getString(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3));45 //修改当前行,第2列和第3列的值

46 rs.updateString(2, "学生名"+i);47 rs.updateString(3, "学生名"+(i+1));48 //提交修改

49 rs.updateRow();50 }51 }52 }53

54 public static void main(String[] args) throwsFileNotFoundException, ClassNotFoundException, IOException, SQLException {55 ResultSetTest rt = newResultSetTest();56 rt.initParam("mysql.ini");57 rt.query("select * from jdbc_test");58 }59 }

执行结果如下,

1 打印第 27 行: 27学生名27 学生名282 打印第 26 行: 26学生名26 学生名273 打印第 25 行: 25学生名25 学生名264 打印第 24 行: 24学生名24 学生名255 打印第 23 行: 23学生名23 学生名246 打印第 22 行: 22学生名22 学生名237 打印第 21 行: 21学生名21 学生名228 打印第 20 行: 20学生名20 学生名219 打印第 19 行: 19学生名19 学生名2010 打印第 18 行: 18学生名18 学生名1911 打印第 17 行: 17学生名17 学生名1812 打印第 16 行: 16学生名16 学生名1713 打印第 15 行: 15学生名15 学生名1614 打印第 14 行: 14学生名14 学生名1515 打印第 13 行: 13学生名13 学生名1416 打印第 12 行: 12学生名12 学生名1317 打印第 11 行: 11学生名11 学生名1218 打印第 10 行: 10学生名10 学生名1119 打印第 9 行: 9学生名9 学生名1020 打印第 8 行: 8学生名8 学生名921 打印第 7 行: 7学生名7 学生名822 打印第 6 行: 6学生名6 学生名723 打印第 5 行: 5学生名5 学生名624 打印第 4 行: 4学生名4 学生名525 打印第 3 行: 3学生名3 学生名426 打印第 2 行: 2学生名2 学生名327 打印第 1 行: 1 学生名1 学生名2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值