今天是我這段時間心情最差的一天,但也因為不斷的失敗,晚間終於研究出來這篇文章的成果,網上關於 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 資料庫並寫入資料後更新畫面》
留言區 / Comments
萌芽論壇