zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ubuntu 修改默认root及密码
    两种方法解决tomcat的 Failed to initialize end point associated with ProtocolHandler ["http-apr-8080"]
    关于小米驱动程序的问题
    ubuntu下搭建lamp
    cocos2dx在ubuntu下配置声音引擎
    cocos2dx 帧动画的两种创建方式
    c++ 访问者模式(visitor pattern)
    c++ 职责链模式(Chain of Responsibility)
    c++ 状态模式(state)
    创建镜像推送至仓库
  • 原文地址:https://www.cnblogs.com/softidea/p/4703393.html
Copyright © 2011-2022 走看看