通過案例我們發現“獲得連接”和“釋放資源”兩次代碼將在之後的增刪改查所有功能中都存在,開發中遇到此種情況,將採用工具類的方法進行抽取,從而達到代碼的重覆利用。 1、使用properties配置文件 開發中獲得連接的4個參數(驅動、URL、用戶名、密碼)通常都存在配置文件中,方便後期維護,程式如果需要 ...
通過案例我們發現“獲得連接”和“釋放資源”兩次代碼將在之後的增刪改查所有功能中都存在,開發中遇到此種情況,將採用工具類的方法進行抽取,從而達到代碼的重覆利用。
1、使用properties配置文件
開發中獲得連接的4個參數(驅動、URL、用戶名、密碼)通常都存在配置文件中,方便後期維護,程式如果需要更換資料庫,只需要修改配置文件即可。
文件要求如下:
1)文件位置:任意,建議在src下
2)文件名稱:任意,擴展名為properties
3)文件內容:一行一組數據,格式是“key=value”.
a)key命名自定義,如果是多個單詞,習慣使用點分隔。例如:jdbc.driver
b)value值不支持中文,如果需要使用非英文字元,將進行Unicode轉換
2、創建配置文件
右擊src->new->file命名...
1 driver=com.mysql.jdbc.Driver 2 url=jdbc:mysql://localhost:3306/web08?useUnicode=true&characterEncoding=utf8 3 username=root 4 password=12345
3.1、載入配置文件:ResourceBundle對象(JDBCUtils_V2.java文件)
1 package cn.itheima.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 import java.util.ResourceBundle; 9 10 /** 11 * 提供獲取連接和釋放資源的方法 12 * @author Administrator 13 * 14 */ 15 public class JDBCUtils_V2 { 16 private static String driver; //驅動 17 private static String url; //路徑 18 private static String username; //用戶名 19 private static String password; //密碼 20 21 /* 22 * 靜態代碼塊載入配置文件信息 23 */ 24 static{ 25 //1.使用JDK提供的工具類載入properties文件,getBundle()方法只需要填寫文件,不加尾碼!!! 26 ResourceBundle bundle=ResourceBundle.getBundle("db"); 27 //2.通過key獲得需要的值 28 driver=bundle.getString("driver"); 29 url=bundle.getString("url"); 30 username=bundle.getString("username"); 31 password=bundle.getString("password"); 32 } 33 34 /* 35 * 獲取連接方法 36 */ 37 public static Connection getConnection(){ 38 Connection conn=null; 39 try { 40 //1.註冊驅動 41 Class.forName(driver); 42 //2.獲得連接 43 conn=DriverManager.getConnection(url,username,password); 44 } catch (Exception e) { 45 e.printStackTrace(); 46 } 47 return conn; 48 } 49 /* 50 * 釋放資源方法 51 */ 52 public static void release(Connection conn,PreparedStatement pstmt,ResultSet rs){ 53 if(rs!=null){ 54 try { 55 rs.close(); 56 } catch (SQLException e) { 57 e.printStackTrace(); 58 } 59 } 60 if(pstmt!=null){ 61 try { 62 pstmt.close(); 63 } catch (SQLException e) { 64 e.printStackTrace(); 65 } 66 } 67 if(conn!=null){ 68 try { 69 conn.close(); 70 } catch (SQLException e) { 71 e.printStackTrace(); 72 } 73 } 74 } 75 }
3.2、載入配置文件:Properties對象((JDBCUtils_V3.java文件)可選)
1 package cn.itheima.jdbc; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.InputStreamReader; 6 import java.sql.Connection; 7 import java.sql.DriverManager; 8 import java.sql.PreparedStatement; 9 import java.sql.ResultSet; 10 import java.sql.SQLException; 11 import java.util.Properties; 12 import java.util.ResourceBundle; 13 14 /** 15 * 提供獲取連接和釋放資源的方法 16 * @author Administrator 17 * 18 */ 19 public class JDBCUtils_V3 { 20 private static String driver; //驅動 21 private static String url; //路徑 22 private static String username; //用戶名 23 private static String password; //密碼 24 25 /* 26 * 靜態代碼塊載入配置文件信息 27 */ 28 static{ 29 try { 30 //1.通過當前類獲得類載入器 31 ClassLoader classLoader=JDBCUtils_V3.class.getClassLoader(); 32 //2.通過類載入器的方法獲得一個輸入流 33 InputStream is=classLoader.getResourceAsStream("db.properties"); 34 //3.創建一個properties對象 35 Properties props=new Properties(); 36 //4.載入輸入流 37 props.load(is); 38 //5.獲取相關參數的值 39 driver=props.getProperty("driver"); 40 url=props.getProperty("url"); 41 username=props.getProperty("username"); 42 password=props.getProperty("password"); 43 } catch (IOException e) { 44 e.printStackTrace(); 45 } 46 } 47 /* 48 * 獲取連接方法 49 */ 50 public static Connection getConnection(){ 51 Connection conn=null; 52 try { 53 //1.註冊驅動 54 Class.forName(driver); 55 //2.獲得連接 56 conn=DriverManager.getConnection(url,username,password); 57 } catch (Exception e) { 58 e.printStackTrace(); 59 } 60 return conn; 61 } 62 /* 63 * 釋放資源 64 */ 65 public static void release(Connection conn,PreparedStatement pstmt,ResultSet rs){ 66 if(rs!=null){ 67 try { 68 rs.close(); 69 } catch (SQLException e) { 70 e.printStackTrace(); 71 } 72 } 73 if(pstmt!=null){ 74 try { 75 pstmt.close(); 76 } catch (SQLException e) { 77 e.printStackTrace(); 78 } 79 } 80 if(conn!=null){ 81 try { 82 conn.close(); 83 } catch (SQLException e) { 84 e.printStackTrace(); 85 } 86 } 87 } 88 }
4、實現CRUD操作(查詢和添加使用的JDBCUtils_V2.java、刪除和修改使用的是JDBCUtils_V3.java文件)
1 package cn.itheima.jdbc.test; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 8 import org.junit.Test; 9 10 import cn.itheima.jdbc.JDBCUtils_V2; 11 import cn.itheima.jdbc.JDBCUtils_V3; 12 13 /* 14 * 測試工具類 15 */ 16 public class TestUtils { 17 /* 18 * 根據id查詢用戶信息 19 */ 20 @Test 21 public void testFindUserById() { 22 Connection conn = null; 23 PreparedStatement pstmt = null; 24 ResultSet rs = null; 25 try { 26 // 1.獲取連接 27 conn = JDBCUtils_V2.getConnection(); 28 // 2.編寫sql語句 29 String sql = "select * from tbl_user where uid=?"; 30 // 3.獲取執行sql語句對象 31 pstmt = conn.prepareStatement(sql); 32 // 4.設置參數 33 pstmt.setInt(1, 2); 34 // 5.執行查詢操作 35 rs = pstmt.executeQuery(); 36 // 6.處理結果集 37 while (rs.next()) { 38 System.out.println(rs.getString(2) + "----" + rs.getString("upassword")); 39 } 40 // 釋放資源放在此處不行滴! 41 } catch (SQLException e) { 42 e.printStackTrace(); 43 } finally { 44 // 7.釋放資源 45 JDBCUtils_V2.release(conn, pstmt, rs); 46 } 47 } 48 49 /* 50 * 添加用戶信息方法 51 */ 52 @Test 53 public void testAdd(){ 54 Connection conn=null; 55 PreparedStatement pstmt=null; 56 try{ 57 //1.獲取連接 58 conn=JDBCUtils_V2.getConnection(); 59 //2.編寫sql語句 60 String sql="insert into tbl_user values(null,?,?)"; 61 //3.獲取執行sql語句對象 62 pstmt=conn.prepareStatement(sql); 63 //4.設置參數 64 pstmt.setString(1, "hehe"); 65 pstmt.setString(2,"789"); 66 //5.執行插入操作 67 int row=pstmt.executeUpdate(); 68 if(row>0){ 69 System.out.print("添加成功!"); 70 }else{ 71 System.out.print("添加失敗 "); 72 } 73 }catch(Exception e){ 74 e.printStackTrace(); 75 }finally{ 76 //6.釋放資源 77 JDBCUtils_V2.release(conn, pstmt, null); 78 } 79 } 80 81 /* 82 * 根據id刪除用戶信息 83 */ 84 @Test 85 public void testDeleteById(){ 86 Connection conn = null; 87 PreparedStatement pstmt = null; 88 ResultSet rs = null; 89 try { 90 // 1.獲取連接 91 conn = JDBCUtils_V3.getConnection(); 92 // 2.編寫sql語句 93 String sql = "delete from tbl_user where uid=?"; 94 // 3.獲取執行sql語句對象 95 pstmt = conn.prepareStatement(sql); 96 // 4.設置參數 97 pstmt.setInt(1, 4); 98 // 5.執行刪除操作 99 int row=pstmt.executeUpdate(); 100 if(row>0){ 101 System.out.print("刪除成功!"); 102 }else{ 103 System.out.print("刪除失敗 "); 104 } 105 }catch(Exception e){ 106 e.printStackTrace(); 107 }finally{ 108 //6.釋放資源 109 JDBCUtils_V3.release(conn, pstmt, null); 110 } 111 } 112 113 /* 114 * 根據id更新用戶信息 115 */ 116 @Test 117 public void testUpdateById(){ 118 Connection conn = null; 119 PreparedStatement pstmt = null; 120 ResultSet rs = null; 121 try { 122 // 1.獲取連接 123 conn = JDBCUtils_V3.getConnection(); 124 // 2.編寫sql語句 125 String sql = "update tbl_user set upassword=? where uid=?"; 126 // 3.獲取執行sql語句對象 127 pstmt = conn.prepareStatement(sql); 128 // 4.設置參數 129 pstmt.setString(1, "233"); 130 pstmt.setInt(2, 5); 131 // 5.執行更新操作 132 int row=pstmt.executeUpdate(); 133 if(row>0){ 134 System.out.print("更新成功!"); 135 }else{ 136 System.out.print("更新失敗 "); 137 } 138 }catch(Exception e){ 139 e.printStackTrace(); 140 }finally{ 141 //6.釋放資源 142 JDBCUtils_V3.release(conn, pstmt, null); 143 } 144 } 145 }
查詢uid=2的效果如下:
添加成功的效果如下:
刪除uid=4的效果如下:
更新uid=5的密碼為233的效果如下: