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

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

解决方案:

  1. package jdbc;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.PreparedStatement;
  6. import java.sql.SQLException;
  7. import java.util.Iterator;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.Map.Entry;
  11.  
  12. public class DuplicateStatmentProcessor {
  13. private String dirver;
  14. private String url;
  15. private String user;
  16. private String password;
  17.  
  18. public DuplicateStatmentProcessor(String dirver, String url, String user, String password) {
  19. super();
  20. this.dirver = dirver;
  21. this.url = url;
  22. this.user = user;
  23. this.password = password;
  24. }
  25.  
  26. public void process(Map<String, List<String>> sqlWithParams) throws ClassNotFoundException, SQLException {
  27. Class.forName(dirver);
  28. Connection conn = null;
  29. PreparedStatement psmt = null;
  30. try {
  31. conn = DriverManager.getConnection(url, user, password);
  32. conn.setAutoCommit(false);
  33.  
  34. Iterator<Entry<String, List<String>>> iterator = sqlWithParams.entrySet().iterator();
  35. while (iterator.hasNext()) {
  36. Entry<String, List<String>> entry = iterator.next();
  37. psmt = conn.prepareStatement(entry.getKey());
  38. int parameterIndex = 1;
  39. for (String parameter : entry.getValue()) {
  40. psmt.setString(parameterIndex, parameter);
  41. parameterIndex++;
  42. }
  43. psmt.executeUpdate();
  44. }
  45. conn.commit();
  46. } catch (SQLException e) {
  47. // 如果出错,则此次executeBatch()的所有数据都不入库
  48. conn.rollback();
  49. e.printStackTrace();
  50. } finally {
  51. conn.setAutoCommit(true);
  52. close(conn, psmt);
  53. }
  54.  
  55. }
  56.  
  57. private void close(Connection conn, PreparedStatement preStmt) {
  58. if (preStmt != null) {
  59. try {
  60. preStmt.clearBatch();
  61. preStmt.clearParameters();
  62. preStmt.close();
  63. } catch (SQLException e) {
  64. e.printStackTrace();
  65. }
  66. }
  67.  
  68. if (conn != null) {
  69. try {
  70. conn.setAutoCommit(true);
  71. conn.close();
  72. } catch (SQLException e) {
  73. e.printStackTrace();
  74. }
  75. }
  76. }
  77.  
  78. }
  1. package jdbc.oracle.demo1;
  2.  
  3. import jdbc.DuplicateStatmentProcessor;
  4.  
  5. public class OracleProcessor extends DuplicateStatmentProcessor {
  6.  
  7. public OracleProcessor() {
  8. // oracle.jdbc.driver.OracleDriver
  9. super("oracle.jdbc.OracleDriver",
  10. "jdbc:oracle:thin:@127.0.0.1:1521:instance1",
  11. "user",
  12. "password");
  13. }
  14.  
  15. }
  1. package jdbc.oracle.demo1;
  2.  
  3. import java.sql.SQLException;
  4. import java.util.Arrays;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8.  
  9. import jdbc.DuplicateStatmentProcessor;
  10.  
  11. /*2015-8-4*/
  12. public class Processor {
  13. public static void main(String[] args) throws ClassNotFoundException, SQLException {
  14. String DEL_TB_PERSON_SQL = "delete from TB_PERSON where id=?";
  15. String DEL_TB_COURSE_SQL = "delete from tb_course where id=?";
  16.  
  17. Map<String, List<String>> sqlWithParams = new HashMap<String, List<String>>();
  18. sqlWithParams.put(DEL_TB_PERSON_SQL, Arrays.asList("1"));
  19. sqlWithParams.put(DEL_TB_COURSE_SQL, Arrays.asList("3"));
  20.  
  21. DuplicateStatmentProcessor processor = new OracleProcessor();
  22. processor.process(sqlWithParams);
  23. }
  24.  
  25. }

结果:
测试通过

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. SCSI miniport 驾驶一个简单的框架

    前段时间,只需用一台新电脑,由于资金有限没有匹配了心仪已久的SSD.我没感觉到飞翔的感觉,总不甘心,仔细想想.我死了相当大的存储,我们可以假设部分内存作为硬盘驱动器把它弄出来.不会比固态硬盘的速度快, ...

  2. hdu5618 (三维偏序,cdq分治)

    给定空间中的n个点,问每个点有多少个点小于等于自己. 先来分析简单的二维的情况,那么只要将x坐标排序,那么这样的问题就可以划分为两个子问题,,这样的分治有一个特点,即前一个子问题的解决是独立的,而后一 ...

  3. Windows phone 8 学习笔记(5) 图块与通知

    原文:Windows phone 8 学习笔记(5) 图块与通知 基于metro风格的Windows phone 8 应用提到了图块的概念,它就是指启动菜单中的快速启动图标.一般一个应用必须有一个默认 ...

  4. String,StringBuffer以及StringBuilder的差别

    1.定义: String:String 类代表字符串. Java 程序中的全部字符串字面值(如"abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改. 字符 ...

  5. 【足迹C++primer】52、,转换和继承虚函数

    转换和继承,虚函数 Understanding conversions between base and derived classes is essential to understanding h ...

  6. Android中TextView中内容不换行的解决方法

    问题 如果新建的Android项目采用的Android 3.0以上的SDK,同时采用了 <style name="AppTheme" parent="@androi ...

  7. 百度经纬度和google经纬度互转

    原文:百度经纬度和google经纬度互转 百度地图的坐标转换,由于百度地图在GCJ02协议的基础上又做了一次处理,变为 BD09协议的坐标,以下是坐标的转化方式,可以方便和其他平台转化 private ...

  8. windows phone 页面传值(7)

    原文:windows phone 页面传值(7) 在windows phone 中微软为我们提供了页面间传递参数的解决方案,下面就为大家介绍使用方法,页面传值的案例中我们建立两个页面,一个是MainP ...

  9. oracle转Mysql中,varchar2(10)和number应该转换为什么类型? (转)

    一. varchar2(10)和number应该转换为什么类型? oracle转成mysql时:varchar2(10)可以转成varchar(10)number则要看oracle中存储的具体是什么类 ...

  10. D3js-堆栈图

    效果图: 源码: <%@ page language="java" import="java.util.*" pageEncoding="UTF ...