这是一个代码质量比较高的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 ThreadLocalthread = 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 ThreadLocalthread = 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()); }}