根據前面的連接方法,還有缺點就是,如果人家要換數據庫,還得改動源代碼,然後還要編譯什麼的。這樣客戶修改也不容易。
做法:我們寫一個配置文件,把該數據寫在配置文件上面,然後通過類來加載改文件,然後讀取相應的數據。這樣就可以解決了換數據庫的問題,我們只需要改動配置文件就可以了,不用動源代碼。
詳細的步驟:
一、通過連接工具類獲取連接
在工程中,通常編寫一個訪問數據庫的工具類,此後所有訪問數據庫的操作,都從工具類中獲取連接。
實現工具類的兩種方式:
• 直接把數據配置寫在工具類。
• 把數據庫配置寫在一個properties屬性文件裡,工具類讀入屬性文件,逐行獲取數據庫參數。
建議使用第二種。
二、通過屬性文件維護連接屬性
db.properties的內容:
#驅動類名
jdbc.driver=com.mysql.jdbc.Driver
#連接字符串
jdbc.url=jdbc:mysql://localhost:3306/csdn
#訪問數據庫的用戶名
jdbc.user=root
#訪問數據庫的密碼
jdbc.password=123456
注意:在properties文件中,#符號表示注釋。
三、從類路徑中加載屬性文件
定義好db.properties之後,需要在Java程序中找到它,可以使用從類路徑加載的方式:
//屬性文件所在的位置
String path = "com/daliu/jdbc/db.properties";
//獲得當前類的路徑,加載指定屬性文件
properties.load(DBUtil.class.getClassLoader().getResourceAsStream(path));
四、連接的關閉
在工具類中定義公共的關閉連接的方法,所有訪問數據庫的應用,共享此方法。當完成功能,關閉連接。
protected static void closeConnection(Connection conn) {
if (conn != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
首先新建一個java工程,導入所需要的包,新建一個配置文件,如下圖:
db.properties文件代碼如下:
1 jdbc.driver=com.mysql.jdbc.Driver 2 jdbc.url=jdbc:mysql://localhost:3306/csdn 3 jdbc.user=root 4 jdbc.password=123456
DBUtil的代碼如下:
package com.daliu.jdbc; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; /** * 使用配置文件來配置JDBC連接數據庫 該類用來管理數據庫的連接 */ public class DBUtil { // 連接數據庫的路徑 public static String url; // 連接數據庫的用戶名 public static String user; // 連接數據庫的密碼 public static String pwd; public static String 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) { e.printStackTrace(); } } /** * 獲取一個連接 * * @return * @throws Exception */ public static Connection getConnection() throws Exception { try { /* * 通過DriverManager創建一個數據庫的連接 並返回 */ Connection conn = DriverManager.getConnection(url, user, pwd); /* * ThreadLocal的set方法 會將當前線程作為key,並將給定的值 作為value存入內部的map中保存。 */ return conn; } catch (Exception e) { e.printStackTrace(); // 通知調用者,創建連接出錯 throw e; } } /** * 關閉給定的連接 */ public static void closeConnection(Connection conn) { try { if (conn != null) { conn.close(); } } catch (Exception e) { e.printStackTrace(); } } /** * 測試是否連接成功 * @param args * @throws Exception */ public static void main(String[] args) throws Exception { System.out.println(getConnection()); } }
測試效果: