博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PreparedStatement批量处理的一个Framework(原创)
阅读量:6438 次
发布时间:2019-06-23

本文共 3578 字,大约阅读时间需要 11 分钟。

场景:

批量进行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
> sqlWithParams) throws ClassNotFoundException, SQLException { Class.forName(dirver); Connection conn = null; PreparedStatement psmt = null; try { conn = DriverManager.getConnection(url, user, password); conn.setAutoCommit(false); Iterator
>> iterator = sqlWithParams.entrySet().iterator(); while (iterator.hasNext()) { Entry
> 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
> sqlWithParams = new HashMap
>(); 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

你可能感兴趣的文章
Android应用坐标系统全面详解
查看>>
搞定JVM垃圾回收就是这么简单
查看>>
js算法初窥03(搜索及去重算法)
查看>>
PHP垃圾回收机制
查看>>
自动驾驶不安全怎么办?阿里巴巴:不仅搞车,我们还要升级马路!
查看>>
微信程序开发系列教程(一)开发环境搭建
查看>>
爱要怎么说出口
查看>>
SpringBoot-03:SpringBoot+Idea热部署
查看>>
Apache 年度报告:Java 是项目开发使用最多的语言
查看>>
无聊时你会擦玻璃吗?《Pane In The Glass》下周一登陆Vive
查看>>
PWA系列 - Cache API 的设计与实现
查看>>
Fastify 2.2.0 和 1.14.5 发布,极速 Node.js Web 框架
查看>>
HTTP相关整理(上)
查看>>
浙江环宇集团“营改增”项目启动会成功举办
查看>>
EM 算法求解高斯混合模型python实现
查看>>
一次性比较目前前端最流行的状态管理,mobx,vuex,redux-saga使用方式用方式
查看>>
2018.4.24-ml笔记(多元线性回归)
查看>>
特斯拉进化论:舍命狂奔背后的生存哲学
查看>>
除了叫好也应关注GDPR对数字产业的负效应 | 热评
查看>>
Vue.js 子组件的异步加载及其生命周期控制-------异步加载子组件,子组件的生命周期控制过程不一样...
查看>>