Java 學習記錄116 — JDBC and SQLite GUI Browser

張小雄
8 min readFeb 2, 2022

--

今天要學的是 JDBC

下載 sqlite-jdbc-3.15.1.jar :https://repo1.maven.org/maven2/org/xerial/sqlite-jdbc/3.15.1/

下載 DB Browser for SQLite:https://sqlitebrowser.org/dl/

創好專案後,要先設定 JDBC 環境

Intellij 左上 File 的 Project Structure 的 Libraies 點 + 號,把剛剛下載的 sqlite-jdbc-3.15.1.jar 連結起來

Main.java

package testDB;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Main { public static void main(String[] args) {
try{
// Win10 url, the url is this project location to put database
Connection conn = DriverManager.getConnection("jdbc:sqlite:C:\\software\\JetBrains\\IdeaProjects\\java-the-complete-java-developer-course\\chapter19\\src\\testDB\\testjava.db");
// // old version of JDBC need this
// Class.forName("org.sql.JDBC")
}catch (SQLException e){
System.out.println("Something went wrong " + e.getMessage());
}
}
}

輸出結果:

運行完看左側有沒有多了一個 testjava.db,有的話就成功了

修改 Main.java

package testDB;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Main { public static void main(String[] args) {
try {
// Win10 url, the url is this project location to put database
Connection conn = DriverManager.getConnection("jdbc:sqlite:C:\\software\\JetBrains\\IdeaProjects\\java-the-complete-java-developer-course\\chapter19\\src\\testDB\\testjava.db");
Statement statement = conn.createStatement();
statement.execute("CREATE TABLE contacts(name TEXT, phone INTEGER , email TEXT)");
} catch (SQLException e) {
System.out.println("Something went wrong " + e.getMessage());
}
}
}

輸出結果:

打開剛下載的 DB Browser (SQLite) 到專案位置把剛創的 db 打開

看看裡面有沒有新增了這張 contacts 表

Tim 老師說:若是使用多線程的情況,純手動關閉資料庫的話,萬一遺漏了哪個忘記關閉,那就容易出問題。

手動關閉版本

package testDB;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Main { public static void main(String[] args) {
try {
// Win10 url, the url is this project location to put database
Connection conn = DriverManager.getConnection("jdbc:sqlite:C:\\software\\JetBrains\\IdeaProjects\\java-the-complete-java-developer-course\\chapter19\\src\\testDB\\testjava.db");
Statement statement = conn.createStatement();
statement.execute("CREATE TABLE contacts(name TEXT, phone INTEGER , email TEXT)");

statement.close();
conn.close();
} catch (SQLException e) {
System.out.println("Something went wrong " + e.getMessage());
}
}
}

手動的話不要忘記加上 close()

而且順序不能搞錯

conn 不能比 statement 先關閉,不然就會報錯

更新 Main.java

package testDB;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Main { public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection("jdbc:sqlite:C:\\software\\JetBrains\\IdeaProjects\\java-the-complete-java-developer-course\\chapter19\\src\\testDB\\testjava.db");
Statement statement = conn.createStatement()) {

statement.execute("CREATE TABLE contacts(name TEXT, phone INTEGER , email TEXT)");
} catch (SQLException e) {
System.out.println("Something went wrong " + e.getMessage());
}
}
}

用 try-with-resource 的寫法更好,使用完後系統會自動關閉

執行一次不會報錯,但如果執行第二次

輸出結果:

Something went wrong [SQLITE_ERROR] SQL error or missing database (table contacts already exists)

系統會說這張表已經存在

解決辦法很簡單

statement.execute("CREATE TABLE IF NOT EXISTS contacts(name TEXT, phone INTEGER , email TEXT)");

加上 IF NOT EXISTS 即可,不存在才創建

接著新增一筆資料

statement.execute("INSERT INTO contacts(name,phone,email) VALUES ('Tim',6545678,'tim@email.com') ");

輸出結果:

切到 DB Browser 後,點打開資料庫下面的 Browse Date 就可以看到這筆資料了

Browse Date 下面有一個重新整理的小圖,資料有變動時點一下就可更新,不用關掉重連資料庫

Tim 老師補充說:

若是把 auto commit 關掉,即使有更改資料,但運行程式後資料庫也不會更新

conn.setAutoCommit(false);

JDBC的預設是自動更新,可能跟部份資料庫不一樣

再新增三筆資料

statement.execute("INSERT INTO contacts(name,phone,email) VALUES ('Joe',45632,'joe@anywhere.com') ");
statement.execute("INSERT INTO contacts(name,phone,email) VALUES ('Jane',4829484,'jane@somewhere.com') ");
statement.execute("INSERT INTO contacts(name,phone,email) VALUES ('Fido',9038,'dog@email.com') ");

輸出結果:

去 DB Browser 點重新整理,確認有無新增

更新一筆資料

statement.execute("UPDATE contacts SET phone=5566789 WHERE name='Jane'");

輸出結果:

去 DB Browser 點重新整理,確認有無更新

Tim 老師補充:更新跟刪除時,要記得加上 WHERE 不然所有資料都會一起更新或刪除

刪除一筆資料

statement.execute("DELETE FROM contacts WHERE name='Joe'");

輸出結果:

去 DB Browser 點重新整理,確認有無更新

上面代碼全都紀錄在我的 Github

--

--