首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 操作 SQLite 入門教程:從依賴配置到 CRUD 實戰

     編輯:Java 相關知識

為什麼選擇 SQLite?

  • 零配置:單文件數據庫,無需安裝服務端進程
  • 輕量級:庫大小 < 1MB,適合嵌入式、桌面應用、測試環境
  • 標準 SQL 支援:ACID 事務、索引、觸發器、視圖、部分 ALTER TABLE
  • 跨平台:文件格式跨架構通用,Java/JDBC 無縫接入

環境準備

Maven 依賴 (推薦現代驅動)

<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)

常見坑點

  1. Class.forName 不再需要:JDBC 4.0+ SPI 自動加載,保留兼容無害
  2. Boolean 類型:SQLite 無 Boolean,用 INTEGER 0/1 存儲
  3. 日期時間:建議存儲為 TEXT (ISO8601) 或 INTEGER (Unix timestamp)
  4. 自增主鍵:INTEGER PRIMARY KEY 即為 ROWID 別名,自動分配
  5. 文件鎖定:多進程訪問同一文件需注意鎖超時 (busy_timeout)

總結

SQLite 以零配置、單文件、標準 SQL成為 Java 輕量級數據存儲的首選。配合 xerial sqlite-jdbc 驅動,無需任何原生庫配置即可在 Maven/Gradle 項目中直接使用。掌握 PreparedStatement 參數化、事務控制、WAL 模式優化,即可應對嵌入式、桌面、測試等大多數輕量級場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved