package com.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * 数据库工具类 * * @author zhaoj * */ public class DBUtil { private static ThreadLocal<Connection> local = new ThreadLocal<>(); static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 获得数据库连接对象 * * @return */ public static Connection getConn() { // 根据当前线程对象,从容器中获取数据库连接 Connection conn = local.get(); if (conn == null) { // 如果没有数据库连接,新创建一个 try { conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mvc", "root", "root"); // 设置数据库手动提交 conn.setAutoCommit(false); } catch (SQLException e) { e.printStackTrace(); } } // 如果有的话直接返回,这样保证了同一个线程中Connection是相同的 return conn; } /** * 关闭资源 * * @param rs * @param pre * @param conn */ public static void close(ResultSet rs, PreparedStatement pre, Connection conn) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (pre != null) { pre.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null) { conn.close(); local.remove();// 当使用完,从容器中移出,否则容易造成内存溢出 } } catch (SQLException e) { e.printStackTrace(); } } }
如何使用:
AccountService service=(AccountService) new ServiceProxyUtil().newProxyObject(new AccountServiceImpl()); Integer result =service.transfer(fromAccount,toAccount,money);//调用代理对象的代理方法