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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...