經過以前的案例回顧,不難發現,有不少的代碼操做是重複的,好比「獲取連接」和「釋放資源」等,未來在增刪改查中常常遇到,開發中遇到這種狀況,將採用工具類的方法進行抽取,從而達到代碼的重複利用。java
此處使用V1版本,以後還有替他版本。mysql
獲取連接git
/** * 獲取鏈接方法 * * @return */ public static Connection getConnection() { Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/web08", "root", "root"); } catch (Exception e) { e.printStackTrace(); } return conn; }
釋放資源 github
public static void release(Connection conn, PreparedStatement pstmt, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (pstmt != null) { try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
package cn.jayvee.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * 提供獲取連接和資源的方法 * @author Jayvee * @date 2019-5-12 下午4:22:24 * @version V1.0 * */ public class JDBCUtils_V1 { /** * 獲取連接方法 * @return */ public static Connection getConnection(){ Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbtest","root","123456"); } catch (Exception e) { e.printStackTrace(); } return conn; } public static void release(Connection conn,PreparedStatement pstmt,ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (pstmt!=null) { try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn!=null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
package cn.jayvee.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.junit.Test; import cn.jayvee.jdbc.JDBCUtils_V1; /** * 測試工具類 * * @author Jayvee * @date 2019-5-12 下午4:38:54 * @version V1.0 */ public class TestUtils { /** * 根據id查詢用戶信息 */ @Test public void testFindUserById() { Connection conn = null; ResultSet rs = null; PreparedStatement pstmt = null; try { // 1.獲取連接 conn = JDBCUtils_V1.getConnection(); // 2.編寫sql語句 String sql = "select * from student where id=?"; // 3.獲取執行sql語句對象 pstmt = conn.prepareStatement(sql); // 4.設置參數(1表示第一個問號,2表示第一個問號的值是2) pstmt.setInt(1, 2); // 5.執行查詢操做 rs = pstmt.executeQuery(); // 6.處理結果集 while (rs.next()) { // rs.getString(2)表示獲取這條數據的第二列的數據 // rs.getString("age")表示獲取這條數據中age字段的之 System.out.print(rs.getString(2) + "----" + rs.getString("age")); } // 釋放資源放在這裏不可行! } catch (SQLException e) { e.printStackTrace(); } finally { // 7.釋放資源 JDBCUtils_V1.release(conn, pstmt, rs); } } }
開發中得到連接的四個參數(驅動、URL、用戶名、密碼)一般都存在在配置文件中,方便後期維護,程序若是須要更換數據庫,只須要修改配置文件便可。web
一般狀況下,咱們習慣使用 properties 文件,此文件咱們將做以下要求:sql
1. 文件位置:任意,建議src下。數據庫
2. 文件名稱:任意,擴展名爲 properties 。ide
3. 文件內容:一行一組數據,格式是「 key = value 」。工具
a)key 命名自定義,不能帶有空格,若是是多個單詞,習慣使用點分隔。例如「 jdbc.driver 」測試
b)value值不支持中文,不能帶有空格,若是須要使用非英文字符,將進行 Unicode 轉換。
在 src 目錄下建立一個 db.properties 配置文件。
文件內編寫以下配置(具體狀況具體改)
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/dbtest?useUnicode=true&characterEncoding=utf8 username=root password=123456
咱們在V2版本中使用JDK提供的工具類 ResourceBundle 加載 properties 文件,ResourceBundle 提供 getBundle() 方法用於只提供 properties 文件便可,以後使用 getString(key) 經過 key 得到 value的值。
package cn.jayvee.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ResourceBundle; /** * 提供獲取連接和資源的方法 * @author Jayvee * @date 2019-5-12 下午4:22:24 * @version V1.0 * */ public class JDBCUtils_V2 { private static String driver; private static String url; private static String username; private static String password; /** * 靜態代碼塊加載配置文件信息 */ static{ // 加載配置文件 ResourceBundle bundle = ResourceBundle.getBundle("db"); driver = bundle.getString("driver"); url = bundle.getString("url"); username = bundle.getString("username"); password = bundle.getString("password"); } /** * 獲取連接方法 * @return */ public static Connection getConnection(){ Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(url,username,password); } catch (Exception e) { e.printStackTrace(); } return conn; } /** * 釋放資源 * @param conn * @param pstmt * @param rs */ public static void release(Connection conn,PreparedStatement pstmt,ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (pstmt!=null) { try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn!=null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
package cn.jayvee.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.management.RuntimeErrorException; import org.junit.Test; import cn.jayvee.jdbc.JDBCUtils_V1; import cn.jayvee.jdbc.JDBCUtils_V2; /** * 測試工具類 * * @author Jayvee * @date 2019-5-12 下午4:38:54 * @version V1.0 */ public class TestUtils { /** * 添加用戶信息方法 */ @Test public void testAdd(){ Connection conn = null; PreparedStatement pstmt = null; try { // 1.獲取鏈接 conn = JDBCUtils_V2.getConnection(); // 2.編寫 sql 語句 String sql = "insert into student values(null,?,?)"; // 3.獲取執行sql語句對象 pstmt = conn.prepareStatement(sql); // 4.設置參數 pstmt.setString(1, "wangjiawei"); pstmt.setString(2, "25"); // 5.執行插入操做 int row = pstmt.executeUpdate(); if (row>0) { System.out.println("添加成功!"); }else{ System.out.println("添加失敗!"); } } catch (Exception e) { throw new RuntimeException(e); }finally{ // 6.釋放資源 JDBCUtils_V2.release(conn, pstmt, null); } } /** * 根據id查詢用戶信息 */ public void testFindUserById() { Connection conn = null; ResultSet rs = null; PreparedStatement pstmt = null; try { // 1.獲取連接 conn = JDBCUtils_V1.getConnection(); // 2.編寫sql語句 String sql = "select * from student where id=?"; // 3.獲取執行sql語句對象 pstmt = conn.prepareStatement(sql); // 4.設置參數(1表示第一個問號,2表示第一個問號的值是2) pstmt.setInt(1, 2); // 5.執行查詢操做 rs = pstmt.executeQuery(); // 6.處理結果集 while (rs.next()) { // rs.getString(2)表示獲取這條數據的第二列的數據 // rs.getString("age")表示獲取這條數據中age字段的之 System.out.print(rs.getString(2) + "----" + rs.getString("age")); } // 釋放資源放在這裏不可行! } catch (SQLException e) { e.printStackTrace(); } finally { // 7.釋放資源 JDBCUtils_V1.release(conn, pstmt, rs); } } }
對應 properties 文件的處理,開發中也會使用 Properties 對象將進行,在V3版本中,咱們將採用加載 properties 文件得到流,而後使用 properties 對象進行處理。
package cn.jayvee.jdbc; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * 提供獲取連接和資源的方法 * * @author Jayvee * @date 2019-5-12 下午4:22:24 * @version V1.0 * */ public class JDBCUtils_V3 { private static String driver; private static String url; private static String username; private static String password; /** * 靜態代碼塊加載配置文件信息 */ static { try { // 1.經過當前類獲取類加載器 ClassLoader classLoader = JDBCUtils_V3.class.getClassLoader(); // 2.經過類加載器的方法獲取一個輸入流 InputStream is = classLoader.getResourceAsStream("db.properties"); // 3.建立一個properties對象 java.util.Properties props = new java.util.Properties(); // 4.加載輸入流 props.load(is); // 5.獲取相關參數的值 driver = props.getProperty("driver"); url = props.getProperty("url"); username = props.getProperty("username"); password = props.getProperty("password"); } catch (IOException e) { e.printStackTrace(); } } /** * 獲取連接方法 * * @return */ public static Connection getConnection() { Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(url, username, password); } catch (Exception e) { e.printStackTrace(); } return conn; } /** * 釋放資源 * * @param conn * @param pstmt * @param rs */ public static void release(Connection conn, PreparedStatement pstmt, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (pstmt != null) { try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
package cn.jayvee.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.management.RuntimeErrorException; import org.junit.Test; import cn.jayvee.jdbc.JDBCUtils_V1; import cn.jayvee.jdbc.JDBCUtils_V2; import cn.jayvee.jdbc.JDBCUtils_V3; /** * 測試工具類 * * @author Jayvee * @date 2019-5-12 下午4:38:54 * @version V1.0 */ public class TestUtils { /** * 根據id刪除信息 */ @Test public void testDeleteById(){ Connection conn = null; PreparedStatement pstmt = null; try { // 1.獲取鏈接 conn = JDBCUtils_V3.getConnection(); // 2.編寫 sql 語句 String sql = "delete from student where id=?"; // 3.獲取執行sql語句對象 pstmt = conn.prepareStatement(sql); // 4.設置參數 pstmt.setInt(1, 3); // 5.執行刪除操做 int row = pstmt.executeUpdate(); if (row>0) { System.out.println("刪除成功!"); }else{ System.out.println("刪除失敗!"); } } catch (Exception e) { throw new RuntimeException(e); }finally{ // 6.釋放資源 JDBCUtils_V3.release(conn, pstmt, null); } } /** * 添加用戶信息方法 */ public void testAdd(){ Connection conn = null; PreparedStatement pstmt = null; try { // 1.獲取鏈接 conn = JDBCUtils_V2.getConnection(); // 2.編寫 sql 語句 String sql = "insert into student values(null,?,?)"; // 3.獲取執行sql語句對象 pstmt = conn.prepareStatement(sql); // 4.設置參數 pstmt.setString(1, "wangjiawei"); pstmt.setString(2, "25"); // 5.執行插入操做 int row = pstmt.executeUpdate(); if (row>0) { System.out.println("添加成功!"); }else{ System.out.println("添加失敗!"); } } catch (Exception e) { throw new RuntimeException(e); }finally{ // 6.釋放資源 JDBCUtils_V2.release(conn, pstmt, null); } } /** * 根據id查詢用戶信息 */ public void testFindUserById() { Connection conn = null; ResultSet rs = null; PreparedStatement pstmt = null; try { // 1.獲取連接 conn = JDBCUtils_V1.getConnection(); // 2.編寫sql語句 String sql = "select * from student where id=?"; // 3.獲取執行sql語句對象 pstmt = conn.prepareStatement(sql); // 4.設置參數(1表示第一個問號,2表示第一個問號的值是2) pstmt.setInt(1, 2); // 5.執行查詢操做 rs = pstmt.executeQuery(); // 6.處理結果集 while (rs.next()) { // rs.getString(2)表示獲取這條數據的第二列的數據 // rs.getString("age")表示獲取這條數據中age字段的之 System.out.print(rs.getString(2) + "----" + rs.getString("age")); } // 釋放資源放在這裏不可行! } catch (SQLException e) { e.printStackTrace(); } finally { // 7.釋放資源 JDBCUtils_V1.release(conn, pstmt, rs); } } }
package cn.jayvee.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.junit.Test; import cn.jayvee.jdbc.JDBCUtils_V1; import cn.jayvee.jdbc.JDBCUtils_V2; import cn.jayvee.jdbc.JDBCUtils_V3; /** * 測試工具類 * * @author Jayvee * @date 2019-5-12 下午4:38:54 * @version V1.0 */ public class TestUtils { /** * 根據id更新信息 */ @Test public void testUpdateById(){ Connection conn = null; PreparedStatement pstmt = null; try { // 1.獲取鏈接 conn = JDBCUtils_V3.getConnection(); // 2.編寫 sql 語句 String sql = "update student set age=? where id=?"; // 3.獲取執行sql語句對象 pstmt = conn.prepareStatement(sql); // 4.設置參數 pstmt.setInt(1, 18); pstmt.setInt(2, 1); // 5.執行更新操做 int row = pstmt.executeUpdate(); if (row>0) { System.out.println("更新成功!"); }else{ System.out.println("更新失敗!"); } } catch (Exception e) { throw new RuntimeException(e); }finally{ // 6.釋放資源 JDBCUtils_V3.release(conn, pstmt, null); } } /** * 根據id刪除信息 */ public void testDeleteById(){ Connection conn = null; PreparedStatement pstmt = null; try { // 1.獲取鏈接 conn = JDBCUtils_V3.getConnection(); // 2.編寫 sql 語句 String sql = "delete from student where id=?"; // 3.獲取執行sql語句對象 pstmt = conn.prepareStatement(sql); // 4.設置參數 pstmt.setInt(1, 3); // 5.執行刪除操做 int row = pstmt.executeUpdate(); if (row>0) { System.out.println("刪除成功!"); }else{ System.out.println("刪除失敗!"); } } catch (Exception e) { throw new RuntimeException(e); }finally{ // 6.釋放資源 JDBCUtils_V3.release(conn, pstmt, null); } } /** * 添加用戶信息方法 */ public void testAdd(){ Connection conn = null; PreparedStatement pstmt = null; try { // 1.獲取鏈接 conn = JDBCUtils_V2.getConnection(); // 2.編寫 sql 語句 String sql = "insert into student values(null,?,?)"; // 3.獲取執行sql語句對象 pstmt = conn.prepareStatement(sql); // 4.設置參數 pstmt.setString(1, "wangjiawei"); pstmt.setString(2, "25"); // 5.執行插入操做 int row = pstmt.executeUpdate(); if (row>0) { System.out.println("添加成功!"); }else{ System.out.println("添加失敗!"); } } catch (Exception e) { throw new RuntimeException(e); }finally{ // 6.釋放資源 JDBCUtils_V2.release(conn, pstmt, null); } } /** * 根據id查詢用戶信息 */ public void testFindUserById() { Connection conn = null; ResultSet rs = null; PreparedStatement pstmt = null; try { // 1.獲取連接 conn = JDBCUtils_V1.getConnection(); // 2.編寫sql語句 String sql = "select * from student where id=?"; // 3.獲取執行sql語句對象 pstmt = conn.prepareStatement(sql); // 4.設置參數(1表示第一個問號,2表示第一個問號的值是2) pstmt.setInt(1, 2); // 5.執行查詢操做 rs = pstmt.executeQuery(); // 6.處理結果集 while (rs.next()) { // rs.getString(2)表示獲取這條數據的第二列的數據 // rs.getString("age")表示獲取這條數據中age字段的之 System.out.print(rs.getString(2) + "----" + rs.getString("age")); } // 釋放資源放在這裏不可行! } catch (SQLException e) { e.printStackTrace(); } finally { // 7.釋放資源 JDBCUtils_V1.release(conn, pstmt, rs); } } }
項目代碼:https://github.com/wjw1014/JavaMysqlStudy/tree/master/web09 (小白操做,僅供參考!)