场景:
批量进行DML操作,但涉及的表不同,不能使用executeBatch()

需求:
(1)如果DML中有一个错误时,要全部回滚;
(2)如果全部正确,要全部执行;

解决方案:

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry; public class DuplicateStatmentProcessor {
private String dirver;
private String url;
private String user;
private String password; public DuplicateStatmentProcessor(String dirver, String url, String user, String password) {
super();
this.dirver = dirver;
this.url = url;
this.user = user;
this.password = password;
} public void process(Map<String, List<String>> sqlWithParams) throws ClassNotFoundException, SQLException {
Class.forName(dirver);
Connection conn = null;
PreparedStatement psmt = null;
try {
conn = DriverManager.getConnection(url, user, password);
conn.setAutoCommit(false); Iterator<Entry<String, List<String>>> iterator = sqlWithParams.entrySet().iterator();
while (iterator.hasNext()) {
Entry<String, List<String>> entry = iterator.next();
psmt = conn.prepareStatement(entry.getKey());
int parameterIndex = 1;
for (String parameter : entry.getValue()) {
psmt.setString(parameterIndex, parameter);
parameterIndex++;
}
psmt.executeUpdate();
}
conn.commit();
} catch (SQLException e) {
// 如果出错,则此次executeBatch()的所有数据都不入库
conn.rollback();
e.printStackTrace();
} finally {
conn.setAutoCommit(true);
close(conn, psmt);
} } private void close(Connection conn, PreparedStatement preStmt) {
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 jdbc.oracle.demo1;

import jdbc.DuplicateStatmentProcessor;

public class OracleProcessor extends DuplicateStatmentProcessor {

    public OracleProcessor() {
// oracle.jdbc.driver.OracleDriver
super("oracle.jdbc.OracleDriver",
"jdbc:oracle:thin:@127.0.0.1:1521:instance1",
"user",
"password");
} }
package jdbc.oracle.demo1;

import java.sql.SQLException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import jdbc.DuplicateStatmentProcessor; /*2015-8-4*/
public class Processor {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String DEL_TB_PERSON_SQL = "delete from TB_PERSON where id=?";
String DEL_TB_COURSE_SQL = "delete from tb_course where id=?"; Map<String, List<String>> sqlWithParams = new HashMap<String, List<String>>();
sqlWithParams.put(DEL_TB_PERSON_SQL, Arrays.asList("1"));
sqlWithParams.put(DEL_TB_COURSE_SQL, Arrays.asList("3")); DuplicateStatmentProcessor processor = new OracleProcessor();
processor.process(sqlWithParams);
} }

结果:
测试通过

Tips:
关于executeBatch参见http://www.cnblogs.com/softidea/p/4663090.html

PreparedStatement批量处理的一个Framework(原创)的更多相关文章

  1. 详解:基于WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器功能

    文件同步传输工具比较多,传输的方式也比较多,比如:FTP.共享.HTTP等,我这里要讲的就是基于HTTP协议的WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器这样的一个工具(简称:一 ...

  2. Statement和PreparedStatement批量更新

    优势:1.节省传递时间. 2.并发处理. PreparedStatement: 1) addBatch()将一组参数添加到PreparedStatement对象内部. 2) executeBatch( ...

  3. mysql中把一个表的数据批量导入另一个表中

    mysql中把一个表的数据批量导入另一个表中   不管是在网站开发还是在应用程序开发中,我们经常会碰到需要将MySQL或MS SQLServer某个表的数据批量导入到另一个表的情况,甚至有时还需要指定 ...

  4. PreparedStatement批量处理和事务

    PreparedStatement批量处理和事务代码如下: /* * PreparedStatement: 1.addBatch() 将一组参数添加到 PreparedStatement对象内部 2. ...

  5. 使用thinkPHP框架实现删除和批量删除一例【原创】

    本文为作者原创,转载请注明原作者及转载地址. 上一篇讲了如何用thinkPHP框架实现数据的添加,那这一篇就讲一下如何用thinkPHP实现数据的删除和批量删除吧. 预期效果图: 原谅博主对照片的处理 ...

  6. Mysql批量更新的一个坑-&allowMultiQueries=true允许批量更新(转)

    实际上,我们经常会遇到这样的需求,那就是利用Mybatis批量更新或者批量插入,但是,实际上即使Mybatis完美支持你的sql,你也得看看你说操作的数据库是否支持,而阿福,最近就遇到这样的一个坑. ...

  7. PreparedStatement批量(batch)插入数据

    JDBC操作数据库的时候,需要一次性插入大量的数据的时候,如果每次只执行一条SQL语句,效率可能会比较低.这时可以使用batch操作,每次批量执行SQL语句,调高效率. public Boolean ...

  8. guava缓存批量获取的一个坑

    摘要 Guava Cache是Google开源的Java工具集库Guava里的一款缓存工具,一直觉得使用起来比较简单,没想到这次居然还踩了一个坑 背景 功能需求抽象出来很简单,就是将数据库的查询sth ...

  9. Mysql批量更新的一个坑-&allowMultiQueries=true允许批量更新

    前言        实际上,我们经常会遇到这样的需求,那就是利用Mybatis批量更新或者批量插入,但是,实际上即使Mybatis完美支持你的sql,你也得看看你说操作的数据库是否支持,而阿福,最近就 ...

随机推荐

  1. Android 一些错误

    android fragment里面放viewpager 嵌套fragment 报错: 解决:在adapter的构造方法里加上 super(fragment.getChildFragmentManag ...

  2. Java EE (10) - 资源服务器的整合

    加密(Encryption)和数字签名(Digital Signature)通常被用于保护通讯--加密用来防止数据传输过程中的窃听--数字签名用来防止数据传输过程中的篡改 JDBC: 整合关系型数据库 ...

  3. HDU 4998 Rotate

    题意: n次旋转  每次平面绕ai点旋转pi弧度  问  最后状态相当于初始状态绕A点旋转P弧度  A和P是多少 思路: 如果初始X点的最后状态为X'点  则圆心一定在X和X'连线的垂直平分线上  那 ...

  4. Android涉及到的设计模式(转)

    1.适配器模式:ListView或GridView的Adapter 简介:不同的数据提供者使用一个适配器来向一个相同的客户提供服务. 2.建造者模式:AlertDialog.Builder 简介:可以 ...

  5. 使用Socket沟通

    当两台电脑TCP/IP协议进行通讯.平时Socket对象来表示该通信接口的两端,并通过Socket生产I/O流进行网络通信. 其中ServerSocket对象可以接收从连接的其他通信实体的请求.这个目 ...

  6. hdu3501

    要我们求小于n并且不与n互素的数字的和, 那么可以转化为1->(n-1)的和减去小于n且与n互素的数字的和 首先,有gcd(n,i)=1, 那么gcd(n,n-i)=1, 这是因为如果a%s=0 ...

  7. SQL Server中的查询

          本博文简介一下SQL Server中经常使用的几类查询及相关使用的方法.       一.ExecuteScalar方法获取单一值       ExecuteScalar方法是SqlCom ...

  8. HOJ2275 Number sequence

    Number sequence My Tags tag=&type=or" style="margin:0px; padding:0px; color:rgb(27,87, ...

  9. 瑞丽的SQL-SQL Server的表旋转(行列转换)

    所谓表旋转,就是将表的行转换为列,或是将表的列转换为行,这是从SQL Server 2005開始提供的新技术.因此,如果希望使用此功能,须要将数据库的兼容级别设置为90.表旋转在某些方面也是攻克了表的 ...

  10. gcc #define 学习记录

    //test.c #include <stdio.h> #include <stdlib.h> //字符串化运算符 #define EXPAND(name) ({ \ prin ...