当前位置: 首页 > article >正文

15.6 JDBC数据库编程6——可滚动和可更新的ResultSet

目录

15.6  引言

15.6.1  可滚动的ResultSet

15.6.1  可更新的ResultSet


15.6  引言

可滚动的ResultSet是指在结果集对象上不但可以向前访问结果集中的记录,还可以向后访问结果集中记录。可更新的ResultSet是指不但可以访问结果集中的记录,还可以更新结果对象。

15.6.1  可滚动的ResultSet

        要使用可滚动的Result对象,必须使用Connection对象带参数的createStatement()方法创建的Statement,或使用带参数的PreopareStatement()方法创建PreparedStatement。在该对象上创建的结果集才是可滚动的,这两个方法的格式为:

  • public Statement createStatement(int resultSetType,int concurrency))
  • public PreparedStatement prepareStatement(String sql, int resultSetType,int concurrency);

        如果Statement对象或PreparedStatement对象用于查询,那么这两个参数决定executeQuery()方法返回的ResultSet是否是一个可滚动,可更新的ResultSet:

参数resultSetType的取值为ResultSet接口中定义的下面常量:

  • ResultSet.TYPE_SCROLL_SENSITIVE;
  • ResultSet.TYPE_SCROLL_INSENSITIVE;
  • ResultSet.TYPE_FORWORD_ONLY;

        前两个常量与与创建可滚动的ResultSet。如果使用TYPE_SCROLL_SENSITIVE常量,当数据库发生改变时,这些变化对结果集是敏感的,即数据库变化对结果集可见;如果使用TYPE_SCROLL_INSENSITIVE常量,当数据库发生改变时,这些变化对结果集是不敏感的,即这些变化对结果集不可见。使用TYPE_FORWORD_ONLY常量将创建一个不可滚动的结果集。

对可滚动的结果集,ResultSet接口提供了下面的移动游标的方法:

  • public boolean previous() throws SQLException:游标向前移动一行,如果存在合法的行返回true,否则返回false。
  • public boolean first() throws SQLException:移动游标指向第一行。
  • public boolean last() throws SQLException:移动游标指向最后一行。
  • public boolean absolute() throws SQLException:移动游标指向指定的行。
  • public boolean relative(int rows) throws SQLException:以当前行为基准相对游标的指针,rows为向后或向前的行数。rows若为正值是向前移动;若为负值是向后移动。
  • public boolean isFirst() throws SQLException:返回游标是否指向第一行。
  • public boolean isLast() throws SQLException:返回游标是否指向最后一行。

15.6.1  可更新的ResultSet

        在使用Connection的createStatement(int,int)创建Statement对象时,指定concurrency参数的值决定是否创建可更新的结果集,该参数也使用ResultSet接口中定义的常量,如下所示:

  • ResultSet.CONCUR_READ_ONLY
  • ResultSet.CONCUR_UPDATABLE

使用第一个常量创建只读的ResultSet对象,不能通过它更新表,使用第二个常量则创建可更新的结果集对象。

PreparedStatement pre=
conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs=pre.executeQuery();

 得到可更新的ResultSet对象后,就可以调用适当的updateXxx()方法更新当前行指定列的值。对于每种数据类型,ResultSet都定义了相应的updateXxx()方法

  • public void updateInt(int columnIndex,int x):用指定的整数x的值更新当前行指定列的值,其中columnIndex为列的序号
  • public void updateInt(int columnName,int x):用指定的整数x的值更新当前行指定列的值,其中columnName为列名
  • public void updateString(int columnIndex,int x):用指定的字符串x的值更新当前行指定列的值,其中columnIndex为列的序号
  • public void updateString(int columnIndex,int x):用指定的字符串x的值更新当前行指定列的值,其中columnName为列名

每个updateXxx()方法都有两个重载的版本,一个是第一个参数为int类型的,用来指定更新的列号;另一个是第一个参数为为String类型的,用来指定更新的列名。第二个参数的类型与要更新列的类型一致。有关其他方法请参考Java API文档。

下面是通过可更新的ResultSet对象更新表的方法

  • public void updateRow() throws SQLException:执行方法后,将用当前行的新内容更新结果集,同时更新数据库
  • public void cancelRowUpdate() throws SQLException:取消对结果集当前行的更新。
  • public void moveToInsertRow() throws SQLException:将游标移到插入行。它实际上是一个新行的缓冲区。当游标处于插入行时,调用updateXxx()方法用相应的数据修改每列的值。
  • public void insertRow() thorws SQLException:将当前新行插入到数据库中
  • public void deleteRow() throws SQLException:将结果集中删除当前行,同时从数据库中将该行删除。

        当使用updateXxx()方法更新当前行的所有列之后,调用updateRow()方法把更新写入表中。调用deleteRow()方法从一个表或ResultSet中删除一行数据。
        要插入一行数据首先应该使用moveToInsertRow()方法将游标移动到插入行,当游标处于插入行时,调用updateXxx()方法用相应的数据修改每列的值,最后调用insertRow()方法将新行插入到数据库中。在调用insertRow()方法之前,该行所有的列都必须给定一个值。调用insertRow()方法之后,游标仍位于插入行。这时,可以插入另外一行数据,或移到刚才ResultSet记住的位置(当前行位置)。通过调用moveToCurrentRow()方法返回到当前行。可以在调用insertRow()方法之前调用moveToCurrentRow()方法取消插入。

        下面代码说明了如何在products表中修改一件商品的信息:

import java.sql.*;

public class JDBCselect {
    public static void main(String[] args) throws ClassNotFoundException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://127.0.0.1:3306/webstore?useSSL=true";
        String name = "root";
        String password = "root";
        String sql = "select * from products";
        try (Connection conn = DriverManager.getConnection(url, name, password);
             Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE)        ) {
            ResultSet rst = stmt.executeQuery(sql);
//            while (rst.next()) {
//                System.out.println(rst.getInt(1)
//                        + "\t"
//                        + rst.getString(2)
//                        + "\t"
//                        + rst.getString(3)
//                        + "\t"
//                        + rst.getDouble(4)
//                        + "\t"
//                        + rst.getInt(5));
//            }
            rst.moveToInsertRow();
            rst.updateInt(1,109);
            rst.updateString(2,"苹果");
            rst.updateString(3,"新西方");
            rst.updateDouble(4,7500);
            rst.updateInt(5,21);
            rst.insertRow();
            rst.moveToCurrentRow();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

 


http://www.kler.cn/news/364879.html

相关文章:

  • 关于写删除接口的一些理解
  • 【小白学机器学习16】 概率论的世界观2: 从正态分布去认识世界
  • eachers中的树形图在点击其中某个子节点时关闭其他同级子节点
  • java和嵌入式现在哪个好?
  • 在 typescript 中,如何封装一个 class 类来接收接口的响应数据
  • 王源携手匡威,官宣全球代言人身份,引全网热议
  • FFMPEG录屏(20)--- 枚举macOS下的窗口和屏幕列表,并获取名称缩略图等信息
  • OpenCV系列教程六:信用卡数字识别、人脸检测、车牌/答题卡识别、OCR
  • 利用飞腾派进行OpenCV开发
  • 【C++修炼】初识C++:命名空间、缺省参数、函数重载、引用、内联函数、指针空值
  • java编译[WARNING]告警处理
  • OpenCV KeyPoint与描述子编解码
  • 搭建你的第一个Spring Cloud Alibaba微服务
  • Java | Leetcode Java题解之第492题构造矩形
  • 论文引用收录证明有什么用?
  • vue2之混入(mixin)
  • python的接口自动化的测试与实现java监测jsp源代码Mysql
  • 【React系列二】—React学习历程的分享
  • 2024 JavaScript 入门教程:语法、算法与重要知识点详解
  • 查看linux的版本
  • 电影评论网站开发:Spring Boot技术指南
  • K最近邻算法
  • TinTin Web3 动态精选:Vitalik 探讨以太坊协议,Solana ETN 开启质押功能
  • 数造科技荣获2024DAMA中国“数据治理创新奖”
  • Lua repeat-until循环
  • UEFI BIOSAPP编程开发查询手册.pdf