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.OracleDriversuper("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(原创)相关推荐
- PreparedStatement批量执行sql
2019独角兽企业重金招聘Python工程师标准>>> 案例: 工具方法: public static Connection getConnection(){try {Class.f ...
- JDBC:PreparedStatement 插入BLOB类型的数据,PreparedStatement 批量处理,Connection 事务处理
JDBC:PreparedStatement 插入BLOB类型的数据,PreparedStatement 批量处理,Connection 事务处理 每博一文案 村上春树说: 你要做一个不动声色的大人了 ...
- 游客一键视频批量剪辑视频处理伪原创软件功能都有哪些?
游客一键视频批量剪辑视频处理伪原创软件功能都有哪些? 游客视频简介 一个有短视频创作灵感的工具 他· 小巧·智能·高效·便捷· 他拥有视频提取字幕系统 文本转语音系统 视频变速功能系统 转场特效系统 ...
- 《Oracle SQL疑难解析》——1.6 批量地从一个表中复制数据到另一个表
本节书摘来自异步社区出版社<Oracle SQL疑难解析>一书中的第1章,第1.6节,作者: [美]Grant Allen , Bob Bryla , Darl Kuhn,更多章节内容可以 ...
- 如何weak link一个framework (高版本兼容低版本)
苹果有一个例子MailComposer,说的是在高版本的OS中调用新增的功能,并且在低版本的OS中依然能够运行.其中重要的一点就是weak link MessageUI.framework. 如何we ...
- Excel怎么批量将最后一个字符设置为上标
今天跟大家分享一下Excel怎么批量将最后一个字符设置为上标 1.如下图我们想要批量将最后一个字符设置为上标. 2.首先我们选中数据单元格区域 3.然后点击下图选项(Excel工具箱,百度即可了解详细 ...
- 求一个文章原创检测工具源码 C#的 谢谢 私我
求一个文章原创检测工具源码 C#的 谢谢 私我@TOC 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页.如果你想学习如何使用Markdown编辑器, ...
- Python+Excel系列: 案例三:批量重命名一个工作薄中的所有工作表、批量重命名一个工作簿中的部分工作表
文章目录 批量重命名一个工作薄中的所有工作表 批量重命名一个工作簿中的部分工作表 批量重命名一个工作薄中的所有工作表 例:把table文件夹下一个工作簿中所有工作表名中的"销售"二 ...
- mysql allowmultiqueries=true_Mysql批量更新的一个坑-allowMultiQueries=true允许批量更新(转)...
实际上,我们经常会遇到这样的需求,那就是利用Mybatis批量更新或者批量插入,但是,实际上即使Mybatis完美支持你的sql,你也得看看你说操作的数据库是否支持,而阿福,最近就遇到这样的一个坑. ...
最新文章
- 使用async/await——Nodejs+ExpressJs+Babel
- gdb调试多进程和多线程命令 .
- C语言经典例13-水仙花数
- Linux下查看在运行进程的命令
- “2019大数据与实体经济深度融合全国行”盛大启动
- 通俗易懂设计模式解析——代理模式
- fastJson工具类
- Flash知识点总结
- apollo重要服务之metaService
- 数据分析实战100例(基于SQLPandas)_探索Chipotle快餐数据
- 电脑每次开机都出现check file system on:C 的解决办法
- 证明彼得森图不是平面图
- Android通过修改配置文件设置wifi密码
- calloc和realloc
- java代码餐馆管理系统_java版餐饮管理系统
- 身体这些部位不舒服的时候,你知道意味着什么吗?
- 南方科技大学招计算机博后,南方科技大学何祝兵课题组招聘博后 年薪30万
- 关于envi中加载高分二号影像出现时间错误提示的问题:“Day must contain numbers between 1 and 31”
- 程序员如何和人事谈薪资?| 面试技巧
- 511遇见易语言循环遍历删除数组中重复成员方法