场景:
批量进行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.OracleDriversuper("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. PreparedStatement批量执行sql

    2019独角兽企业重金招聘Python工程师标准>>> 案例: 工具方法: public static Connection getConnection(){try {Class.f ...

  2. JDBC:PreparedStatement 插入BLOB类型的数据,PreparedStatement 批量处理,Connection 事务处理

    JDBC:PreparedStatement 插入BLOB类型的数据,PreparedStatement 批量处理,Connection 事务处理 每博一文案 村上春树说: 你要做一个不动声色的大人了 ...

  3. 游客一键视频批量剪辑视频处理伪原创软件功能都有哪些?

    游客一键视频批量剪辑视频处理伪原创软件功能都有哪些? 游客视频简介 一个有短视频创作灵感的工具 他· 小巧·智能·高效·便捷· 他拥有视频提取字幕系统 文本转语音系统 视频变速功能系统 转场特效系统 ...

  4. 《Oracle SQL疑难解析》——1.6 批量地从一个表中复制数据到另一个表

    本节书摘来自异步社区出版社<Oracle SQL疑难解析>一书中的第1章,第1.6节,作者: [美]Grant Allen , Bob Bryla , Darl Kuhn,更多章节内容可以 ...

  5. 如何weak link一个framework (高版本兼容低版本)

    苹果有一个例子MailComposer,说的是在高版本的OS中调用新增的功能,并且在低版本的OS中依然能够运行.其中重要的一点就是weak link MessageUI.framework. 如何we ...

  6. Excel怎么批量将最后一个字符设置为上标

    今天跟大家分享一下Excel怎么批量将最后一个字符设置为上标 1.如下图我们想要批量将最后一个字符设置为上标. 2.首先我们选中数据单元格区域 3.然后点击下图选项(Excel工具箱,百度即可了解详细 ...

  7. 求一个文章原创检测工具源码 C#的 谢谢 私我

    求一个文章原创检测工具源码 C#的 谢谢 私我@TOC 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页.如果你想学习如何使用Markdown编辑器, ...

  8. Python+Excel系列: 案例三:批量重命名一个工作薄中的所有工作表、批量重命名一个工作簿中的部分工作表

    文章目录 批量重命名一个工作薄中的所有工作表 批量重命名一个工作簿中的部分工作表 批量重命名一个工作薄中的所有工作表 例:把table文件夹下一个工作簿中所有工作表名中的"销售"二 ...

  9. mysql allowmultiqueries=true_Mysql批量更新的一个坑-allowMultiQueries=true允许批量更新(转)...

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

最新文章

  1. 使用async/await——Nodejs+ExpressJs+Babel
  2. gdb调试多进程和多线程命令 .
  3. C语言经典例13-水仙花数
  4. Linux下查看在运行进程的命令
  5. “2019大数据与实体经济深度融合全国行”盛大启动
  6. 通俗易懂设计模式解析——代理模式
  7. fastJson工具类
  8. Flash知识点总结
  9. apollo重要服务之metaService
  10. 数据分析实战100例(基于SQLPandas)_探索Chipotle快餐数据
  11. 电脑每次开机都出现check file system on:C 的解决办法
  12. 证明彼得森图不是平面图
  13. Android通过修改配置文件设置wifi密码
  14. calloc和realloc
  15. java代码餐馆管理系统_java版餐饮管理系统
  16. 身体这些部位不舒服的时候,你知道意味着什么吗?
  17. 南方科技大学招计算机博后,南方科技大学何祝兵课题组招聘博后 年薪30万
  18. 关于envi中加载高分二号影像出现时间错误提示的问题:“Day must contain numbers between 1 and 31”
  19. 程序员如何和人事谈薪资?| 面试技巧
  20. 511遇见易语言循环遍历删除数组中重复成员方法

热门文章

  1. 10 款基于 jQuery 的切换效果插件推荐
  2. .net获取客户端信息(二)ashx部分
  3. 自制Ghost XP SP3 启动光盘(二)
  4. jQuery到底有什么好?
  5. 高端服务器CPU详细图解
  6. 百题大冲关系列课程更新啦!这次是 Golang
  7. 折腾 | pytoch、cuda版本问题
  8. java finereport_java报表FineReport_JS整理
  9. DelayExchange原理
  10. Nacos配置管理-nacos集群搭建