封装JDBC事务操作,执行存储过程测试

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)