由上一節的例子我麼可以看到,雖然實現了基本與數據庫操作的功能,但是,裏面對到處都是與數據庫密碼、URL之類的東西,我們可以想象,如果代碼中到處都是充滿這樣的代碼,那簡直就是災難,一點發生變更,比如數據庫密碼改了,那麼就需要對大量的代碼進行修改,另外,對資源的釋放也不規範,如果釋放第一個資源出現錯誤了,後面的資源就無法得到釋放,時間一長,系統就崩潰了。
我們重新對代碼進行規範化,做了如下的步驟:
(1)把對數據庫獲取鏈接以及釋放資源的操作,都放在一個類中。
(2)這個類在系統中只有一個實例,我們將其設計爲單例(SingleTon).
直接上代碼:
public final class JDBCToolSingleTon {
private String url = "jdbc:sqlserver://localhost:1433;DatabaseName=JDBCTEST";
private String user = "sa";
private String password = "newsoft@1305";
//靜態變量
private static JDBCToolSingleTon instance = null;
static {//靜態代碼塊,在虛擬機裝載該類時執行,而且只被執行一次
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
//conn = DriverManager.getConnection(url, user, password);不用在這裏獲取連接
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static JDBCToolSingleTon getInstance(){
if(instance == null)//併發處理,需要多重檢查
{//其實可以將方法設置爲異步,但性能比較差
synchronized(JDBCToolSingleTon.class){
if(instance == null)
{
instance = new JDBCToolSingleTon();
}
}
}
return instance;
}
//私有構造方法
private JDBCToolSingleTon()
{
}
public Connection getConnection() throws SQLException
{
return DriverManager.getConnection(url, user, password);
}
public void freeResource(Connection conn,ResultSet rs,Statement st){
try
{
if(rs!=null)
rs.close();
}
catch(Exception e){
e.printStackTrace();
}
try{
if(st != null)
st.close();
}
catch(Throwable e){
e.printStackTrace();
}
try{
if(conn != null)
{
conn.close();
conn = null;
}
}
catch(Throwable e){
e.printStackTrace();
}
}
我們來看看,編寫一個SingleTon有三個步驟:
(1)首先將構造方法設計爲私有,確保別人不能通過NEW生成實例
//私有構造方法
private JDBCToolSingleTon()
{
}
(2)編寫一個靜態變量。
//靜態變量
private static JDBCToolSingleTon instance = null;
(3)編寫一個獲取實例的方法。
public static JDBCToolSingleTon getInstance(){
if(instance == null)//併發處理,需要多重檢查
{//其實可以將方法設置爲異步,但性能比較差
synchronized(JDBCToolSingleTon.class){
if(instance == null)
{
instance = new JDBCToolSingleTon();//這裏使用了懶加載,只有要使用的時候才NEW
}
}
}
return instance;
}
另外,這段代碼中提供了兩個公用的方法獲取連接與釋放資源,分別爲:
public Connection getConnection() //獲取連接
public void freeResource(Connection conn,ResultSet rs,Statement st)//釋放資源
於是,我們上一節的那個例子可以修改爲:
JDBCToolSingleTon jDBCToolSingleTon = JDBCToolSingleTon.getInstance();
Connection conn = jDBCToolSingleTon.getConnection();
Statement statement = conn.createStatement();
String sql = "select * from UserInfo";
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){
System.out.println(resultSet.getString("name"));
}
jDBCToolSingleTon.freeResource(conn, resultSet, statement);
代碼修改成這樣,比原來就優雅很多了,如果需要修改數據庫連接信息,只要修改工具類就可以,當然,數據庫連接相關信息可以放在配置文件中,每次讀配置文件就可以,這樣更加方便。