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-08-25 01:02:29

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

PreparedStatement批量处理和事务

[java] view plain copy PreparedStatement批量处理和事务代码如下: /* * PreparedStatement: 1.addBatch() 将一组参数添加到 PreparedStatement对象内部 2.executeBatch() 将一批参数提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组. * */ public class PreparedStatementCommitAndRollback { public static voi

Statement和PreparedStatement批量更新

优势:1.节省传递时间. 2.并发处理. PreparedStatement: 1) addBatch()将一组参数添加到PreparedStatement对象内部. 2) executeBatch()将一批参数提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组. Statement: 1) addBatch(String sql)方法会在批处理缓存中加入一条sql语句. 2) executeBatch()执行批处理缓存中的所有sql语句. 注意:PreparedStatemen

批量删除mysql一个库所有数据表方法

批量删除mysql一个库所有数据表方法 删除表的命令 drop table 表名; 如果有100张表,手工执行100次,想想就崩溃. 下面提供一个使用information_schema库的方案来批量删除数据表:SELECT CONCAT('drop table ',table_name,';') FROM information_schema.`TABLES` WHERE table_schema='数据库名'; 如通过这条命令来得到drop table 表名;这样的语句,然后批量执行.mys

mysql中把一个表的数据批量导入另一个表中(不同情况)

mysql中把一个表的数据批量导入另一个表中 不管是在网站开发还是在应用程序开发中,我们经常会碰到需要将MySQL某个表的数据批量导入到另一个表的情况,甚至有时还需要指定导入字段. 本文就将以MySQL数据库为例,介绍如何通过SQL命令行将某个表的所有数据或指定字段的数据,导入到目标表 中. 类别一. 如果两张张表(导出表和目标表)的字段一致,并且希望插入全部数据,可以用这种方法:(此方法只适合导出两表在同一database) INSERT INTO 目标表 SELECT * FROM 来源表;

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

本文为作者原创,转载请注明原作者及转载地址. 上一篇讲了如何用thinkPHP框架实现数据的添加,那这一篇就讲一下如何用thinkPHP实现数据的删除和批量删除吧. 预期效果图: 原谅博主对照片的处理是如此的草率吧... 仍然是 通过MVC模式进行拆分: 首先是视图部分: <form action="__MODULE__/Admin/User/del" method="get"> <tr> <th width="4%"

PreparedStatement批量(batch)插入数据

JDBC操作数据库的时候,需要一次性插入大量的数据的时候,如果每次只执行一条SQL语句,效率可能会比较低.这时可以使用batch操作,每次批量执行SQL语句,调高效率. public Boolean doCreateBatch(List<Emp> values) throws Exception { try { String sql = " INSERT INTO emp(empno,ename,job,hiredate,sal,comm) VALUES " + "

【转】linux批量更新文件内容+【原创】转义时的问题

程序开发中,可能你会经常遇到批量替换文件内容的情况,如果你使用的是linux,那么恭喜你,你可以使用一下三种办法进行查找替换. 方法一: find -name 'file.log' | xargs perl -pi -e 's|string1|string2|g' 这里使用了perl语言,使用-e加上一段代码,从而批量地将当前目录及所有子目录下的file.log文件中的string1替换成了string2 string支持正则表达式 方法二: sed -i "s/string1/string2/

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

前言            利用Mybatis批量更新或者批量插入,实际上即使Mybatis完美支持你的sql,你也得看看你操作的数据库是否完全支持,而同事,最近就遇到这样的一个坑! 问题 先带大家来看一段sql的配置: 1 <update id="updateAllAvailable"> 2 <foreach collection="skuOptionList" item="item" index="index&qu

记录一下C#+Oracle批量插入的一个方法

public bool insertOracle(DataTable dataTable, string sql) // Oracle sql 查询的是表头 { string ConnStr = WirelessCenterDAL.Common.GetConnDMS1; using (OracleConnection conn = new OracleConnection(ConnStr)) { try { OracleCommand cmd = new OracleCommand(sql, c