在前面的Java JDBC的基礎知識(二)和(三)中,主要介紹JDBC的原理和簡單的應用過程。尤其在(二)中,可以發現代碼進行多次try/catch,還有在前面創建連接等過程中好多參數我都給寫定了。 這些參數本來可以是在調用的時候再給的。以前學習過將工具類和測試類分開寫的好處,下麵就介紹資料庫的工具 ...
在前面的Java JDBC的基礎知識(二)和(三)中,主要介紹JDBC的原理和簡單的應用過程。尤其在(二)中,可以發現代碼進行多次try/catch,還有在前面創建連接等過程中好多參數我都給寫定了。
這些參數本來可以是在調用的時候再給的。以前學習過將工具類和測試類分開寫的好處,下麵就介紹資料庫的工具類,它可以避免代碼的臃腫的缺點。學會自己寫一個資料庫工具類,方便以後直接用。關鍵還是學會其中的編寫思路。
一、創建資料庫工具類
創建工具類的內容:
1.私有化構造方法
(防止別人欠欠new本類實例,也就是說這段程式也不是單例模式,工具運行時一個實例都沒有)
2.工具類裡面有得到連接的方法
3.工具類裡面有關閉資源的方法
4.工具類裡面有註冊驅動類
二、創建資料庫工具類具體操作及註意事項
1.私有化構造方法
public class DBUtil { // 私有化構造方法 private DBUtil() { } }
2.工具類裡面有得到連接的方法
//得到連接(Connection需導包) public static Connection getConn(){ //return null;(先這樣頂一下,不然編譯器會報錯) try { Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/t_employee","root","root"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
註意:當有執行語句之後,return null;要放在執行語句的後面。這個錯誤我找了3分鐘。
public static Connection getConn(){ try { Connection conn=DriverManager.getConnection(url,user,password);//註意:這裡就不要加雙引號了。 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }
升級版代碼:
public static Connection getConn(){ Connection conn=null; try { conn=DriverManager.getConnection(url,user,password); } catch (SQLException e) { //這裡異常可以按照需求再設置一下,將問題反饋給用戶 throw new RuntimeException("獲取連接失敗"); } return null; }
註意:
在getConnection中,三個參數(url,用戶名、密碼)都寫死了,不是很使用。解決:可以在前面聲明)。另外,考慮到在public static Connection getConn(){}這個靜態的方發里,靜態方法不可以訪問實例對象成員,所以,在前面聲明三個參數的時候,都要加上static修飾(static寫在private的左邊或者右邊,都可以。編譯器不會不報錯)。
private static String url=""; private static String user=""; private static String password="";
Connection conn=DriverManager.getConnection(url,user,password);
3.工具類裡面有關閉資源的方法
public static void close(ResultSet rs, Statement stm, Connection conn) { if (rs != null) { try { rs.close(); } catch (Exception e) { e.printStackTrace(); } } if (stm != null) { try { stm.close(); } catch (Exception e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } }
4.工具類裡面有註冊驅動類
一般來說,驅動類可以寫在private DBUtil(){}這個構造方發里,但是,這個構造方法在創建時的初衷是為了不讓別人new本類實例,驅動載入這裡,就違背了這一點。
在寫註冊驅動類時,考慮把它寫在單獨的靜態代碼塊裡面。
好處:靜態代碼塊只載入一次!!!恰好符合驅動類只需載入一次的特性。
static{ try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
註意:"com.mysql.jdbc.Driver"又是寫死的狀態,不實用。解決辦法——在前面聲明。
private static String className="";
static{ try { Class.forName(className); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
註意:
在載入驅動類的時候,如果忘記加jar包,就會拋出如下的異常。(這種錯誤很常見!)
Could not initialize class.DBUtil
三、測試類就會變得很輕盈
import java.sql.Connection; import java.sql.Statement; public class TestDemo { public static void main(String[] args) { add(); } static void add() { Connection conn = null; Statement stm = null; try { conn = DBUtil.getConn(); stm = conn.createStatement(); String sql = "insert into t_employee(name,age,salary) values('阿三',23,90000)"; // 切記:阿三要用單引號!!! stm.executeQuery(sql); System.out.println("執行成功");// 加一句,列印到控制台,驗證程式沒掛 } catch (Exception e) { e.printStackTrace(); } finally { DBUtil.close(null, stm, conn); // 第一個參數rs會報錯:rs cannot be resolved to a variable,這裡用null頂一下。 } } }
註意:下麵這條代碼
stm.executeQuery(sql);
當上面的add(){}被設置為void(無返回值)即,static void add(){}時,用stm.executeQuery(sql);
當上面的add(){}被設置為有返回值時,比如static add(){}時,用stm.executeQueryUpdate(sql);