1. 程式人生 > >自定義數據庫連接工具類

自定義數據庫連接工具類

數據庫 工具類

這是一個代碼質量比較高的Util。這裏寫了兩種,一種是原始的,一種是使用C3P0的。數據庫使用的是MySQL5.7。

使用框架開發的時候根本不需要寫這些東西。其實框架也是這樣封裝的,但提供的功能會很豐富。這裏展現的是思路,供參考。

功能齊全的Dao工具類


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<Connection> thread = new ThreadLocal<Connection>();
	
	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<Connection> thread = new ThreadLocal<Connection>();
	
	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());
	}
}


自定義數據庫連接工具類