硬編碼驅動、URL、用戶名、密碼會導致:換數據庫需改代碼重編譯、密碼洩露風險、環境遷移困難。引入 db.properties 配置文件 + DBUtil 工具類,實現「配置與代碼分離」。
src/ ├─ com/daliu/jdbc/ │ ├─ DBUtil.java │ └─ db.properties
# 驅動類全限定名 jdbc.driver=com.mysql.jdbc.Driver # 連接字符串(含字符集、時區等參數) jdbc.url=jdbc:mysql://localhost:3306/csdn?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC # 用戶名 jdbc.user=root # 密碼(生產環境建議加密存儲) jdbc.password=123456
package com.daliu.jdbc;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class DBUtil {
private static String url, user, pwd, driver;
static {
try {
Properties prop = new Properties();
// 從類路徑加載配置文件
InputStream is = DBUtil.class.getClassLoader()
.getResourceAsStream("com/daliu/jdbc/db.properties");
prop.load(is);
is.close();
driver = prop.getProperty("jdbc.driver");
url = prop.getProperty("jdbc.url");
user = prop.getProperty("jdbc.user");
pwd = prop.getProperty("jdbc.password");
// 註冊驅動
Class.forName(driver);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, pwd);
}
public static void closeConnection(Connection conn) {
if (conn != null) {
try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }
}
}
// 測試主方法
public static void main(String[] args) throws Exception {
System.out.println(getConnection());
}
}
ClassLoader.getResourceAsStream() 不依賴絕對路徑,打包為 JAR 後仍可工作。ExceptionInInitializerError,快速失敗。null 吞噬異常,簡化業務代碼。DriverManager 為 DataSource (HikariCP/Druid),getConnection() 從池獲取。db-dev.properties, db-prod.properties,啟動參數 -Denv=prod 動態切換。DBUtil 初始化時解密(AES/Jasypt)。Connection 參數。public class TestDBUtil {
public static void main(String[] args) throws Exception {
Connection conn = DBUtil.getConnection();
System.out.println("連接成功: " + conn);
DBUtil.closeConnection(conn);
}
}
輸出:連接成功: com.mysql.jdbc.JDBC4Connection@... 即表示配置正確。