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时可以这么创建,
PreparedStatement pstmt = conn.prepareStatement(sql
, ResultSet.TYPE_SCROLL_INSENSITIVE
, ResultSet.CONCUR_UPDATABLE);
下面演示ResultSet的滚动和更新
package db; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties; public class ResultSetTest {
private String driver;
private String url;
private String user;
private String pass;
public void initParam(String paramFile) throws FileNotFoundException, IOException, ClassNotFoundException {
//用Properties类加载属性文件
Properties prop = new Properties();
prop.load(new FileInputStream(paramFile));
driver = prop.getProperty("driver");
url = prop.getProperty("url");
user = prop.getProperty("user");
pass = prop.getProperty("pass");
Class.forName(driver);
} public void query(String sql) throws SQLException {
try (
Connection conn = DriverManager.getConnection(url, user, pass);
//创建prepareStatement可以传入额外参数,用来控制结果集是否支持滚动和更新
//传入两个额外参数,即ResultSet中的两个常量
//TYPE_SCROLL_INSENSITIVE表示结果集可滚动,但底层数据改变不会影响ResultSet的内容
//CONCUR_UPDATABLE支持ResultSet可更新的并发模式
PreparedStatement pstmt = conn.prepareStatement(sql
, ResultSet.TYPE_SCROLL_INSENSITIVE
, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = pstmt.executeQuery() ) {
rs.last();
int rowCount = rs.getRow();
for (int i = rowCount; i > 0 ; i--) {
rs.absolute(i);
System.out.println("打印第 "+i+" 行: "+rs.getString(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3));
//修改当前行,第2列和第3列的值
rs.updateString(2, "学生名"+i);
rs.updateString(3, "学生名"+(i+1));
//提交修改
rs.updateRow();
}
}
} public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, IOException, SQLException {
ResultSetTest rt = new ResultSetTest();
rt.initParam("mysql.ini");
rt.query("select * from jdbc_test");
}
}
执行结果如下,
打印第 27 行: 27 学生名27 学生名28
打印第 26 行: 26 学生名26 学生名27
打印第 25 行: 25 学生名25 学生名26
打印第 24 行: 24 学生名24 学生名25
打印第 23 行: 23 学生名23 学生名24
打印第 22 行: 22 学生名22 学生名23
打印第 21 行: 21 学生名21 学生名22
打印第 20 行: 20 学生名20 学生名21
打印第 19 行: 19 学生名19 学生名20
打印第 18 行: 18 学生名18 学生名19
打印第 17 行: 17 学生名17 学生名18
打印第 16 行: 16 学生名16 学生名17
打印第 15 行: 15 学生名15 学生名16
打印第 14 行: 14 学生名14 学生名15
打印第 13 行: 13 学生名13 学生名14
打印第 12 行: 12 学生名12 学生名13
打印第 11 行: 11 学生名11 学生名12
打印第 10 行: 10 学生名10 学生名11
打印第 9 行: 9 学生名9 学生名10
打印第 8 行: 8 学生名8 学生名9
打印第 7 行: 7 学生名7 学生名8
打印第 6 行: 6 学生名6 学生名7
打印第 5 行: 5 学生名5 学生名6
打印第 4 行: 4 学生名4 学生名5
打印第 3 行: 3 学生名3 学生名4
打印第 2 行: 2 学生名2 学生名3
打印第 1 行: 1 学生名1 学生名2
JAVA基础知识之JDBC——ResultSet的滚动和更新(statement的额外参数)的更多相关文章
- JAVA基础知识之JDBC——RowSet
RowSet概念 在C#中,提供了一个DataSet,可以把数据库的数据放在内存中进行离线操作(读写),操作完成之后再同步到数据库中去,Java中则提供了类似的功能RowSet. RowSet接口继承 ...
- JAVA基础知识之JDBC——编程步骤及执行SQL
JDBC编程步骤 下面以mysql数据库为例, 1.加载驱动 首先需要下载数据库的驱动jar文件,并且在eclipse包中加入到class path中去, 例如mysql的驱动文件 mysql-con ...
- JAVA基础知识之JDBC——JDBC数据库连接池
JDBC数据库连接池 数据库的连接和关闭是很耗费资源的操作,前面介绍的DriverManager方式获取的数据库连接,一个Connection对象就对应了一个物理数据库连接,每次操作都要打开一个连接, ...
- JAVA基础知识之JDBC——JDBC事务处理及批量更新
JDBC事务 JDBC的事务由Connection提供,默认是打开的. 要开启事务,则要关闭自动提交, conn.setAutoCommit(false); 提交事务使用 conn.commit(); ...
- JAVA基础知识之JDBC——离线RowSet
离线RowSet 如果直接使用ResultSet, 程序在得到ResultSet记录之后需要立即使用,否则一旦关闭Connection就不再可用,要解决这种情况要么将ResultSet的结果转换成Ja ...
- JAVA基础知识之JDBC——使用ResultSetMetaData分析结果集
通过ResultSetMetaData可以对ResultSet进行分析,获取ResultSet里包含了哪些数据列,以及每个列的数据类型. ResultSet中包含了一个getMetaData()方法, ...
- Java基础知识强化之集合框架笔记32:集合之可变参数的概述和使用
1. 可变参数的概述和使用: (1)可变参数:定义方法的时候不知道该定义多少个参数(2)格式: 修饰符 返回值类型 方法名(数据类型… 变量名){ } 注意: 这里的变量其实是一个数 ...
- java基础知识-笔记整理
1.查看已安装jdk文件路径 CMD输入java -verbose. 2.java学习提升路线 java学习视屏地址: http://www.icoolxue.com/album/show/38 ...
- Java基础-面向接口编程-JDBC详解
Java基础-面向接口编程-JDBC详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.JDBC概念和数据库驱动程序 JDBC(Java Data Base Connectiv ...
随机推荐
- zendFream 中的用到了Ajax(其中有搜索)分页
最近在用ZendFreamwork开发一个后台,其中用到了分页,ZendFreamwork自带的分页挺好用的,可是我其中用到了Ajax的局部刷新,在加上一些搜索条件,所以分页有点无头绪了.下面我来介绍 ...
- dede数据库类使用方法 $dsql
dedecms的数据库操作类,非常实用,在二次开发中尤其重要,这个数据库操作类说明算是奉献给大家的小礼物了. 引入common.inc.php文件 require_once (dirname(__FI ...
- 建造者模式(Builder)
GOF:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 类图:
- java之数组(笔记)
1.与c++不同的声明 int[] i, j; int i[], j; 这两种声明在c++中是同等的,但是在Java中,前者是声明两个,后者是只有i是数组. 2.数组可以看作是特殊的类 3.数组的cl ...
- LaTex 文本排版
一.对齐段落 \\ or \newline 另起一行,而不是另起一段 \\* 在强制断行后,还禁止分页 \newpage 另起一页 \linebreak[n] \nolinebreak[n] \pag ...
- Run P4 without P4factory - A Simple Example In Tutorials. -2
Reference:Github-Tutorial Exercise 2: Implementing TCP flowlet switching 实验准备: 参考之前的博客:Run P4 withou ...
- 设置sublime text2/3中默认预览浏览器快捷键的方法
各位前端大神们,大家在用IDE编辑器的时候喜欢用哪些呢?是Dreamweaver.Zend Studio.editplus又或者是sublime text?今天马浩周给大家就要说说设置sublime ...
- play for scala 实现SessionFilter 过滤未登录用户跳转到登录页面
一.编写SessionFilter.scala代码 package filters import javax.inject.{Inject, Singleton} import akka.stream ...
- Gradle--ubuntu
在Ubuntu安装Gradle也是很简单.切记请勿使用apt-get安装Gradle.因为Ubuntu源的Gradle实在太旧.我用的搜狐的源,竟然是2011年. 下面是安装步骤: 1.在官网下载最新 ...
- WINFORM 打开PDF
这里使用 Adobe Read 组件 的方式 首先电脑上需要安装AdobeRead VS中添加COM引用 再在工具选项卡中添加Adobe PDF Read 组件即可 从工具箱中直接拖动组件到窗体中即可