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.mzph.cn/bicheng/57778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习代码调试5】标准化数据集:TensorFlow Datasets (TFDS)自动化数据加载与预处理

【标准化数据集】TensorFlow Datasets、TFDS:自动化数据加载与预处理 写在最前面1. 什么是 TensorFlow Datasets (TFDS)?主要特点: 2. TFDS 的核心 API:tfds.builder 和 download_and_preparetfds.builder:创建数据集构建器示例&…

【大数据学习 | Zookeeper】Zookeeper的选举机制

zookeeper的选举机制分为第一次启动和非第一次启动两种情况。 1. 选举机制 - > 第一次启动 (1)服务器1启动,发起一次选举。服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为 LOOKIN…

STM32之EC800K 4G模块驱动

1.EC800K简介 EC800K,特别是EC800K-CN,是移远通信专为M2M(机器对机器)和IoT(物联网)领域而设计的超小尺寸LTE Cat 1无线通信模块。EC800K-CN作为一款专为M2M和IoT领域设计的LTE Cat 1无线通信模块&#xff…

w~视觉~合集8

我自己的原文哦~ https://blog.51cto.com/whaosoft/12320868 #xx1 基于mxnet的训练代码迁移到pytorch上和 在yolov5的代码基础上验证了一些目标检测的想法一起发了 在迁移mxnet训练代码的时候,很长一段时间结果都无法对齐,于是我不得不又重新认真的读…

Flutter Column组件实战案例

In this section, we’ll explore the Column widget, a fundamental tool for arranging widgets vertically in Flutter. We’ll dive into its functionality and guide you through using it effectively to create well-organized and visually appealing layouts. 在本节…

UE5 第一人称示例代码阅读0 UEnhancedInputComponent

UEnhancedInputComponent使用流程 我的总结示例分析firstthenand thenfinally&代码关于键盘输入XYZ 我的总结 这个东西是一个对输入进行控制的系统,看了一下第一人称例子里,算是看明白了,但是感觉这东西使用起来有点绕,特此梳…

语言模型微调:提升语言Agent性能的新方向

人工智能咨询培训老师叶梓 转载标明出处 大多数语言Agent依赖于少量样本提示技术(few-shot prompting)和现成的语言模型。这些模型在作为Agent使用时,如生成动作或自我评估,通常表现不佳,且鲁棒性差。 论文《FIREACT…

随机抽取学号

idea 配置 抽学号 浏览器 提交一个100 以内的整数。,后端接受后,根据提供的整数,产生 100 以内的 随机数,返回给浏览器? 前端:提供 随机数范围 ,病发送请求后端:处理随机数的产生&…

【电机应用】变频器控制——变频水泵、变频空调

【电机应用】变频器控制——变频水泵、变频空调 文章目录 [TOC](文章目录) 前言一、变频器1、变频器的组成2、变频器的工作原理3、变频器常用算法 二、变频器的应用场景1、变频水泵2、变频空调 三、参考文献总结 前言 使用工具: 提示:以下是本篇文章正文…

Android 原生开发与Harmony原生开发浅析

Android系统 基于Linux ,架构如下 底层 (Linux )> Native ( C层) > FrameWork层 (SystemService) > 系统应用 (闹钟/日历等) 从Android发版1.0开始到现在15,经历了大大小小的变革 从Android6.0以下是个分水岭,6.0之前权限都是直接卸载Manifest中配置 6.0开始 则分普…

Matlab|基于氢储能的热电联供型微电网优化调度方法

目录 1 主要内容 模型求解流程 2 部分程序 3 程序结果 日前调度 日内调度 4 下载链接 1 主要内容 该程序复现《基于氢储能的热电联供型微电网优化调度方法》,针对质子交换膜燃料电池和电解槽的热电联供特性,为避免氢能系统的热能浪费并进一步提高…

k8s 综合项目笔记

综述 这篇笔记主要是为了记录下自己写 k8s 综合项目的过程。 由于自己之前已经写过简单的开发和运维项目,所以这里就结合一下,在搭建 k8s 集群后安装运维常用服务,比如 ansible 和 prometheus,用 NFS 实现数据存储同步&#xff0c…

Windwos下Docker下载安装centos7.6

操作步骤: 1.打开docker软件进入到DockerHub页面搜索contos镜像 2.在终端通过命令获取镜像并创建容器运行 docker run -itd --name test_centos7.6 centos:7.6.1810 test_centos7.6表示容器的名称 centos:7.6.1810表示镜像的名称,如果镜像不存在会默认拉…

网络层知识点总结4

目录 前言 一、什么是NAT?什么是NAPT?NAT的优点和缺点有哪些?NAPT有哪些特点? 二、建议IPv6协议没有首部检验和。这样做的优缺点是什么? 三、当使用IPv6时,协议ARP是否需要改变?如果需要改变…

ArcGIS计算多个面要素范围内栅格数据各数值的面积

本文介绍在ArcMap软件中,基于面积制表工具(也就是Tabulate Area工具),基于1个面要素数据集与1个栅格数据,计算每一个面要素中各栅格数据分布面积的方法。 首先,来看一下本文的需求。现有一个矢量面的要素集…

Springboot整合原生ES依赖

前言 Springboot整合依赖大概有三种方式: es原生依赖:elasticsearch-rest-high-level-clientSpring Data ElasticsearchEasy-es 三者的区别 1. Elasticsearch Rest High Level Client 简介: 这是官方提供的 Elasticsearch 客户端,支持…

小问题解决方法汇总(2024.10.24水个勋章)

问题1:”因为在系统上禁止运行脚本“ 我们在使用命令行时经常遇到类似文章这样的提示,或者是如下截图中显示的那样: 仅需要在“管理员权限下的Powershell”中输入下面的命令即可解决: set-ExecutionPolicy RemoteSigned 输入命…

【数据分享】全国科技-产品质量国家监督抽查(1995-2021年)

数据介绍 一级标题指标名称单位科技国家监督抽查产品种类种科技国家监督抽查食品种类种科技国家监督抽查日用消费品种类种科技国家监督抽查建筑与装饰装修材料种类种科技国家监督抽查农业生产资料种类种科技国家监督抽查工业生产资料种类种科技国家监督抽查企业家科技国家监督抽…

软工毕设开题建议

文章目录 🚩 1 前言1.1 选题注意事项1.1.1 难度怎么把控?1.1.2 题目名称怎么取? 1.2 开题选题推荐1.2.1 起因1.2.2 核心- 如何避坑(重中之重)1.2.3 怎么办呢? 🚩2 选题概览🚩 3 项目概览题目1 : 深度学习社…

一文讲明白大模型分布式逻辑(从GPU通信原语到Megatron、Deepspeed)

1. 背景介绍 如果你拿到了两台8卡A100的机器(做梦),你的导师让你学习部署并且训练不同尺寸的大模型,并且写一个说明文档。你意识到,你最需要学习的就是关于分布式训练的知识,因为你可是第一次接触这么多卡…