zoukankan      html  css  js  c++  java
  • java-结合c3p0封装的db 事务 类

    将Connection对象,绑定到当前线程中去,这样在每一个方法中都能使用这个链接。

    DataSourceUtils.java

    package com.itheima.utils;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import javax.sql.DataSource;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class DataSourceUtils {
    	private static ComboPooledDataSource ds=new ComboPooledDataSource();
    	private static ThreadLocal<Connection> tl=new ThreadLocal<>();
    	
    	/**
    	 * 获取数据源
    	 * @return 连接池
    	 */
    	public static DataSource getDataSource(){
    		return ds;
    	}
    	
    	/**
    	 * 从当前线程上获取连接
    	 * @return 连接
    	 * @throws SQLException
    	 */
    	public static Connection getConnection() throws SQLException{
    		Connection conn = tl.get();
    		if(conn==null){
    			//第一次获取 创建一个连接 和当前的线程绑定
    			 conn=ds.getConnection();
    			 
    			 //绑定
    			 tl.set(conn);
    		}
    		return conn;
    	}
    	
    	
    	
    	/**
    	 * 释放资源
    	 * 
    	 * @param conn
    	 *            连接
    	 * @param st
    	 *            语句执行者
    	 * @param rs
    	 *            结果集
    	 */
    	public static void closeResource(Connection conn, Statement st, ResultSet rs) {
    		closeResource(st, rs);
    		closeConn(conn);
    	}
    	
    	 
    	public static void closeResource(Statement st, ResultSet rs) {
    			closeResultSet(rs);
    			closeStatement(st);
    	}
    
    	/**
    	 * 释放连接
    	 * 
    	 * @param conn
    	 *            连接
    	 */
    	public static void closeConn(Connection conn) {
    		if (conn != null) {
    			try {
    				conn.close();
    				//和当前的线程解绑
    				tl.remove();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			conn = null;
    		}
    
    	}
    
    	/**
    	 * 释放语句执行者
    	 * 
    	 * @param st
    	 *            语句执行者
    	 */
    	public static void closeStatement(Statement st) {
    		if (st != null) {
    			try {
    				st.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			st = null;
    		}
    
    	}
    
    	/**
    	 * 释放结果集
    	 * 
    	 * @param rs
    	 *            结果集
    	 */
    	public static void closeResultSet(ResultSet rs) {
    		if (rs != null) {
    			try {
    				rs.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			rs = null;
    		}
    
    	}
    	
    	/**
    	 * 开启事务
    	 * @throws SQLException
    	 */
    	public static void startTransaction() throws SQLException{
    		//获取连接//开启事务
    		getConnection().setAutoCommit(false);
    	}
    	
    	/**
    	 * 事务提交
    	 */
    	public static void commitAndClose(){
    		try {
    			//获取连接
    			Connection conn = getConnection();
    			//提交事务
    			conn.commit();
    			//释放资源
    			conn.close();
    			//解除绑定
    			tl.remove();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	/**
    	 * 事务回滚
    	 */
    	public static void rollbackAndClose(){
    		try {
    			//获取连接
    			Connection conn = getConnection();
    			//事务回滚
    			conn.rollback();
    			//释放资源
    			conn.close();
    			//解除绑定
    			tl.remove();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    }
    
  • 相关阅读:
    git add后 有的文件后悔 add了还没有commit 怎么办?
    go mod module declares its path as: gtihub.com/xxx-xx but was required as:xx-xx
    mysql 复合索引(联合索引) a b c的使用
    git 的初始化使用
    Mac 安装 mysql5.7
    Go Modules与GOPROXY 配置
    ZWWL的短信详设
    Linux 查看文件权限命令ls -l 输出信息每列所代表的含义
    ubuntu/deepin 下增加 goland 桌面快捷方式 goland.desktop
    go语言的冒泡 选择 快排 二分 算法实现
  • 原文地址:https://www.cnblogs.com/hfultrastrong/p/7324830.html
Copyright © 2011-2022 走看看