MySQL學習(五)——使用JDBC完成用戶表CRUD的操作

来源:http://www.cnblogs.com/cxq1126/archive/2017/09/09/7498153.html
-Advertisement-
Play Games

通過案例我們發現“獲得連接”和“釋放資源”兩次代碼將在之後的增刪改查所有功能中都存在,開發中遇到此種情況,將採用工具類的方法進行抽取,從而達到代碼的重覆利用。 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的效果如下:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • async await 解決非同步問題,這兩個關鍵字是es7提出的,所以測試,node和瀏覽器版本提高一些 async await 操作基於promise實現的 async await這兩個關鍵字是一起使用,分開使用會報錯 await 後面只能跟promise對象 不熟悉的promise非同步操作的朋友 ...
  • 今年6月份開始,我開始負責對“得到app”的android代碼進行組件化拆分,在動手之前我查閱了很多組件化或者模塊化的文章,雖然有一些收穫,但是很少有文章能夠給出一個整體且有效的方案,大部分文章都只停留在組件單獨調試的層面上,涉及組件之間的交互就很少了,更不用說組件生命周期、集成調試和代碼邊界這些最 ...
  • 本文提出的組件化方案demo已經開源,參見文章 "Android徹底組件化方案開源" 。 文末有羅輯思維“得到app”的招聘廣告,歡迎各路牛人加入!! 一、模塊化、組件化與插件化 項目發展到一定程度,隨著人員的增多,代碼越來越臃腫,這時候就必須進行模塊化的拆分。在我看來,模塊化是一種指導理念,其核心 ...
  • 正常在Activity中使用Fragment的生命周期,第一次啟動過程是onAtach()-onCreate()-onCreateView()-onViewCreated()-onActivityCreated()-onStart()-onResume();隨著Activity被退棧銷毀,Fragm ...
  • 綁定服務 右邊部分就是綁定服務的運行過程 這樣綁定的目的就是服務綁定者調用服務的方法,在我的樣例里就是體現為服務訪問者調用服務的show()方法 來張效果圖吧 分析: 1、第一步還是繼承服務類 2、第二步的話就是配置服務 3、第三步就是綁定服務 ...
  • 播放音樂案例 分析: 和上一篇文章的結構是一樣的,只不過我們需要在這裡裡面加上播放音樂的一些操作: 其實也就是調用系統的播放音樂的API而已,寫在服務裡面就好, //媒體播放器 private MediaPlayer player; 第一步,照樣找個類來繼承服務類 第二步,該配置的監聽服務也是要配置 ...
  • service 下圖昨天是沒被綁定的情況,右邊是被綁定的情況 看下測試的效果圖: 程式被關閉,服務還是會在後臺運行,再次運行程式,程式還是能啟動和停止服務 分析: 1、先整個類繼承服務類 2、然後去配置這個服務 fry.myService是上面那個類的路徑 3、再去啟動和停止服務 ...
  • 這裡實現的功能是從主頁佈局的fragment點擊跳轉到一個acitivity,然後頂部是一個切換的segment底部部是一個listview,點擊segment分段讓listview載入不同的內容。我這裡沒再使用viewpager,應該使用viewpager+listview也能實現。我這裡使用的算 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...