PreparedStatement批量处理的一个Framework(原创)

场景:
批量进行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

时间: 2024-12-22 15:52:45

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

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

1.6 批量地从一个表中复制数据到另一个表 Oracle SQL疑难解析 1.6.1 要解决的问题 如何从一个表中一次性复制多行记录到另一个表. 1.6.2 解决方法 INSERT INTO... SELECT... 方法可以插入多行记录,关键是用SELECT语句选择多行记录时一定要用对选择条件.我们把以前的SELECT语句做一点修改,就可以选择多行记录了: 当然,前提是存在HR.CANDIDATES表,在做练习前,应确保你的HR.CANDIDATES表和例子中的表是一致的. 1.6.3 数据库

PHP操作excel的一个例子(原创)

excel|原创 这是对于那些只喜欢简单处理一下excel朋友来说的 <?php //定义一个excel文件$workbook = "C:/My Documents/test.xls"; $sheet = "Sheet1"; //生成一个com对象$ex$ex = new COM("Excel.sheet") or Die ("连不上!!!"); //打开一个excel文件$book = $ex->applicat

JDBC PreparedStatement 批量查询 in 的实现 方案

    我们经常会有这种业务需求,根据一个条件集合去查询一张表的数据,比如: select * from all_element t where t.task_id in (List <taskids>);     在java语言中,我们需要用到JDBC来和数据库打交道,那么在JDBC中该如何处理这种需求呢?我们可以有如下几种处理方式 方案一:写一个函数把参数集合转换成一个or 条件 或 in 条件的字符串,最后拼成一个sql select * from all_element t where

朱则荣:一个内容原创网站是如何火起来的

中介交易 SEO诊断 淘宝客 云主机 技术大厅 前两年,曾指导一位擅长Photoshop的朋友制作了自己的网站,现将有关实战案例介绍一下: 一.网站定位 这位朋友非常喜爱平面设计,尤其擅长Photoshop,他最初的打算是建立一个平面设计网站或Photoshop交流的专门网站,我告诉他,初次做站,这两个领域都不可行:有着太多类同的网站,大家都在追求大而全,你必须将定位锁定在一两个很小很专业的环节,这样你才有精力游刃有余. 因此,我建议在他建立网站时,先定位在"Photoshop教程"上

怎么快速把多个文件夹的照片批量导出到一个文件夹里?

  1.将多个文件夹放入同一个新建文件夹,如重命名为:多个文件夹,打开查看,内含多个文件夹,这里举例8个文件夹. 2.分别打开文件夹1.2,查看内含文件后缀名,这里全部是图片格式,格式为:看.jpg/jpeg. 3.这时点击多个文件夹中的"搜索"功能,在出现的搜索框中输入:jpg.点击搜索.右侧窗口立即出现图片. 4.待全部搜索完毕,直接Ctrl+A全选图片. 5.或者右击"复制". 6.最后,在桌面新建文件夹,打开后粘贴Ctrl+v.粘贴完毕.这样就将多个文件夹中

分享一个原创的eclipse插件:Easy Middle Button

问题描述 看到csdn这里的eclipse版也挺活跃,来分享一个我原创的eclipse插件吧.插件的名称是EasyMiddleButton,主要功能是用鼠标中键来调整编辑器或者视图的大小.当显示器不是很大,但开的视图又比较多时,用这个插件可以很方便地做调整,比直接用左键拖拽视图间的分隔条(Sash)要方便得多.具体大家可以参考我的博客里的介绍或者直接访问插件的主页:博客介绍:http://by-igotit.com/2010/11/eclipse-plugin-easy-middle-butto

Introducing to Spring Framework

Introducing to Spring Framework 作者:Rod Johnson 译者:yanger,taowen 校对:taowen 关于Spring Framework,今年夏天你可能已经听见很多的议论.在本文中,我将试图解释Spring能完成什么,和我怎么会认为它能帮助你开发J2EE应用程序. 又来一个framework? 你可能正在想"不过是另外一个的framework".当已经有许多开放源代码(和专有) J2EE framework时,为什么你还要耐下心子读这篇文

思创SEO:不要拿伪原创文章来糊弄搜索引擎

最近百度的更新日志也没规律了,而且更新后的变化差距很不稳定.如果下力度去改善自己网站的权重和内页信息的排名力度,我们这边首先要加大在原创方面的力度.因为现在百度的算法越来越精准,对待信息的质量也要求高了,检索的方法更加准确,针对那些转载重复的信息开始大面积的去重操作和信息删除,这就是为什么最近百度更新后,有的网站虽然收录增加的不少,但是流量急剧的下滑,百度一再的强调过,百度的收录显示结果总是,只是一个参照的大约数量,不是真实的统计数据,而且增加的新页面都是最新的信息发布,而这些最新的发布信息干刚

【原创】草根站长生存之道 百度推广全攻略

几乎每次百度算法更新,都是"几家欢喜几家愁",可以说草根站长真的是越来越难通过百度生存下去.而每次更新,百度都毫无例外地提升自身产品的权重.这对中小站长是沉重的打击,却也能成为我们成功的铺路石.今天笔者就给大家分享一下利用百度产品推广的攻略和心得. 还是先讲个小故事吧.一个杯子里有半杯水,悲观的人想:"唉,只有半杯水了."乐观的人则想:"太好了,还有半杯水呢."其实讲这个故事也是想提醒大家,凡事有弊必有利,百度提升自身产品权重,是强大的阻力,但也