天天看點

怎麼使Java和MySQL資料通信?JDBC應該怎麼用?| Java常用架構(一)

作者:老K玩代碼

歡迎來到全網最完整的Java系列教程!!!

本教程将包含基礎知識、進階知識、常用架構等,循序漸進地分享Java中必須掌握的知識和技術。跟着老K的教程每天學習一點,你會發現入門Java沒有想象中那麼難。

說到Java的常見架構,JDBC一定是榜上有名。雖然大多數人會使用mybatis來做Java應用和MySQL之間的資料互動,但了解JDBC依然是一個Java工程師必備的基本功。

本期教程内容,我們就要通過實戰,向大家介紹一下JDBC這個架構。

怎麼使Java和MySQL資料通信?JDBC應該怎麼用?| Java常用架構(一)

如果你正在學習Java,不妨收藏這篇文章,或者關注我,定期收獲與Java有關的知識和項目資訊!

1. 準備工作

1.1 下載下傳安裝JDK和IDEA

這應該是Java基礎中的基礎了,就不做詳細展開了,有需要的小夥伴可以到我之前的文章了解相關知識:

全網最完整的免費java教程講義(一)——java配置和安裝

怎麼使Java和MySQL資料通信?JDBC應該怎麼用?| Java常用架構(一)

1.2 下載下傳mysql-connector-j

JDBC是Java DataBase Connectivity的首字母縮寫,它是MySQL對各個平台、語言的驅動程式,具體檔案包可以從MySQL的官網下載下傳:https://dev.mysql.com/downloads/。

我們學習java,需要下載下傳和安裝的自然是java的版本——connector/j

怎麼使Java和MySQL資料通信?JDBC應該怎麼用?| Java常用架構(一)

點選圖中相應連結,在新頁面中,運作系統選擇Ubuntu Linux

怎麼使Java和MySQL資料通信?JDBC應該怎麼用?| Java常用架構(一)

在重新整理後的頁面中,選擇合适的安裝包:

怎麼使Java和MySQL資料通信?JDBC應該怎麼用?| Java常用架構(一)
重要說明: 下載下傳版本不是越新越好,新版本可能會存在相容和解壓問題,如果遇到打不開,可以換另外幾個版本DEB Package 試試。

1.3 下載下傳mysql-connector-j

我們之後會用到的JDBC架構就在這個mysql-connector-j的安裝包裡。

用解壓工具,将jar包解壓,找到該路徑下的檔案./data.jar/./usr/share/java/mysql-connector-j-8.0.xx.jar

将該路徑下的mysql-connector-j-8.0.xx.jar檔案複制到java項目下即可。

一般我們會在項目根目錄下建立一個"lib"檔案夾,将mysql-connector-j-8.0.xx.jar包拷貝到該檔案夾下

1.4 引用綁定jdbc

本例以IDEA編譯器的配置為例,其它平台的引用綁定,我會在後續的文章裡逐漸更新。有需要的小夥伴可以先關注我哦!

在IDEA中建立項目後,在菜單欄裡選擇File->Project Structure

怎麼使Java和MySQL資料通信?JDBC應該怎麼用?| Java常用架構(一)

依上圖逐個點選按鈕,點選JARs or Directories ,打開資料總管視窗,找到我們剛才從MySQL官網下載下傳下來的mysql-connector-j-8.0.xx.jar,點選确定完成引用和綁定。

1.5 MySQL資料庫

這裡僅作為提示:後續的内容是建立在配置好MySQL資料庫的基礎上。

由于MySQL本身就是一項獨立技術,是以在此不展開介紹。

有需要的話,我會在後續的文章介紹MySQL,或者專門開辟一個關于MySQL知識分享的專欄,大家可以關注一下。

2. 代碼實作

2.1 基本邏輯實作

完成了上述準備工作,我們就可以開始落實代碼了。

JDBA的使用,本質上和我之前I/O檔案讀寫的邏輯是一緻的,可以參考:「Java進階」I/O操作必備知識點:位元組流讀寫執行個體講解

  1. 執行個體化驅動和資料庫連接配接
  2. 查詢對象
  3. 關閉連接配接

在IDEA項目中,建立一個檔案,并将下述代碼複制進去,運作學習:

import java.sql.*;

public class JDBCDemo {
    public static void main(String[] args) {
        // 1. 執行個體化資源
        // 1.1 注冊JDBC驅動
        Class.forName("com.mysql.cj.jdbc.Driver");
        // 1.2 建立資料庫連接配接執行個體
        String url = "jdbc:mysql://localhost:3306/database?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
        String user = "root";
        String pswd = "root";
        Connectionconn = DriverManager.getConnection(url, user, pswd);

        // 2. 查詢對象
        // 2.1 執行個體話查詢聲明,以及查詢語句
        Statement st = conn.createStatement();
        String query = "select * from table1";
        ResultSet rs = st.executeQuery(query);
        // 2.2. 查詢結果
        while (rs.next()) {
            int uid = rs.getInt(1);
            System.out.println(uid);
        }
        // 3. 關閉連接配接,釋放資源
        conn.close();
    }
}           

說明:

  • 上例中的url、user、pswd是連接配接資料庫的參數,分别是路徑、使用者名、密碼;
  • 稍微對上例中的url(資料庫路徑)的文法做一下解釋:驅動名:SQL方言名://伺服器:端口号/資料庫名?連接配接參數,一般連接配接參數按照上例寫即可;
  • String query是MySQL查詢語句,請結合自己的MySQL資料庫編寫查詢語句。

2.2 完整代碼實作

上例中的代碼,沒有做異常處理,為的是減低代碼的閱讀難度,幫助小夥伴理清JDBC執行個體的脈絡,完整代碼應該是這樣的:
import java.sql.*;

public class JDBCDemo {
    public static void main(String[] args) {
        Connection conn = null;

        try {
            // 1. 執行個體化資源
            // 1.1 注冊JDBC驅動
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 1.2 建立資料庫連接配接執行個體
            String url = "jdbc:mysql://localhost:3306/database?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
            String user = "root";
            String pswd = "root";
            conn = DriverManager.getConnection(url, user, pswd);

            // 2. 查詢對象
            // 2.1 執行個體話查詢聲明,以及查詢語句
            Statement st = conn.createStatement();
            String query = "select * from table1";
            ResultSet rs = st.executeQuery(query);
            // 2.2. 查詢結果
            while (rs.next()) {
                int uid = rs.getInt(1);
                System.out.println(uid);
            }
        } catch (ClassNotFoundException | SQLException e) {
            throw new RuntimeException(e);
        } finally {
            // 3. 關閉連接配接,釋放資源
            try {
                if (conn != null & !conn.isClosed()) {
                    conn.close();
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

    }
}           

說明:

finally代碼塊中的if判斷,是避免conn空指針異常導緻關閉連接配接失敗的情況。

2.3 防SQL注入攻擊

不過,上述代碼會有一定風險,可能會有SQL注入攻擊的風險。 為了避免SQL注入攻擊的風險,我們隻需要做一個調整即可,詳見下例:
import java.sql.*;

public class JDBCDemo {
    public static void main(String[] args) {
        Connection conn = null;

        try {
            // 1. 執行個體化資源
            // 1.1 注冊JDBC驅動
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 1.2 建立資料庫連接配接執行個體
            String url = "jdbc:mysql://localhost:3306/database?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
            String user = "root";
            String pswd = "root";
            conn = DriverManager.getConnection(url, user, pswd);

            // 2. 查詢對象
            // 2.1 執行個體話查詢聲明,以及查詢語句
            String query = "select * from table1";
            PreparedStatement st = conn.prepareStatement(query);
            ResultSet rs = st.executeQuery(query);
            // 2.2. 查詢結果
            while (rs.next()) {
                int uid = rs.getInt(1);
                System.out.println(uid);
            }
        } catch (ClassNotFoundException | SQLException e) {
            throw new RuntimeException(e);
        } finally {
            // 3. 關閉連接配接,釋放資源
            try {
                if (conn != null & !conn.isClosed()) {
                    conn.close();
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

    }
}           

說明:

  • 在這裡,我們将Statement st = conn.createStatement();更改為PreparedStatement st = conn.prepareStatement(query);即可;
  • PreparedStatement是Statement的子類,但它會對傳入的查詢語句進行解析,然後再向資料庫發起請求,進而避免SQL注入攻擊的風險。

關于JDBC的知識點和執行個體示範就先分享到這裡。

本期的内容較多,建議可以收藏這篇文章,多讀幾遍慢慢消化。

如果你對老K分享的内容有任何疑問,歡迎随時在評論區留言或者私信我。

正在學習的小夥伴記得給老K一個贊哦,你的支援是我持續輸出課程内容最大的動力!

怎麼使Java和MySQL資料通信?JDBC應該怎麼用?| Java常用架構(一)

閱讀推薦

我也分享過關于如何學習Java的文章,有需要的小夥伴可以點選下方連結擷取:

IT大佬推薦!學習Java的最優路徑 分享多個階段的學習資源 建議收藏

結束語

我是專注于開發領域的@老K玩代碼,會持續生産關于如何學習程式設計語言的優質内容。

如果你想學習Java程式設計,或者想精進你的Java程式設計能力,可以關注我。

如果你對開發、程式設計有任何疑問或者有想了解的内容,而我暫時沒有寫到的,也歡迎随時來找我聊聊。

#頭條創作挑戰賽#

繼續閱讀