今天要學的是 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 點重新整理,確認有無更新