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
PreparedStatement批量处理的一个Framework(原创)的更多相关文章
- 详解:基于WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器功能
文件同步传输工具比较多,传输的方式也比较多,比如:FTP.共享.HTTP等,我这里要讲的就是基于HTTP协议的WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器这样的一个工具(简称:一 ...
- Statement和PreparedStatement批量更新
优势:1.节省传递时间. 2.并发处理. PreparedStatement: 1) addBatch()将一组参数添加到PreparedStatement对象内部. 2) executeBatch( ...
- mysql中把一个表的数据批量导入另一个表中
mysql中把一个表的数据批量导入另一个表中 不管是在网站开发还是在应用程序开发中,我们经常会碰到需要将MySQL或MS SQLServer某个表的数据批量导入到另一个表的情况,甚至有时还需要指定 ...
- PreparedStatement批量处理和事务
PreparedStatement批量处理和事务代码如下: /* * PreparedStatement: 1.addBatch() 将一组参数添加到 PreparedStatement对象内部 2. ...
- 使用thinkPHP框架实现删除和批量删除一例【原创】
本文为作者原创,转载请注明原作者及转载地址. 上一篇讲了如何用thinkPHP框架实现数据的添加,那这一篇就讲一下如何用thinkPHP实现数据的删除和批量删除吧. 预期效果图: 原谅博主对照片的处理 ...
- Mysql批量更新的一个坑-&allowMultiQueries=true允许批量更新(转)
实际上,我们经常会遇到这样的需求,那就是利用Mybatis批量更新或者批量插入,但是,实际上即使Mybatis完美支持你的sql,你也得看看你说操作的数据库是否支持,而阿福,最近就遇到这样的一个坑. ...
- PreparedStatement批量(batch)插入数据
JDBC操作数据库的时候,需要一次性插入大量的数据的时候,如果每次只执行一条SQL语句,效率可能会比较低.这时可以使用batch操作,每次批量执行SQL语句,调高效率. public Boolean ...
- guava缓存批量获取的一个坑
摘要 Guava Cache是Google开源的Java工具集库Guava里的一款缓存工具,一直觉得使用起来比较简单,没想到这次居然还踩了一个坑 背景 功能需求抽象出来很简单,就是将数据库的查询sth ...
- Mysql批量更新的一个坑-&allowMultiQueries=true允许批量更新
前言 实际上,我们经常会遇到这样的需求,那就是利用Mybatis批量更新或者批量插入,但是,实际上即使Mybatis完美支持你的sql,你也得看看你说操作的数据库是否支持,而阿福,最近就 ...
随机推荐
- Maven插件之buildnumber-maven-plugin
某些情况下(这种情况一般很少见),使用maven构建项目时,需要一个不重复的序列号,比如说,打包时,包名称以当前构建时间结尾,或者每次生成的jar包中包含唯一的序列号,等等; 这个时候,就用到了bui ...
- zabbix 监控特定进程
因为一些server上跑着一些重要程序,须要对它们进行监控,公司用的是zabbix监控,之前都是在zabbix中加入自己定义脚本对特定程序进行监控,近期看了zabbix的官方文档,发现原来强大的zab ...
- 关于Hbase的cache配置
关于Hbase的cache配置 在hbase中的hfilecache中,0.96版本号中新添加了bucket cache, bucket cache通过把hbase.offheapcache.perc ...
- uvaLive5713 次小生成树
uvaLive5713 修建道路使得n个点任意两点之间都可以连通,每个点有都有一定的人口,现在可以免费修一条道路, A是免费修的道路两端结点的人口之和, B的其它不是免费修道路的长度的总和 要求的是A ...
- 国庆去学校的国际象棋(Latex)
国庆节去学棋与朋友. 看国外的网站更有趣的事情. 很快打下来. 首先效应: 嘿嘿 代码来了哟: \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc ...
- Windows Phone开发(3):棋子未动,先观全局
原文:Windows Phone开发(3):棋子未动,先观全局 在进行WP开发之前,与其它开发技术一样,我们需要简单了解一个WP应用序的生命周期,我们不一定要深入了解,但至少要知道在应用程序生命周期内 ...
- Iphone CodeSign error: no provisioning profile at path 错
今天在退房手续,变化了profile,当再次进行整理编译项目时.就出现了这个问题,在xCode 6 开发环境下出现了, 出现这个错误提示Code Sign error: Provisioning pr ...
- wpf做的3d滑动gallery
原文:wpf做的3d滑动gallery wpf做的3d滑动gallery 随着iphone\ipad的流行及热捧,现在做移动产品不管是什么平台的,领导总想做成像ios系统的样子.自从微软发布了wind ...
- Zookeeper分享
Zookeeper: 是一个分布式的,为分布式应用提供数据一致性服务的程序. Zookeeper是怎么来的? 分布式系统:是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信 ...
- DOM操作应用
创建元素 document.createElement("li"); 添加节点 oUl.appendChild(oLi); 在某个元素之前插入一个节点 oUl.insertBefo ...