淺談JDBC編程

来源:http://www.cnblogs.com/JaydenRansom/archive/2016/07/18/5682438.html
-Advertisement-
Play Games

一、概述 1.為什麼要用JDBC 資料庫是程式不可或缺的一部分,每一個網站和伺服器的建設都需要資料庫。對於大多數應用程式員(此處不包含資料庫開發人員)來說,我們更多的不是在DBMS中對資料庫進行操縱,而是在我們編寫的程式中對資料庫進行訪問,Java程式中一般都是通過JDBC來連接伺服器併進行增刪改查 ...


一、概述

1.為什麼要用JDBC

      資料庫是程式不可或缺的一部分,每一個網站和伺服器的建設都需要資料庫。對於大多數應用程式員(此處不包含資料庫開發人員)來說,我們更多的不是在DBMS中對資料庫進行操縱,而是在我們編寫的程式中對資料庫進行訪問,Java程式中一般都是通過JDBC來連接伺服器併進行增刪改查操作的。下麵,就來具體介紹一下JDBC編程。

2.SQL語言的分類

根據所進行操作種類的不同,結構化查詢語言SQL分為三類,分別為:

       (1)DQL:數據查詢語言    例:select

       (2)DML:數據操縱語言      例:insert、update、delete

       (3)DDL:數據定義語言       例:create

二、JDBC編程所需要的準備

1.開發環境準備

      首先需要配置集成開發環境,本例中使用的IDE為MyEclipse2014,資料庫為MySQL資料庫。在我們進行編程之前,首先還要引用MySQL官方提供的jar包,該包中提供了資料庫驅動,資料庫驅動的載入是JDBC編程必不可缺的步驟。

引用jar包的步驟(在MyEclipse中):

(1)在項目路徑下建立lib文件夾

(2)下載獲得jar包,並複製到lib文件夾下

(3)右鍵單擊導入到lib文件夾中的jar包,選擇Build Path,之後添加到Build Path,添加到引用列表

在配置好了集成開發環境並引入MySQL的jar包後,我們就可以開始我們的JDBC編程了。

2.資料庫準備

我們建立了一個存儲員工的WORKER表,建表語句如下:

1 create table WORKER (
2     worker_num varchar(10),
3     worker_name varchar(20) not null,
4     worker_dept int(3),
5     worker_address varchar(50),
6     worker_sal int(5),
7     worker_level varchar(10),
8     constraint pk_worker_num primary key(worker_num),
9 );

 

 三、開始編寫第一個JDBC程式

1.JDBC程式編寫流程:

(1)載入資料庫驅動

      資料庫驅動,就是應用於特定資料庫的一套實現了JDBC介面的類集。我們在準備的時候載入了mysql資料庫對應的jar包,其中就有資料庫驅動。只有載入了資料庫驅動,才能夠繼續進行對資料庫的操作。

1 //載入資料庫驅動的代碼如下
2 Class.forName("com.mysql.jdbc.Driver");

其中,forName方法的參數由不同的資料庫決定,這裡我們載入的是MySQL資料庫的驅動。

(2)定義資料庫的url(統一資源定位符)

       url是獲取連接的必須要素,其格式如下:協議、IP地址、埠號、資料庫名

       我們定義的url如下:

          String url = “jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8”

          其中,jdbc:mysql為協議部分;localhost為IP地址,此處是本機;3306為MySQL的預設埠號;mydb為資料庫名;問號後面部分的作用是防止亂碼。

(3)獲得資料庫連接(Connection對象)

        要想進行對資料庫的操作,首先需要獲得資料庫的連接對象,JDBC中我們使用DriverManager的靜態方法進行連接對象的初始化。

1 //獲得資料庫連接對象的代碼如下:
2 Connection conn = DriverManager.getConnection(url, userName, passWord);

    其中getConnection方法有三個String類型的參數,分別為資料庫連接的url,資料庫登陸的用戶名和資料庫登陸的密碼。

(4)創建Statement並初始化

        Statement是用來執行語句的,我們利用Connection的內置方法對Statement進行初始化,之後通過Statement對象執行SQL語句。

//創建Statement對象的代碼如下:
Statement stmt = conn.createStatement();

  其中,conn為已經獲得的Connection對象

(5)執行SQL語句

(6)釋放資料庫資源

      資料庫資源是有限的,如果一直不釋放連接對象,那麼一旦達到上限,則之後的應用無法獲取連接對象,也就無法繼續程式的執行;同理,Statement對象會占用記憶體,一旦記憶體使用完畢,也會阻礙程式的執行。因此,我們要在每次使用完這些對象後進行關閉。

2.一個對資料庫進行DQL操作的例子

 1 //連接資料庫,併進行查詢
 2 public class JdbcTest {
 3     public static void main(String[] args) {
 4         String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8";
 5         String user = "root";
 6         String psw = "root";
 7         String sql = "select  * from WORKER";
 8         Connection conn = null;
 9         Statement stmt = null;
10                 ResultSet rs = null;
11         try {
12             Class.forName("com.mysql.jdbc.Driver");
13             conn = DriverManager.getConnection(url, user, psw);
14             stmt = conn.createStatement();
15             rs = stmt.executeQuery(sql);
16             while(rs.next()) {
17               String workerNumber = rs.getString("worker_num");
18                 System.out.println(workerNumber);
19             }
20             
21         } catch (ClassNotFoundException e) {
22             e.printStackTrace();
24         } catch (SQLException e) {
25             e.printStackTrace();
26         }finally {
27             try {
28                 stmt.close();
29                 conn.close();
30             } catch (SQLException e) {
31                 e.printStackTrace();
32             }
33         }
36     }
37 }    

  其中,ResultSet是結果集對象,用來接收查詢的結果,最後從結果集中獲得查詢到的數據,進行輸出。

四、JDBC程式編寫的改進

1.將配置文件與程式分離

      工具類的抽象方法是將一段需要執行多次的代碼抽象出來,形成工具方法。除卻此改進外,JDBC程式還可以利用配置文件,來將配置信息與程式分隔開來(這種方法被稱為軟編碼),這樣能夠避免在修改配置信息的時候修改程式,導致需要大量的對程式的重新測試。

常用的配置文件有兩種類型,一種是.xml文件,另一種是.properties文件。在這裡由於我們需要的配置都是一些二維的基本字元串,所以可以採用.properties文件進行配置。

配置文件如下:

1 #db.properties
2 driver = com.mysql.jdbc.Driver
3 url = jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8
4 username = root
5 password = root

 

2.對可復用代碼的封裝

      仔細想一想JDBC程式的執行過程,會發現有很多操作是每次進行資料庫連接都需要做的:如果我們有幾個需要操作資料庫的類需要連接相同的資料庫並對其執行數據操作,那麼我們就可以把獲得Connection對象的功能抽象出來,形成一個單獨的工具類。具體如下:

 

 1 //工具類的編寫
 2 public class JDBCUtils {
 3     private static String driverClass;
 4     private static String url;
 5     private static String userName;
 6     private static String passWord;
 7     static {
       //對資源文件的讀取
8 Properties p = new Properties(); 9 try { 10 p.load(JDBCUtils.class.getResourceAsStream("db.properties")); 11 } catch (IOException e) { 12 e.printStackTrace(); 13 } 14 driverClass = p.getProperty("driver"); 15 url = p.getProperty("url"); 16 userName = p.getProperty("username"); 17 passWord = p.getProperty("password"); 18 try { 19 Class.forName(driverClass); 20 } catch (ClassNotFoundException e) { 21 e.printStackTrace(); 22 } 23 } 24 public static Connection getConnection(){ 25 Connection conn = null; 26 try { 27 conn = DriverManager.getConnection(url, userName, passWord); 28 } catch (SQLException e) { 29 e.printStackTrace(); 30 } 31 return conn; 32 } 33 public static void closeAll(ResultSet result, Statement stmt, Connection conn) { 34 try { 35 result.close(); 36 } catch (SQLException e) { 37 e.printStackTrace(); 38 } 39 try { 40 stmt.close(); 41 } catch (SQLException e) { 42 e.printStackTrace(); 43 } 44 try { 45 conn.close(); 46 } catch (SQLException e) { 47 e.printStackTrace(); 48 } 49 } 50 public static void closeAll(PreparedStatement stmt, Connection conn) { 51 try { 52 stmt.close(); 53 } catch (SQLException e) { 54 e.printStackTrace(); 55 } 56 try { 57 conn.close(); 58 } catch (SQLException e) { 59 e.printStackTrace(); 60 } 61 } 62 }

  工具類的編寫中,我們用到了static塊,此處static塊中包含的部分是只需要在類載入的時候執行的類,同時們把工具方法設置成靜態方法,方便調用。

3.改進後的JDBC程式

 1 public class NewGetWorker {
 2     public static void main(String[] args) {
 3         Connection conn = null;
 4         Statement stmt = null;
 5         ResultSet result = null;
 6         String sql = "select * from WORKER";
 7         conn = JDBCUtils.getConnection();
 8         try {
 9             stmt = conn.createStatement();
10             result = stmt.executeQuery(sql);
11             while(result.next()) {
12                 String workerNum = result.getString("worker_num");
13                 String workerName = result.getString("worker_name");
14                 String workerAddress = result.getString("worker_address");
15                 String workerLevel = result.getString("worker_level");
16                 System.out.println(workerNum + " " + workerName + " " + workerAddress + " " + workerLevel);
17             }
18         } catch (SQLException e) {
19             e.printStackTrace();
20         }finally {
21             JDBCUtils.closeAll(result, stmt, conn);
22         }
23         
24     }
25 }

  由改進後的程式中可以看到,我們可以直接調用工具類中的方法獲取連接對象,同時在finally塊中調用工具類的close方法對對象進行關閉,這樣做有效的增加了代碼的復用性。

五、總結

      JDBC是Java提供的一套與資料庫進行連接的API的集合。利用這些API,已經可以滿足日常開發中Java程式連接資料庫的需求。關於JDBC的內容遠不止於這一篇博文的介紹,還有很多後續知識的介紹。相信看過了這篇博文,大家會對JDBC程式的編寫已有了初步的瞭解,後續還會寫更多文章進行介紹。

ps.博主也是正在學習路上的菜鳥,有想一起學習的小伙伴歡迎交流哈。


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

-Advertisement-
Play Games
更多相關文章
  • 摘要: Web.config的讀取 對於Web.config的讀取大家都很屬性了。平時我們用得比較多的就是appSettings節點下配置。如: 我們對應的代碼是: 是的,很簡單、很方便、很清晰。可以總感覺缺少那麼一點“面向對象”的感覺。少還無所謂,如果幾十個上百個呢?我們是不是可以考慮分類定義,如... ...
  • 現象:panel1和panel2或更多panel,疊放在一起,panel和panel2是同一層次的。panel1和panel2切換時只能顯示一個panel,如何切換呢? ...
  • 昨天看了一天的ajax,今天又看了兩個小時,終於弄出來個門道,其實ajax不是難,不是枯燥,而是自己不會用,這是根本所在 下麵分享學習經驗,以下是我程式代碼的下載地址:http://vdisk.weibo.com/s/BQ2aD 或者這個地址 http://download.csdn.net/det ...
  • 面向對象是一種開發思想,最應該記住的一句話是萬物皆對象。為了讓程式更好的被理解和編寫,把現實生活中描述事物的方式和思路融合進入,就成了面向對象的思想。把生活中的事物融合進程式中那麼就需要描述,描述分為特征和行為兩方面,而不同類別的對象特征和行為具有巨大的差異,為了更好的制定描述每一類事物的方式,那麼 ...
  • 在網上看到別人的代碼,寫下來留著看,歡迎各位指教,有沒有工廠模式的學習資料啊,留下給小弟學習學習. 首先寫個Model類,實現業務實體,我的比較簡單,只有三個欄位 View Code 1 public class LoginModel 2 { 3 #region 4 5 private int _A ...
  • 背水一戰 Windows 10 之 MVVM(Model-View-ViewModel): 通過 Binding 或 x:Bind 結合 Command 實現,通過非 ButtonBase 觸發命令 ...
  • .NET Core / ASP.NET Core 1 RTM發佈兩周後,社區也很積極,收到了非常多的反饋,上周五微軟的scott Hunter 在dotnet團隊官方博客上發佈了.NET Core全新的路線圖 https://blogs.msdn.microsoft.com/dotnet/2016/ ...
  • /// <summary> /// 把dataset數據轉換成json的格式 /// </summary> /// <param name="ds">dataset數據集</param> /// <returns>json格式的字元串</returns> public static string G ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...