executeBatch()相关操作汇总
环境:oracle
使用PreparedStatement的executeBatch方法,如果DML操作成功,返回值[-2,-2,...]
an array of update counts containing one element for each command in the batch.
- int java.sql.Statement.SUCCESS_NO_INFO = -2 [0xfffffffe]
- The constant indicating that a batch statement executed successfully but that no count of the number of rows it affected is available
- int java.sql.Statement.EXECUTE_FAILED = -3 [0xfffffffd]
- The constant indicating that an error occured while executing a batch statement.
在执行executeBatch()时报错:
(1)使用class12.jar,返回array中的值为[-3,-3,...];
(2)使用ojdbc6.jar,返回array为空数组[]
使用class12.jar或ojdbc6.jar,在遇到出错DML语句前执行的sql都会入库,
即使设定Connection的auto-commit mode为false。
如果期望在执行executeBatch()失败后回退,可以在catch中执行java.sql.Connection.rollback().
使用rollback()需要设置java.sql.Connection.setAutoCommit(false);在操作最后执行提交操作java.sql.Connection.commit();
- void rollback()
- throws SQLException
- Undoes all changes made in the current transaction and releases any database locks currently held by this
Connection
object. This method should be used only when auto-commit mode has been disabled. -
- Throws:
SQLException
- if a database access error occurs, this method is called while participating in a distributed transaction, this method is called on a closed connection or thisConnection
object is in auto-commit mode- See Also:
setAutoCommit(boolean)
eg:
java.sql.Connection.setAutoCommit(false);
...
preStmt.addBatch();
....
preStmt.executeBatch();
...
java.sql.Connection.commit();
- void java.sql.Connection.setAutoCommit(boolean autoCommit) throws SQLException
- Sets this connection's auto-commit mode to the given state. If a connection is in auto-commit mode,
- then all its SQL statements will be executed and committed as individual transactions. Otherwise,
- its SQL statements are grouped into transactions that are terminated by a call to either the method commit or the method rollback.
- By default, new connections are in auto-commit mode.
- The commit occurs when the statement completes. The time when the statement completes depends on the type of SQL Statement:
- For DML statements, such as Insert, Update or Delete, and DDL statements, the statement is complete as soon as it has finished executing.
- For Select statements, the statement is complete when the associated result set is closed.
- For CallableStatement objects or for statements that return multiple results, the statement is complete
- when all of the associated result sets have been closed, and all update counts and output parameters have been retrieved.
- NOTE: If this method is called during a transaction and the auto-commit mode is changed, the transaction is committed.
- If setAutoCommit is called and the auto-commit mode is not changed, the call is a no-op.
- Parameters:
- autoCommit true to enable auto-commit mode; false to disable it
- Throws:
- SQLException - if a database access error occurs, setAutoCommit(true) is called while participating in a distributed transaction,
- or this method is called on a closed connection
- int[] java.sql.Statement.executeBatch() throws SQLException
- Submits a batch of commands to the database for execution and if all commands execute successfully, returns an array of update counts. The int elements of the array that is returned are ordered to correspond to the commands in the batch, which are ordered according to the order in which they were added to the batch. The elements in the array returned by the method executeBatch may be one of the following:
- A number greater than or equal to zero -- indicates that the command was processed successfully and is an update count giving the number of rows in the database that were affected by the command's execution
- A value of SUCCESS_NO_INFO -- indicates that the command was processed successfully but that the number of rows affected is unknown
- If one of the commands in a batch update fails to execute properly, this method throws a BatchUpdateException, and a JDBC driver may or may not continue to process the remaining commands in the batch. However, the driver's behavior must be consistent with a particular DBMS, either always continuing to process commands or never continuing to process commands. If the driver continues processing after a failure, the array returned by the method BatchUpdateException.getUpdateCounts will contain as many elements as there are commands in the batch, and at least one of the elements will be the following:
- A value of EXECUTE_FAILED -- indicates that the command failed to execute successfully and occurs only if a driver continues to process commands after a command fails
- The possible implementations and return values have been modified in the Java 2 SDK, Standard Edition, version 1.3 to accommodate the option of continuing to proccess commands in a batch update after a BatchUpdateException obejct has been thrown.
- Returns:
- an array of update counts containing one element for each command in the batch. The elements of the array are ordered according to the order in which commands were added to the batch.
- Throws:
- SQLException - if a database access error occurs, this method is called on a closed Statement or the driver does not support batch statements. Throws BatchUpdateException (a subclass of SQLException) if one of the commands sent to the database fails to execute properly or attempts to return a result set.
sql:
- -- Create table
- create table TB_PERSON
- (
- id NUMBER(20) not null,
- name VARCHAR2(45),
- english_name VARCHAR2(45),
- age NUMBER(3),
- sex VARCHAR2(45),
- birthday DATE,
- memo VARCHAR2(100),
- create_time DATE default sysdate
- );
- -- Add comments to the table
- comment on table TB_PERSON
- is '用户信息';
- -- Add comments to the columns
- comment on column TB_PERSON.id
- is 'id';
- comment on column TB_PERSON.name
- is '姓名';
- comment on column TB_PERSON.english_name
- is '英文名';
- comment on column TB_PERSON.age
- is '年龄';
- comment on column TB_PERSON.sex
- is '性别';
- comment on column TB_PERSON.birthday
- is '出生日期';
- comment on column TB_PERSON.memo
- is '备注';
- comment on column TB_PERSON.create_time
- is '修改时间';
- -- Create/Recreate primary, unique and foreign key constraints
- alter table TB_PERSON
- add primary key (ID)
- using index
- tablespace USERS
- pctfree 10
- initrans 2
- maxtrans 255;
- --drop sequence seq_tb_person_id
create sequence seq_tb_person_id- minvalue 1
- maxvalue 999999999
- increment by 1 start with 1;
- create or replace
- trigger trg_tb_person_id before insert on tb_person for each row
- begin
- select seq_tb_person_id.nextval into :new.id from dual;
- end;
http://www.cnblogs.com/xwdreamer/archive/2012/06/08/2542277.html
code:
- package sql.batch;
- import java.sql.BatchUpdateException;
- import java.sql.Connection;
- import java.sql.Date;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.SQLException;
- import java.sql.Statement;
- /*2015-7-17*/
- public class BatchProcessor {
- private String dirver;
- private String url;
- private String user;
- private String password;
- public BatchProcessor(String dirver, String url, String user, String password) {
- super();
- this.dirver = dirver;
- this.url = url;
- this.user = user;
- this.password = password;
- }
- public void batch() throws ClassNotFoundException {
- System.out.println("Statement.SUCCESS_NO_INFO:" + Statement.SUCCESS_NO_INFO);
- System.out.println("Statement.EXECUTE_FAILED:" + Statement.EXECUTE_FAILED);
- Class.forName(dirver);
- Connection conn = null;
- PreparedStatement preStmt = null;
- try {
- conn = DriverManager.getConnection(url, user, password);
- preStmt = conn.prepareStatement("truncate table tb_person");
- int truncateResult = preStmt.executeUpdate();
- System.out.println("Result:" + truncateResult);
- conn.setAutoCommit(false);
- String sql = "insert into tb_person(name,english_name,age,sex,birthday,memo) values(?,?,?,?,?,?)";
- preStmt = conn.prepareStatement(sql);
- for (int i = 0; i < 5; i++) {
- preStmt.setString(1, "Name" + i);
- preStmt.setString(2, "English_name" + i);
- if (i == 3) {
- preStmt.setString(3, "test");
- } else {
- preStmt.setInt(3, 25 + i);
- }
- // preStmt.setInt(3, 25 + i);
- preStmt.setString(4, (i / 2 == 0 ? "男" : "女"));
- preStmt.setDate(5, new Date(System.currentTimeMillis()));
- preStmt.setString(6, "memo" + i);
- preStmt.addBatch();
- }
- int[] result = preStmt.executeBatch();
- conn.commit();
- for (int i : result) {
- System.out.println("影响的行数" + i);
- }
- } catch (SQLException e) {
- try {
- // 如果出错,则此次executeBatch()的所有数据都不入库
- conn.rollback();
- } catch (SQLException e1) {
- e1.printStackTrace();
- }
- // 如果使用ojdbc6.jar,下列代码不需要,因为返回[]
- if (e instanceof BatchUpdateException) {
- BatchUpdateException bue = (BatchUpdateException) e;
- int[] updateCounts = bue.getUpdateCounts();
- System.out.println("getUpdateCounts():" + updateCounts.length);
- for (int updateCount : updateCounts) {
- System.out.println("影响的行数:" + updateCount);
- }
- }
- System.err.println("Error:" + e);
- } finally {
- if (preStmt != null) {
- try {
- preStmt.clearBatch();
- preStmt.clearParameters();
- preStmt.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- if (conn != null) {
- try {
- conn.setAutoCommit(true);
- conn.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
- package sql.batch;
- /*2015-7-17*/
- public class OracleBatchProcessor extends BatchProcessor {
- public OracleBatchProcessor() {
- // oracle.jdbc.driver.OracleDriver
- super("oracle.jdbc.OracleDriver",
- "jdbc:oracle:thin:@127.0.0.1:1521:instance1",
- "hr",
- "password");
- }
- }
- package sql.batch;
- /*2015-7-17*/
- public class Test {
- public static void main(String[] args) throws ClassNotFoundException {
- OracleBatchProcessor processor = new OracleBatchProcessor();
- processor.batch();
- }
- }
全部成功时的输出:
- Statement.SUCCESS_NO_INFO:-2
- Statement.EXECUTE_FAILED:-3
- Result:0
- 影响的行数-2
- 影响的行数-2
- 影响的行数-2
- 影响的行数-2
- 影响的行数-2
Tips:
mysql在使用InnoDB引擎时支持事务
http://www.cnblogs.com/zhangjun516/archive/2013/03/19/2968997.html
executeBatch()相关操作汇总的更多相关文章
- Object-C中动态类型对象相关操作汇总
Object-C(以后简称OC)中有id类型,相对于明确定义类型的静态类型,称为动态类型. 使用动态类型,配合多态(不同类型拥有同名方法),动态绑定(运行时决定实际调用的方法)可以将很多判断延迟到运行 ...
- Git相关操作汇总
git clone: 正如上图,当我们打开终端的情况下,默认我们所在的目录是在/home/shiyanlou的,大家可以在终端输入以下命令把目录切换到桌面cd /home/Desktop这个时候输入 ...
- aliyun TableStore相关操作汇总
总结:这个东西本身可能技术还不成熟,使用的人少,有问题很验证解决 遇到的问题:(1)没有一个GUI工具,使用门槛高(2)查询的GetRange不方便,把查询出来的数据使用System.out.prin ...
- Java 常用知识点汇总(数据类型之间转换、字符串的相关操作-截取、转换大小写等)
1.Java四类八种数据类型 byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围- ...
- [转帖]xserver相关知识汇总
xserver相关知识汇总 https://blog.csdn.net/QTVLC/article/details/81739984 本文主要是从以下几个方面介绍xorg-xserver 相关的知 ...
- Spark 1.x 爆内存相关问题汇总及解
Spark 1.x 爆内存相关问题汇总及解决 OOM # 包括GC Overhead limitjava.lang.OutOfMemoryError # on yarn org.apache.hado ...
- solidity的delete操作汇总
简介 Solidity中的特殊操作符delete用于释放空间,为鼓励主动对空间的回收,释放空间将会返还一些gas. delete操作符可以用于任何变量,将其设置成默认值0. 删除枚举类型时,会将其值重 ...
- 从零自学Hadoop(20):HBase数据模型相关操作上
阅读目录 序 介绍 命名空间 表 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 ...
- 从零自学Hadoop(21):HBase数据模型相关操作下
阅读目录 序 变量 数据模型操作 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 ...
随机推荐
- SWT的选择文件和文件夹的函数
org.eclipse.swt.widgets.DirectoryDialog//选择目录org.eclipse.swt.widgets.FileDialog//SWT.OPEN打开文件 SWT.SA ...
- Sesson禁止使用Cookie
于WebRoot文件夹MEAT-INF新建文件夹context.xml 增加<context path="XXX" cookies='false"> 更改To ...
- Windows phone 8 学习笔记(2) 数据文件操作
原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...
- java插入字符串
JAVA insert() 插入字符串insert() 插入字符串StringBuffer insert(int index,String str)StringBuffer insert(int in ...
- vim ctl+v批量添加/删除
vim编辑器---批量注释与反注释 在使用vim编写代码的时候,经常需要用到批量注释与反注释一段代码.下面简要介绍其操作. 方法一 块选择模式 插入注释: 用v进入virtual模式 用上下键选中需要 ...
- cocos2d-x 精灵的创建和基本使用
在cocos2d-x中.精灵能够说是一个最重要的组成元素,它代表游戏中一个最小的可见单位.同一时候也是CCNode一个最为灵活的子类,由于它能够通过装载一个平面纹理,从而具有丰富的表现力. 在进一步说 ...
- 用JavaScript实现网页动态水印
1.基本原理 页面加载后,通过javascript创建页面元素div,并在div元素中创建文本节点,展示水印内容 设置div元素样式,将其zIndex设置一个较高的值,并设置透明度,实现浮在页面的水印 ...
- hdu 4107当卡段树
其核心思想是记录最大的节点值和最低值,假设max<p要么min>=p时间,在节点只变化add值,不要子树遍历:否则,就往子树递归. #include<iostream> #in ...
- springMVC整合JAXB
一.背景 由于项目中要用到将Java对象转为xml返回给调用者.选择使用JAXB,由于它是JDK自带的.不须要引入其它Jar包 它提供了高速而简便的方法将xml和对象互转的方法. 二.重要Class和 ...
- 简说一下coffeescript的constructor是如何导致Backbone.View的事件无法正常工作的.
在继承方面,js还是弱项呀.发现在继承的时候constructor和initialize之分.网上文章没有说明二者关系.看了源码才发现二者的区别呀. 首先我用coffeescript来实现js的继承, ...