自定義數據庫連接工具類
阿新 • • 發佈:2017-11-09
數據庫 工具類
這是一個代碼質量比較高的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());
}
}自定義數據庫連接工具類
