JDBC連接-----更靈活的編寫方式(配置文件編寫)
目錄
1、爲什麼要用配置文件寫JDBC連接?
爲了使原生的JDBC連接更靈活。
開發中獲得連接的4個參數(驅動、URL、用戶名、密碼)都存在配置文件中,這樣方便後期維護,程序如果需要更換數據庫,只需要修改配置文件即可。
2、關於Properties類
讀取配置文件的信息用到的是Java提供的一個專用的類Properties 。這個類繼承自Hashtable,是個雙列集合。他有個load(InputStream) 方法,用來加載輸入流讀取的文件,會將文件中以“A=B”方式存儲的信息讀取進來分別將A值和B值放進Properties集合的key、和value中。這樣一來,如果將開發中獲得連接的4個參數(驅動、URL、用戶名、密碼)都存在項目下的一個文本文件中,通過Properties加載進來,就大大提高了代碼的靈活性,程序如果需要更換數據庫,只需要修改這個文件即可。
這個文件就是置文件。配置文件都默認放在當前項目的src目錄下。因爲我們是用Properties加載的,所以把配置文件的後綴定爲(.properties),命名爲config.properties.關於後綴名,後綴不影響文本文件的內容,影響的是打開文件的方式。
如下(2-1)config.properties存儲的內容
3、讀取配置文件
讀取配置文件有兩種方法,一種是根據路徑讀取文件;另一種是通過類加載器來獲取指定流文件的信息。後者不需要寫路徑,只要在項目內部,源碼會自動尋找,但需要對類加載器有一定理解(不理解的話,記着固定格式直接拿來用也行)。
讀取配置文件的代碼寫在名爲JdbcSuperPlus的工具類中,所以使用第二種方法讀取配置文件的寫法應該是(3-1)
InputStream ras = JdbcSuperPlus.class.getClassLoader().getResourceAsStream("config.properties");
返回的是一個輸入流,將輸入流直接傳入Properties對象的load方法中,然後通過Properties的getProperty方法獲取4個參數。代碼如下(3-2)。
public static void init() throws IOException {
//定義Properties容器對象
Properties pp = new Properties();
//類加載器的方式獲取配置文件信息
InputStream ras = JdbcSuperPlus.class.getClassLoader().getResourceAsStream("config.properties");
//測試
/*System.out.println(ras);*/
//通過流文件根據路徑獲取配置文件信息
/*pp.load(new FileInputStream("tes_jdbc\\src\\config.properties"));*/
//將讀取到的配置文件信息加載到Properties集合中
pp.load(ras);
//分別獲取4個參數
className = pp.getProperty("className");
url = pp.getProperty("url");
username = pp.getProperty("username");
password = pp.getProperty("password");
}
我們可以看到這個獲取參數的方法自成一體,叫init,init取的是Initialization的前四個字母,意爲初始化,初始化的步驟單獨寫在一個方法而不是放在靜態代碼塊中,目的是爲了降低靜態代碼塊的臃腫性,在靜態代碼塊中加載驅動,同時調用init方法,進行初始化值。代碼顯得不那麼臃腫。
4、加載驅動的工具類代碼實現
4個關鍵參數已經獲取,那麼加載驅動分、獲取連接、關閉資源這些放在工具類中的代碼就很容易完成了。代碼如下(4-1)
package test01;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
* @Author: ${user}
*/
public class JdbcSuperPlus {
private static String url;
private static String username;
private static String password;
private static String className;
static {
try {
init();
Class.forName(className);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void init() throws IOException {
//定義Properties容器對象
Properties pp = new Properties();
//類加載器的方式獲取配置文件信息
InputStream ras = JdbcSuperPlus.class.getClassLoader().getResourceAsStream("config.properties");
//測試
/*System.out.println(ras);*/
//通過流文件根據路徑獲取配置文件信息
/*pp.load(new FileInputStream("tes_jdbc\\src\\config.properties"));*/
//將讀取到的配置文件信息加載到Properties集合中
pp.load(ras);
//分別獲取4個參數
className = pp.getProperty("className");
url = pp.getProperty("url");
username = pp.getProperty("username");
password = pp.getProperty("password");
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, username, password);
}
//關閉資源
public static void close(Connection con, Statement stat, ResultSet rs) {
try {
if (con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (stat != null)
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
5、定義一個test類Test_jsp,獲取連接執行sql語句。代碼如下(5-1)
package test01;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @Author: ${user}
*/
public class Test_jsp {
public static void main(String[] args) throws SQLException {
//加載獲取連接
Connection conn = JdbcSuperPlus.getConnection();
String str = "select * from book";
//獲取執行sql的對象
PreparedStatement ps = conn.prepareStatement(str);
//執行查詢功能
ResultSet rs = ps.executeQuery();
//處理結果集
while(rs.next()){
System.out.print(rs.getInt(1));
System.out.print(rs.getString(2));
System.out.print(rs.getDouble(3));
System.out.println(rs.getString(4));
}
//關閉資源
JdbcPlus.close(conn,ps,rs);
}
}
定義的測試類和原生jdbc連接的測設了一模一樣!
總結
Jdbc使用配置文件連接寫的時候還是想着前面原生Jdbc連接來寫的,所以很多解釋都在前面Jdbc原生連接的博文中,在這裏附上前文連接,以便跳轉。
能力尚淺,有待進步,如有不足,不吝賜教!