JDBCUtils 類設計:
1. 創建私有的屬性*(連接數據庫必要的四個變量):dreiver url user password
2. 將構造函數私有化
3.將注冊驅動寫入靜態代碼塊
4.外界只能通過調用本工具的靜態方法 getConnectio() 獲取數據庫連接,讓調用者處理異常(拋出異常)
5. 資源關閉采用也采用靜態方法調用
升級版:使用 properties 配置文件進行數據庫連接配置見下文工具二
JDBCUtils 代碼實現:
package com.test.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public final class JDBCUtils { private static String driver="com.mysql.jdbc.Driver"; private static String url="jdbc:mysql://localhost:3306/store28"; private static String user="root"; private static String password="root1234"; private JDBCUtils(){} static { /** * 驅動注冊 */ try { Class.forName(driver); } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(e); } } /** * 獲取 Connetion * @return * @throws SQLException */ public static Connection getConnection() throws SQLException{ return DriverManager.getConnection(url, user, password); } /** * 釋放資源 * @param conn * @param st * @param rs */ public static void colseResource(Connection conn,Statement st,ResultSet rs) { closeResultSet(rs); closeStatement(st); closeConnection(conn); } /** * 釋放連接 Connection * @param conn */ public static void closeConnection(Connection conn) { if(conn !=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } //等待垃圾回收 conn = null; } /** * 釋放語句執行者 Statement * @param st */ public static void closeStatement(Statement st) { if(st !=null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } //等待垃圾回收 st = null; } /** * 釋放結果集 ResultSet * @param rs */ public static void closeResultSet(ResultSet rs) { if(rs !=null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } //等待垃圾回收 rs = null; } }
工具一測試:
package com.test.jdbcTest;
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.junit.Test; import com.test.utils.JDBCUtils; public class JdbcTest { @Test public void add() { Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try { // 獲取連接 conn = JDBCUtils.getConnection(); // 編寫sql String sql = "insert into category values (?,?)"; // 創建語句執行者 st= conn.prepareStatement(sql); //設置參數 st.setString(1, "10"); st.setString(2, "測試目錄"); // 執行sql int i = st.executeUpdate(); if(i==1) { System.out.println("數據添加成功!"); }else { System.out.println("數據添加失敗!"); } } catch (SQLException e) { e.printStackTrace(); }finally { JDBCUtils.colseResource(conn, st, rs); } } }
工具類二(升級版):
使用 eclipse 在 src 目錄下創建 jdbc.properties 文件,寫入健值對:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/store28
user=root
password=root1234
package com.test.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ResourceBundle; public final class JDBCUtilsPlus { private static final String DRIVER; private static final String URL; private static final String USER; private static final String PASSWORD; private JDBCUtilsPlus(){} static { ResourceBundle bundle = ResourceBundle.getBundle("jdbc"); DRIVER = bundle.getString("driver"); URL = bundle.getString("url"); USER = bundle.getString("user"); PASSWORD = bundle.getString("password"); /** * 驅動注冊 */ try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(e); } } /** * 獲取 Connetion * @return * @throws SQLException */ public static Connection getConnection() throws SQLException{ return DriverManager.getConnection(URL, USER, PASSWORD); } /** * 釋放資源 * @param conn * @param st * @param rs */ public static void colseResource(Connection conn,Statement st,ResultSet rs) { closeResultSet(rs); closeStatement(st); closeConnection(conn); } /** * 釋放連接 Connection * @param conn */ public static void closeConnection(Connection conn) { if(conn !=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } //等待垃圾回收 conn = null; } /** * 釋放語句執行者 Statement * @param st */ public static void closeStatement(Statement st) { if(st !=null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } //等待垃圾回收 st = null; } /** * 釋放結果集 ResultSet * @param rs */ public static void closeResultSet(ResultSet rs) { if(rs !=null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } //等待垃圾回收 rs = null; } }
工具測試:
package com.test.jdbcTest; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.junit.Test; import com.test.utils.JDBCUtils; import com.test.utils.JDBCUtilsPlus; public class JdbcTest { @Test public void select() { Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try { // 獲取連接 conn = JDBCUtilsPlus.getConnection(); // 編寫sql String sql = "select * from category"; // 創建語句執行者 st= conn.prepareStatement(sql); rs = st.executeQuery(); while(rs.next()) { System.out.println(rs.getString(1)+"..."+rs.getString(2)); } } catch (SQLException e) { e.printStackTrace(); }finally { JDBCUtilsPlus.colseResource(conn, st, rs); } } }