JDBC高级特性(一)结果集,批量更新
一、ResultSet的高级特性
1 可滚动ResultSet
1)向前和向后滚动
滚动特性
在JDBC初期版本号中, ResultSet仅能向前滚动
在JDBC兴许版本号中, ResultSet默认能向前滚动或前后滚动
迟缓滚动:记录集可前后滚动。不受数据库数据更新影响
灵敏滚动:记录集可前后滚动,受数据库数据更新影响
由结果集类型设定
con.createStatement()
con.createStatement(结果集类型, 结果集并发类型)
con.createStatement(结果集类型, 结果集并发类型,结果集可保存性)
结果集特性设置:
语法
Statement stm = con.createStatement(int resultSetType, int resultSetConcurrency,int resultSetHoldability);
演示样例:
//默认能够前后滚动。记录集类型:受数据库数据改动影响。
//结果集并发类型:能够更新的并发类型
//结果集可保存性:当前事务提交时结果集被关闭
Statement stm = con. createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE,
ResultSet.CLOSE_CURSORS_AT_COMMIT);
ResultSet rs = stm.executeQuery(“select * from student”);
ResultSet结果集类型。结果集并发类型。结果集可保存性特性对PreparedStatament及CallableStatement相同适用
con.prepareStatement(SQL,结果集类型, 结果集并发类型)
con.prepareStatement(SQL。结果集类型, 结果集并发类型,结果集可保存性)
con.prepareCall(SQL。结果集类型, 结果集并发类型)
con.prepareCall(SQL。结果集类型, 结果集并发类型,结果集可保存性)
2 ResultSet定位
1)让游标指向某一行数据
2)结果集支持相对定位和绝对定位
结果集定位就是使游标指向记录集中的某一行数据
ResultSet支持绝对和相对定位
使用absolute()和next()方法进行游标定位
演示样例
sql="select id,name,password,age from person";
rs=stmt.executeQuery(sql);
while(rs.next()){……..} //从第一行前開始向下移动
…
rs.absolute(5); //不管原来指向哪里。直接指向第五行
…
结果集定位的方法:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVmljdG9yX0NpbmR5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
3 可更新ResultSet
1)结果集存放查询结果,默认不可更新
2)通过connection获得statement对象时可设置參数决定是否可通过结果集更新数据
结果集存放查询结果,默认不可更新
通过connection获得statement对象时可设置结果集并发类型參数决定是否可通过结果集更新数据
假设结果集并发类型设置为CONCUR_UPDATABLE就能够通过结果集改动数据
设置后。能够在结果集中对数据进行更新、删除和插入
使用结果集改动数据时,先定位光标位置然后运行更新、删除或插入数据
更新行:
语法
resultSetVar.updateXXX(columnIndex, value);
resultSetVar.updateXXX(“columnName”,value);
resultSetVar.updateRow(); //两个方法要配合使用
cancelRowUpdates(); //取消更新。必须在updateRow()之前使用
演示样例
sql="select id,name,password,age from person";
rs=stmt.executeQuery(sql);
rs.last(); //定位
rs.updateString("name",“oracle");
rs.updateString(3,“oracle”); //updateXXX()方法
rs.updateInt(“age”,21); //这些update方法不会更新底层数据库
rs.updateRow(); //更新底层数据库
删除行:
语法
resultSetVar.deleteRow();
演示样例
sql="select id,name,password,age from person";
rs=stmt.executeQuery(sql);
rs.absolute(10); //将指针定位到相应的行
rs.deleteRow(); //删除当前行数据。同一时候删除底层数据库数据
插入新行:
语法
resultSetVar.moveToInsertRow();
resultSetVar.updateXXX(columnIndex, value);
resultSetVar.updateXXX(“columnName”, value);
resultSetVar.insertRow();
演示样例
rs.moveToInsertRow(); //记住指针位置
rs.updateString(2, “Rose”);
rs.updateString(“password”, “Rose”);
rs.updateInt(“age”, 11);
rs.insertRow(); //插入数据,更新底层数据库
rs.moveToCurrentRow(); //将指针移动到记住的指针位置
可更新结果集的要求:
不是全部结果集都能更新
可更新的结果集必须满足下面条件
查询仅仅引用了一个数据表
查询不包括不论什么联接操作
查询结果中包括主键
查询结果全部列不可为空。没有默认值
二、批量更新
1 Statement批量更新
语法:
Statement stm = con.createStatement();
stm.addBatch(sqlString); stm.addBatch(sqlString);……
stm.executeBatch();
演示样例:
con.setAutoCommit(false); //设置事务非自己主动提交
Statement stm = con.createStatement();
stm.addBatch(“insert into t_user(id, name, password) values(11, ‘Rose’, ‘Rose’)”);
stm.addBatch (“insert into t_user(id, name, password) values(12, ‘Mary’, ‘Mary’)”);
int[] results = stm.executeBatch(); //提交运行
con.commit(); //提交事务。使更改成为持久更改
批量更新一定要将事务提交设为非自己主动提交
con.setAutoCommit(false);
con.commit();
Statement的executeBatch()方法提交多个命令到数据库运行。返回每一个命令更新行数所组成的数组
假设批量更新中的某些命令无法正确运行,则会抛出 BatchUpdateException异常
BatchUpdateException的getUpdateCounts()方法能够返回发生此异常之前批量更新中成功运行的每一个更新语句的更新计数组成的数组
2 PreparedStatement批量更新
PreparedStatement预编译SQL语句。传入參数后运行
PreparedStatement批处理将传入的參数批量送入数据库运行相应的SQL语句
语法:
PreparedStatement pstm = con.prepareStatement(sqlString);
pstm.setXXX(..); pstm.addBatch();
pstm.setXXX(..); pstm.addBatch();
pstm.excuteBatch();
演示样例
con.setAutoCommit(false);
PreparedStatement pstm = con.prepareStatement(“insert into t_user(name) values(?)”);
pstm.setString(1, “Rose”); pstm.addBatch();
pstm.setString(1, “John”); pstm.addBatch();
pstm.setString(1, “Mary”); pstm.addBatch();
int[] counts = pstm.excuteBatch(); con.commit();
3 CallableStatement批量更新
CallableStatement处理数据库储存过程
CallableStatement接口继承PreparedStatement接口
相关批处理方法是从PreparedStatement接口继承而来
CallableStatement批处理与PreparedStatement批处理模式同样
将传入的參数批量送入数据库运行相应的存储过程
JDBC高级特性(一)结果集,批量更新的更多相关文章
- JDBC高级特性(二)事务、并发控制和行集
一.事务 事务是指一个工作单元,它包括了一组加入,删除,改动等数据操作命令,这组命令作为一个总体向系统提交运行,要么都运行成功,要么所有恢复 在JDBC中使用事务 1)con.setAutoCommi ...
- Java JDBC高级特性
1.JDBC批处理 实际开发中需要向数据库发送多条SQL语句,这时,如果逐条执行SQL语句,效率会很低,因此可以使用JDBC提供的批处理机制.Statement和PreparedStatemen都实现 ...
- JAVA 高级特性 JDBC
需要的jdbc jar 包: mysql-connector-java-5.1.38-b...960.9 KB ojdbc6.jar2.0 MB sqljdbc4.jar455.4 KB 数据持 ...
- [疯狂Java]JDBC:事务管理、中间点、批量更新
1. 数据库事务的概念: 1) 事务的目的就是为了保证数据库中数据的完整性. 2) 设想一个银行转账的过程,假设分两步,第一步是A的账户-1000,第二步是B的账户+1000.这两个动 ...
- JAVA基础知识之JDBC——JDBC事务处理及批量更新
JDBC事务 JDBC的事务由Connection提供,默认是打开的. 要开启事务,则要关闭自动提交, conn.setAutoCommit(false); 提交事务使用 conn.commit(); ...
- 【mybatis】mybatis进行批量更新,报错:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right
使用mybatis进行批量更新操作: 报错如下: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an erro ...
- Mybatis批量更新报错com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
批量更新数据,非常简单的一段代码,硬是报错,插入的数据也能显示出来 List<User> userlist = new ArrayList<User>(); userlist. ...
- activemq的高级特性:集群实战
高级特性实战需求 当消费端是多个集群,集群A又包含多个服务. 当每个集群都要接受相同的一批消息,而集群内的每个服务都去分摊消息. 解决办法一:级联 增加一个中转者.但是不是特别的优化,而且性能也不是特 ...
- 《Java核心技术 卷II 高级特性(原书第9版)》
<Java核心技术 卷II 高级特性(原书第9版)> 基本信息 原书名:Core Java Volume II—Advanced Features(Ninth Edition) 作者: ( ...
随机推荐
- linux nohup & 简单使用
线上通常nohup配合&启动程序,同时免疫SIGINT和SIGHUP信号,从而保证程序在后台稳定运行 & 1.后台运行,输出默认到屏幕 2.免疫SIGINT信号,比如Ctrl+c不会杀 ...
- Codeforces_766_D_(并查集)
D. Mahmoud and a Dictionary time limit per test 4 seconds memory limit per test 256 megabytes input ...
- ThinkPHP---thinkphp实用项
[一]代码调试 (1)跟踪信息 ①简介:用于展示系统执行的相关状况,类似于快递的物流信息.ThinkPHP中默认关闭.如需使用,则通过配置项SHOW_PAGE_TRACE(显示页面跟踪)来配置. ②位 ...
- 【原】thinkphp修改Redis操作类,支持选择数据库功能及添加其他方法
版本3.2.2(ThinkPHP\Library\Think\Cache\Driver\Redis.class.php), 一:官方默认不支持选择数据库功能及,现就可选择数据库功能进行说明. 1 co ...
- 面向对象程序设计--Java语言第二周编程题:有秒计时的数字时钟
有秒计时的数字时钟 题目内容: 这一周的编程题是需要你在课程所给的时钟程序的基础上修改而成.但是我们并不直接给你时钟程序的代码,请根据视频自己输入时钟程序的Display和Clock类的代码,然后来做 ...
- C: 当字符数组首指针转化成char *指针,sizeof(*ptr)不为array的size
#include <stdio.h> #include <string.h> int main() { char a[10] = "\0"; char *p ...
- anaconda镜像
下载一个包老是下载不下来,于是放弃了官方版改为国内镜像. 清华镜像 (打开Anaconda Prompt 或者 打开cmd,运行下面的命令) conda config --add channels ...
- python_ 学习笔记(基本数据类型)
python3有6中标准数据类型:Number(数字).String(字符串).List(列表).Tuple(元组).Dictionary(字典).Set(集合)不可变数据:Number.String ...
- 【转】精选十二款餐饮、快递、票务行业微信小程序源码demo推荐
微信小程序的初衷是为了线下实体业服务的,必须有实体相结合才能显示小程序的魅力.个人认为微信小程序对于餐饮业和快递业这样业务比较单一的行业比较有市场,故整理推荐12款餐饮业和快递业微信小程序源码demo ...
- 处理回车提交、ctrl+enter和shift+enter都不提交->textarea正常换行
<input type="textarea" @on-keypress="handlerMultiEnter"> handlerMultiEnter ...