zoukankan      html  css  js  c++  java
  • 封装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);
            }
            
           
        }
    
    }
  • 相关阅读:
    html的转码玉反转码
    获取url据对路径写法
    CSS 外边距合并
    页面禁制选中元素的 背景变蓝的通用写法
    centos7.3上安装oracle11.2.4RAC
    通过ansible检查所有服务器根目录磁盘使用情况
    解决es集群启动完成后报master_not_discovered_exception(hostname有错误)
    tidb4.0执行大型sql报没有tmp目录错处理(ERROR 1105 (HY000): open /tmp/1000_tidb/MC4wLjAuMDo0MDAwLzAuMC4wLjA6MTAwODA)
    aix磁盘创建pv、lv
    aix6.1安装oracle
  • 原文地址:https://www.cnblogs.com/yshyee/p/4392377.html
Copyright © 2011-2022 走看看