Android Studio:APP 使用 JDBC 連接 MySQL 資料庫並讀取指定資料表中所有資料

2019/10/05 18,091 7 軟體應用 , 行動平台 , 程式設計 , 資料庫 , Android , JAVA , APP開發

今天是我這段時間心情最差的一天,但也因為不斷的失敗,晚間終於研究出來這篇文章的成果,網上關於 Android APP 要使用 JDBC 直接連接 MySQL 資料庫並取出資料的完整性文章並不存在,大多文章都是一個部分而已,它會用到非常多觀念,複雜度頗高,但做出來的東西卻很簡單,我希望這次用單篇文章就能一次把所有步驟列出,讓大家可以在最短的時間為自己開發的 APP 使用 JDBC 連接 MySQL 資料庫並讀取指定資料表中所有資料,這樣後續要做其他資料庫的應用就相對簡單非常多!這是開頭,非常關鍵的一個瓶頸點,相信不少人卡關於此,希望萌芽網頁可以幫助到更多人。我採用 Android Studio 作為開發者工具。

這邊稍微解釋一下,因為 APP 主要是離線功能為主,所以一旦要連上網路並顯示資訊,就要動用到所謂的執行緒(Thread),避免 APP 為了等待網路資源導致整體延遲。需要用到網路的執行緒一般稱為「工作者執行緒」,我們會在內連接資料庫並取得需要的資料,但是若要將這些資料顯示在 APP 上,這就會用到所謂的「UI 執行緒」,但是「工作者執行緒」是不可以直接執行「UI 執行緒」所執行的 UI 工作,需要透過 View.post(Runnable) 的方法來把「工作者執行緒」內需要動到 UI 的部分包起來,而這段包起來的程式則由 UI 執行緒操縱,這樣就不會崩潰(Crash)了!實際上執行起來就會是先顯示預設的文字,可能是「連線中」吧?然後等到資料從網路取得後才顯示出來。這邊就跟網頁前端很不一樣,站長學到不少。

事先請先建立一個 APP 要連線的 MySQL 資料庫,這邊推薦一個線上測試用的 MySQL 資料庫「db4free」,免費註冊馬上啟用!資料庫內要有一個資料表名為「test」,然後有兩個欄位,分別是「id」與「name」,然後存放多筆資料進去,到時候就可以取出這些資料啦!如果不想要手動建立,這邊也貼心提供 SQL 碼給各位快速生成資料:

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `id` int(11) NOT NULL,
  `name` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO `test` (`id`, `name`) VALUES
(1, 'XXX'),
(2, 'OOO');
COMMIT;

👋 所有步驟:

👉 第一步:創建一個全新的空專案
👉 第二步:XML(UI)的確認
👉 第三步:libs 目錄中安裝 JDBC 驅動
👉 第四步:使 APP 取得連接網路的權限
👉 第五步:建立「MysqlCon.java」,撰寫有關資料庫連線的程式
👉 第六步:聚焦「MainActivity.java」,執行緒與 UI 顯示資訊
👉 第七步:模擬器測試、實體手機測試

👉 第一步:創建一個全新的空專案 ⏏️

我們使用 JAVA 作為預設撰寫 APP 的程式語言,建立時選擇「空活動(Empty Activity)」模板,可以參考《Android Studio:下載、安裝與創建一個基於 Kotlin 語言的 APP 專案》文章的說明創建專案,不過請自行把 Kotlin 轉 JAVA(懶得再寫一篇 😛)。

👉 第二步:XML(UI)的確認 ⏏️


▲ 基本上創建好的空專案會有個 TextView 元件在畫面正中央,上頭有「Hello World!」的字樣,請確認它有 ID,沒有的話幫它設一個 ID,我是設置成 android:id="@+id/text_view",因為接下來我們從 MySQL 資料庫取出的資料表資料就會顯示在這個 UI 元件上。

整體上 UI 都是用現成的,因為這篇文章的目標也只是抓資料而已,UI 根本不需要去改它。

👉 第三步:libs 目錄中安裝 JDBC 驅動 ⏏️


▲ 因為是 JAVA 程式要連接 MySQL 資料庫,所以 JDBC 驅動是必要的,請至官方網站下載,建議使用舊版比較不會錯,下載後是個壓縮檔,解壓縮後找根目錄內的「📄 mysql-connector-java-x.x.xx-bin.jar」,「x.x.xx」是版本號碼,舉例來說我就是拿「📄 mysql-connector-java-5.1.48-bin.jar」來用,請將這個檔案放入「📁 專案目錄/app/libs」中,這樣就可以使用驅動了!至於為什麼是放在 📁 libs 目錄中,大家可以到 APP 的 build.gradle 中看到以下設定:

implementation fileTree(dir: 'libs', include: ['*.jar'])

這是預設的路徑,因此驅動都放在 📁 libs 目錄中。

👉 第四步:使 APP 取得連接網路的權限 ⏏️


▲ 為了讓 APP 取得網路連線的權限,請打開「AndroidManifest.xml」(在 📁 manifest 目錄中),並在 <manifest> 到 </manifest> 中加入:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

這樣就可以自動取得網路連線的權限囉!

👉 第五步:建立「MysqlCon.java」,撰寫有關資料庫連線的程式 ⏏️


▲ 建立一個「MysqlCon.java」,裡面撰寫有關資料庫連線與讀取資料相當的 JAVA 程式,最後會在「第六步」使用執行緒來跑這裡的程式碼,這樣就可以連接指定 MySQL 資料庫,並且從中取得指令資料表內所有筆資料。

※ 請將「MysqlCon.java」建立在「📁 java/專案名稱」下,也就是 📄 MainActivity.java 旁。

接下來就直接秀出所有的 JAVA 程式碼,稍後再簡短敘述:

package com.example.mysql_connect;

import android.util.Log;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MysqlCon {

    // 資料庫定義
    String mysql_ip = "資料庫IP";
    int mysql_port = 3306; // Port 預設為 3306
    String db_name = "資料庫名稱";
    String url = "jdbc:mysql://"+mysql_ip+":"+mysql_port+"/"+db_name;
    String db_user = "使用者名稱";
    String db_password = "使用者密碼";

    public void run() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Log.v("DB","加載驅動成功");
        }catch( ClassNotFoundException e) {
            Log.e("DB","加載驅動失敗");
            return;
        }

        // 連接資料庫
        try {
            Connection con = DriverManager.getConnection(url,db_user,db_password);
            Log.v("DB","遠端連接成功");
            }catch(SQLException e) {
            Log.e("DB","遠端連接失敗");
            Log.e("DB", e.toString());
        }
    }

    public String getData() {
        String data = "";
        try {
            Connection con = DriverManager.getConnection(url, db_user, db_password);
            String sql = "SELECT * FROM test";
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);

            while (rs.next())
            {
            String id = rs.getString("id");
            String name = rs.getString("name");
            data += id + ", " + name + "\n";
            }
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return data;
    }


}

最前面的 package 與 import 其實不用自己先打(複製)進去程式檔內,因為接下來的程式 IDE(Android Studio) 會自動偵測缺少套件,就會叫你用鍵盤 Alt + Enter 自動引入,非常方便!

資料庫定義部分要先把資料庫 IP、資料庫 Port、資料庫名稱、資料庫 Url、使用者名稱與密碼定義好,接著在 run() 方法中測試 JDBC 驅動是否運作、MySQL 資料庫是否正常連線。這邊都會用 Log 來 Debug,在 Android Studio 中可以在下方 Logcat 中查看。

getData() 方法是要取得 test 資料表中的每筆資料,因此 JAVA 中就有敘述欄位的取出與匯出格式,最後以 String data 回傳。

👉 第六步:聚焦「MainActivity.java」,執行緒與 UI 顯示資訊 ⏏️


▲ 接下來要來寫主程式啦!聚焦「MainActivity.java」,我們要用執行緒來執行剛剛寫好的「MysqlCon.java」,並用前文所提到的方式來操作 UI,讓 UI 可以顯示來自網路的資訊,首先先告訴各位接下來要寫程式的區塊:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // 寫在這裡
}

接下來就是完整的執行緒 JAVA 程式碼:

final TextView text_view = (TextView) findViewById(R.id.text_view);

        new Thread(new Runnable(){
            @Override
            public void run(){
                MysqlCon con = new MysqlCon();
                con.run();
                final String data = con.getData();
                Log.v("OK",data);
                text_view.post(new Runnable() {
                    public void run() {
                        text_view.setText(data);
                    }
                });

            }
        }).start();

第一行要先建立 text_view 元件,接下來才能操作它來顯示資料。

con.run(); 就是執行「MysqlCon.java」中的 run() 方法;con.getData(); 就是執行「MysqlCon.java」中的 getData() 方法。Log.v("OK",data); 可在 Android Studio 中下方 Logcat 中查看取出的資料。text_view.post(new Runnable() { ... } 部分就是前文提到的 View.post(Runnable) ,也就是把「工作者執行緒」內需要動到 UI 的部分包起來,而這段包起來的程式則由 UI 執行緒操縱,也就是程式碼中的 text_view.setText(data);,這就可以替換掉原來「Hello World!」的字樣。

👉 第七步:模擬器測試、實體手機測試 ⏏️

這邊可以參考這兩篇文章:

📝 Android Studio:建立虛擬設備(模擬器)、運行開發中的 APP 在模擬器上
📝 Android Studio:將開發中的 APP 安裝到手機上教學(USB 偵錯模式)


▲ 模擬器跑剛剛寫好的 APP,打開後會先顯示預設的「Hello World!」字樣。

▲ 接著下方 Logcat 中出現連接成功與資料,模擬器中的 APP 也會跟著顯示從 MySQL 資料庫中取出的資料。

▲ 實際手機上執行 APP 也是一樣,先顯示預設文字,等抓到資料再把預設文字替換掉。

此篇文章為筆記文,可能有不少錯誤,需要特別注意!但還是歡迎大家參考 😊。

《延伸篇:Android Studio:APP 使用 JDBC 連接 MySQL 資料庫並寫入資料後更新畫面》

贊助廣告 ‧ Sponsor advertisements

留言區 / Comments

萌芽論壇