这是一个代码质量比较高的Util。这里写了两种,一种是原始的,一种是使用C3P0的。数据库使用的是MySQL5.7。

使用框架开发的时候根本不需要写这些东西。其实框架也是这样封装的,但提供的功能会很丰富。这里展现的是思路,供参考。

DriverManager获取连接的Util:

package util;import java.io.IOException;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;public class DBUtil {		//连接URL	private static String jdbcUrl;					//登录用户,配置文件中key不要命名为username或者userName,可能会出现冲突情况	private static String userName;					//登录密码	private static String password;			//实例化本地线程对象	private static ThreadLocal
 thread = new ThreadLocal
(); static{ try { //获取配置文件中的jdbc数据库连接信息 Properties props = new Properties(); props.load(DBUtil.class.getResourceAsStream("/conf/dbinfo.properties")); String driverClass = props.getProperty("driverClass"); jdbcUrl = props.getProperty("jdbcUrl"); userName = props.getProperty("user"); password = props.getProperty("password"); //加载驱动 Class.forName(driverClass); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /**  * 获取数据库连接  * @return 数据库连接Connection对象  * @throws SQLException  */ public static Connection getConnection() throws SQLException{ if(thread.get() == null){ Connection conn = DriverManager.getConnection(jdbcUrl, userName, password); thread.set(conn); } return thread.get(); //不需要使用本地线程时,可以去掉上面代码// return DriverManager.getConnection(jdbcUrl, userName, password); } /**  * 关闭连接,释放资源  * @param conn Connection对象  * @param stmt Statement对象,可接收子类PreparedStatement对象  * @param rs ResultSet对象  */ public static void closeAll( Connection conn,Statement stmt,ResultSet rs){ if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } thread.remove(); //移除本地线程中的Connection对象 } public static void main(String[] args) throws SQLException { System.out.println(getConnection()); }}

使用C3P0连接池的Util:

package com.sourong.util;import java.beans.PropertyVetoException;import java.io.IOException;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;import com.mchange.v2.c3p0.ComboPooledDataSource;/** * c3p0连接池工具类 * */public class C3p0DBUtil {		//实例化c3p0连接池对象	private static ComboPooledDataSource c3p0 = new ComboPooledDataSource();	//实例化本地线程对象	private static ThreadLocal
 thread = new ThreadLocal
(); static{ //给c3p0配置参数 try { Properties props = new Properties(); props.load(C3p0DBUtil.class.getResourceAsStream("/dataSource.properties")); //设定数据库连接驱动类 c3p0.setDriverClass(props.getProperty("driverClass")); //设定jdbc连接URL c3p0.setJdbcUrl(props.getProperty("jdbcUrl")); //设定连接登录用户名 c3p0.setUser(props.getProperty("user")); //设定连接登录密码 c3p0.setPassword(props.getProperty("password")); //设定当连接池中的连接耗尽的时候c3p0一次同时获取的连接数 c3p0.setAcquireIncrement(Integer.valueOf(props.getProperty("acquireIncrement"))); //设定初始化时获取十个连接,取值应在minPoolSize与maxPoolSize之间 c3p0.setInitialPoolSize(Integer.valueOf(props.getProperty("initialPoolSize"))); //设定连接池中保留的最小连接数 c3p0.setMinPoolSize(Integer.valueOf(props.getProperty("minPoolSize"))); //设定连接池中保留的最大连接数 c3p0.setMaxPoolSize(Integer.valueOf(props.getProperty("maxPoolSize"))); } catch (PropertyVetoException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /**  * 通过C3p0连接池,获取数据库连接  * @return 数据库连接Connection对象  * @throws SQLException  */ public static Connection getConnection() throws SQLException{ if(thread.get() == null){ Connection conn = c3p0.getConnection(); thread.set(conn); } return thread.get(); } /**  * 关闭连接,释放资源  * @param conn Connection对象  * @param stmt Statement对象,可接收子类PreparedStatement对象  * @param rs ResultSet对象  */ public static void closeAll( Connection conn,Statement stmt,ResultSet rs){ if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null){ try { conn.close(); //将连接对象放入连接池中,并标记为空闲 } catch (SQLException e) { e.printStackTrace(); } } thread.remove(); //移除本地线程中的Connection对象 } public static void main(String[] args) throws SQLException { System.out.println(getConnection()); }}