Oracle数据库端测试环境见:http://www.cnblogs.com/yshyee/p/4392328.html

package com.mw.utils;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger; /**
* @author y
* @date 2015-4-4 13:33:02
* @version V1.0
* @desc Connection 事务管理
* 使用方式:
* (1)首先从TransactionManager获取Connection
* (2)开启事务
* ()进行业务处理
* (3)提交事务
* (4)异常回滚事务
* (5)关闭链接
*/
public final class TransactionManager { /**
* 定义局部线程变量,用于保存Connection
*/
private static final ThreadLocal<Connection> connThreadLocal = new ThreadLocal<Connection>(); private TransactionManager(){} /**
* 采用内部类实现单例
*/
private static class TransactionManagerHolder{
private static final TransactionManager instance = new TransactionManager();
} public static TransactionManager getInstance(){
return TransactionManagerHolder.instance;
} /**
* 1:从当前线程局部变量中获取数据库连接资源
* @return
*/
public Connection get(){
Connection conn = connThreadLocal.get(); if(null==conn){
conn = JdbcUtil.getConnection();
connThreadLocal.set(conn);
} return conn;
} /**
* 2:开启事务
* @param conn
*/
public void beginTransaction(Connection conn){
try {
if(null!=conn){
if(conn.getAutoCommit()){
conn.setAutoCommit(false);
}
}
}catch (SQLException ex) {
Logger.getLogger(TransactionManager.class.getName()).log(Level.SEVERE, null, ex);
} } /**
* 3:提交事务
* @param conn
*/
public void commitTransaction(Connection conn){
try {
if(null!=conn){
if(!conn.getAutoCommit()){
conn.commit();
}
}
}catch (SQLException ex) {
Logger.getLogger(TransactionManager.class.getName()).log(Level.SEVERE, null, ex);
}
} /**
* 4:回滚事务
* @param conn
*/
public void rollbackTransaction(Connection conn){
try {
if(null!=conn){
if(!conn.getAutoCommit()){
conn.rollback();
}
}
}catch (SQLException ex) {
Logger.getLogger(TransactionManager.class.getName()).log(Level.SEVERE, null, ex);
}
} /**
* 5:关闭链接,将数据库连接从当前线程局部变量中移除
* @param conn
*/
public void close(Connection conn){
JdbcUtil.release(conn); connThreadLocal.remove();
} }

测试:

package com.mw.test;

import com.mw.utils.TransactionManager;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler; /**
* @author y
* @date 2015-4-4 12:34:05
* @version 1.0
* @desc
*/
public class Test { public static void main(String[] args) {
QueryRunner qr = new QueryRunner(); Connection conn = TransactionManager.getInstance().get(); TransactionManager.getInstance().beginTransaction(conn); int age = 10; try {
CallableStatement cs = conn.prepareCall("{call pack_user.p_user_select(?,?)}");
cs.setInt(1, age);
cs.registerOutParameter(2, Types.VARCHAR); cs.execute(); String succ = cs.getString(2); if("T".equalsIgnoreCase(succ)){
String sql = "select * from tmp_yshy"; List<Map<String, Object>> list = qr.query(conn, sql, new MapListHandler()); for(Map map:list){
System.out.println("c1:"+map.get("c1")+",c2:"+map.get("c2"));
}
}else{
System.out.println("succ:"+succ);
} TransactionManager.getInstance().commitTransaction(conn);
} catch (SQLException ex) {
TransactionManager.getInstance().rollbackTransaction(conn);
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
} finally{
TransactionManager.getInstance().close(conn);
} } }

封装JDBC事务操作,执行存储过程测试的更多相关文章

  1. spring jdbc查询 依赖JdbcTemplate这个类模版封装JDBC的操作

    package cn.itcast.spring.jdbc; import java.util.List; import org.springframework.jdbc.core.support.J ...

  2. 网络协议 finally{ return问题 注入问题 jdbc注册驱动问题 PreparedStatement 连接池目的 1.2.1DBCP连接池 C3P0连接池 MYSQL两种方式进行实物管理 JDBC事务 DBUtils事务 ThreadLocal 事务特性 并发访问 隔离级别

    1.1.1 API详解:注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 原因有2个: >导致驱动被注册2 ...

  3. Mysql事务与JDBC事务管理

    一.事务概述 1.什么是事务 一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败 就是将n个组成单元放到一个事务中 2.mysql的事务 默认的事务:一条sql语句就是一个事务 ...

  4. Jdbc执行存储过程报数据库事务无法执行的异常

    Jdbc执行存储过程报数据库事务无法执行的异常 环境: Eclipse+Jdk1.7+spring-jdbc-3.0.7+同版本的jdbctemplate+Sqlserver 2012 问题: 一个小 ...

  5. jdbc中的Statement对象和Preparedstatement对象的区别,以及通过jdbc操作调用存储过程

    一. java.sql.*   和  javax.sql.*的包的类结构 |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口. |- connect(url, p ...

  6. MySQL(存储过程,支持事务操作)

    day61 保存在MySQL上的一个别名   >   一坨SQL语句 -- delimiter // -- create procedure p1() -- BEGIN -- select * ...

  7. 一、JDBC的概述 二、通过JDBC实现对数据的CRUD操作 三、封装JDBC访问数据的工具类 四、通过JDBC实现登陆和注册 五、防止SQL注入

    一.JDBC的概述###<1>概念 JDBC:java database connection ,java数据库连接技术 是java内部提供的一套操作数据库的接口(面向接口编程),实现对数 ...

  8. 使用JDBC进行数据库的事务操作(2)

    本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...

  9. 使用JDBC进行数据库的事务操作(1)

    本篇讲述数据库中非常重要的事务概念和如何使用MySQL命令行窗口来进行数据库的事务操作.下一篇会讲述如何使用JDBC进行数据库的事务操作. 事务是指数据库中的一组逻辑操作,这个操作的特点就是在该组逻辑 ...

随机推荐

  1. BZOJ3314: [Usaco2013 Nov]Crowded Cows

    3314: [Usaco2013 Nov]Crowded Cows Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 86  Solved: 61[Subm ...

  2. iOS开发手记 - iOS9.3 Xcode7打包ipa文件在其他越狱机器上运行的方法和一些问题

    现在Xcode7可以用一个appleid就可以往手机上部署测试app,不再需要$99,这也是方便.但是要把app发给别人的手机上运行还是不行,除非别人的手机在你身边可以直接通过Xcode安装 关于怎么 ...

  3. HDU4742----Pinball Game 3D(三维LIS、CDQ分治)

    题意:三维空间内 n个小球,对应坐标(x,y,z).输出LIS的长度以及方案数. 首先可以先按x排序,先降低一维,然后 剩下y .z,在y上进行CDQ分治,按y的大小用前面的更新后面的.z方向离散化之 ...

  4. SRM 585 DIV1

    A 树形dp是看起来比较靠谱的做法 , 但是转移的时候不全面就会出错 , 从贪心的角度出发 , 首先让第一量车走最长路, 然后就会发现递归结构 , 得到递归式 f[i] = ( f[i-2] + f[ ...

  5. [Python]round四舍五入精度缺失的解决

    环境: os: win7 64bit python:2.7.5  32bit 对python四舍五入的解决方案 现象: 一般的四舍五入操作都是使用内置的round方法   In [14]: round ...

  6. Day01_UNIX基础及VI简介

    2013年09月29日 星期日 11时35分58秒 Linux 是一个区别于Windows的操作系统 Linux 是一个多用户的操作系统 Linux 系统通过账号区分不同的用户 在使用Linux系统的 ...

  7. Android Clipboard(复制/剪贴板)

    Android提供的剪贴板框架,复制和粘贴不同类型的数据.数据可以是文本,图像,二进制流数据或其它复杂的数据类型. Android提供ClipboardManager.ClipData.Item和Cl ...

  8. 飞行模式下不让打开FM

     android 判断手机当前是否是飞行模式,在AirplaneModeEnabler中 提供了isAirplaneModeOn方法来判断当前是否是Airplane mode:public stati ...

  9. [React] React Router: Route Parameters

    A router library is no good if we have to hardcode every single route in our application. In this le ...

  10. FIR滤波器设计

    FIR滤波器的优越性: 相位对应为严格的线性,不存在延迟失真,仅仅有固定的时间延迟: 因为不存在稳定性问题,设计相对简单: 仅仅包括实数算法,不涉及复数算法,不须要递推运算,长度为M,阶数为M-1,计 ...