<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
3.45.1.0 <!-- 檢查 MVN Central 最新版 -->
</dependency>
舊教程常用
zentus驅動需手動放 DLL,xerial sqlite-jdbc 已打包原生庫,無需額外配置。
可使用 sqlite3 命令行工具或 SQLite Administrator GUI 創建:
$ sqlite3 test.db
sqlite> CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);
sqlite> INSERT INTO users (name, age) VALUES ('Alice', 25), ('Bob', 30);
sqlite> .quit
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class SQLiteDemo {
private static final String DB_URL = "jdbc:sqlite:test.db"; // 相對路徑或絕對路徑
// 內存數據庫:jdbc:sqlite::memory:
public static void main(String[] args) {
// 1. 單次查詢演示
queryAllUsers();
// 2. 參數化插入 + 事務
addUser("Charlie", 28);
addUser("Diana", 24);
// 3. 批量查詢驗證
queryAllUsers();
}
// 查詢所有用戶
public static void queryAllUsers() {
String sql = "SELECT id, name, age FROM users ORDER BY name";
try (Connection conn = DriverManager.getConnection(DB_URL);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
System.out.println("=== 用戶列表 ===");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.printf("ID: %d, Name: %s, Age: %d%n", id, name, age);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
// 參數化插入 (防 SQL 注入)
public static void addUser(String name, int age) {
String sql = "INSERT INTO users (name, age) VALUES (?, ?)";
try (Connection conn = DriverManager.getConnection(DB_URL);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
conn.setAutoCommit(false); // 開啟事務
try {
pstmt.setString(1, name);
pstmt.setInt(2, age);
int rows = pstmt.executeUpdate();
conn.commit();
System.out.println("插入成功: " + name + " (" + rows + " row)");
} catch (SQLException e) {
conn.rollback();
throw e;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
| 場景 | 方案 |
|---|---|
| 連接池 | HikariCP 支援 SQLite:jdbc:sqlite:test.db + dataSourceClassName=org.sqlite.javax.SQLiteDataSource |
| 並發寫入 | SQLite 寫入串行化,高併發建議遷移 PostgreSQL/MySQL;或啟用 WAL 模式:PRAGMA journal_mode=WAL; |
| 加密 | SQLCipher (SQLite 透明加密擴展),Java 需 sqlcipher-jdbc |
| ORM 整合 | Hibernate/MyBatis 正常支援,方言 org.hibernate.dialect.SQLiteDialect |
| 備份 | 在線備份 API:backup dbname TO 'backup.db'; 或文件複製 (需 WAL 模式下 checkpoint) |
INTEGER PRIMARY KEY 即為 ROWID 別名,自動分配busy_timeout)SQLite 以零配置、單文件、標準 SQL成為 Java 輕量級數據存儲的首選。配合 xerial sqlite-jdbc 驅動,無需任何原生庫配置即可在 Maven/Gradle 項目中直接使用。掌握 PreparedStatement 參數化、事務控制、WAL 模式優化,即可應對嵌入式、桌面、測試等大多數輕量級場景。