将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(); } } }
时间: 2024-10-29 15:05:29