TypechoJoeTheme

至尊技术网

登录
用户名
密码

如何用Java操作SQLite数据库Java连接SQLite实例教程

2025-12-03
/
0 评论
/
1 阅读
/
正在检测是否收录...
12/03

标题:Java与SQLite轻量级数据库实战:从零搭建数据存储方案
关键词:Java SQLite, JDBC连接, 数据库操作, SQLite事务, 轻量级数据库
描述:本文通过完整实例演示Java使用JDBC驱动操作SQLite数据库的全流程,包含环境配置、CRUD操作及事务处理,助力开发者快速实现轻量级数据存储。

正文:
最近在开发一款桌面工具时,我遇到了需要本地存储用户配置数据的需求。考虑到安装便捷性和零配置特性,SQLite这款嵌入式数据库成为了我的首选。与MySQL等需要独立服务的数据库不同,SQLite直接将数据库存储在单一文件中,特别适合中小型应用场景。

一、环境准备

在开始编码前,我们需要通过Maven引入关键依赖:
xml <dependencies> <!-- SQLite JDBC驱动 --> <dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version>3.42.0.0</version> </dependency> </dependencies>

二、建立数据库连接

创建SQLiteConnection工具类封装核心操作:
java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class SQLiteConnection {
private static final String DB_URL = "jdbc:sqlite:config.db";

public static Connection getConnection() throws SQLException {
    try {
        Class.forName("org.sqlite.JDBC");
    } catch (ClassNotFoundException e) {
        throw new RuntimeException("JDBC驱动加载失败", e);
    }
    return DriverManager.getConnection(DB_URL);
}

}
关键点说明
1. Class.forName()显式加载驱动确保兼容性
2. jdbc:sqlite:后接相对路径(也可用绝对路径)
3. 首次连接会自动创建数据库文件

三、数据表初始化

通过initTable()方法确保表结构存在:
java
public static void initTable() {
String sql = "CREATE TABLE IF NOT EXISTS usersettings (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "username TEXT NOT NULL UNIQUE," + "theme VARCHAR(20) DEFAULT 'light'," + "lastmodified TIMESTAMP DEFAULT CURRENT_TIMESTAMP)";

try (Connection conn = getConnection();
     Statement stmt = conn.createStatement()) {
    stmt.execute(sql);
} catch (SQLException e) {
    System.err.println("表初始化异常:" + e.getMessage());
}

}
注意使用IF NOT EXISTS避免重复创建,AUTOINCREMENT实现自增主键

四、实现CRUD操作

插入数据示例(防SQL注入)
java
public static void insertUser(String username, String theme) {
String sql = "INSERT INTO user_settings(username, theme) VALUES(?,?)";

try (Connection conn = getConnection();
     PreparedStatement pstmt = conn.prepareStatement(sql)) {
    pstmt.setString(1, username);
    pstmt.setString(2, theme);
    pstmt.executeUpdate();
} catch (SQLException e) {
    System.err.println("插入失败:" + e.getMessage());
}

}

查询数据示例
java
public static void queryUsers() {
String sql = "SELECT * FROM user_settings";

try (Connection conn = getConnection();
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery(sql)) {

    while (rs.next()) {
        System.out.printf("ID: %d, 用户: %s, 主题: %s%n",
                rs.getInt("id"),
                rs.getString("username"),
                rs.getString("theme"));
    }
} catch (SQLException e) {
    System.err.println("查询失败:" + e.getMessage());
}

}

五、事务处理实战

批量更新时的事务控制:
java
public static void batchUpdateThemes(Map<String, String> themeMap) {
String sql = "UPDATE user_settings SET theme = ? WHERE username = ?";

try (Connection conn = getConnection()) {
    conn.setAutoCommit(false); // 开启事务

    try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
        for (Map.Entry<String, String> entry : themeMap.entrySet()) {
            pstmt.setString(1, entry.getValue());
            pstmt.setString(2, entry.getKey());
            pstmt.addBatch();
        }
        pstmt.executeBatch();
        conn.commit();
    } catch (SQLException e) {
        conn.rollback();
        System.err.println("事务回滚:" + e.getMessage());
    }
} catch (SQLException ex) {
    System.err.println("连接异常:" + ex.getMessage());
}

}

六、避坑指南

  1. 连接泄漏:务必使用try-with-resources确保Connection/Statement自动关闭
  2. 并发写入:SQLite默认锁机制限制,建议使用SQLiteConfig.enableWriteAheadLogging()启用WAL模式
  3. 数据类型:SQLite的INTEGER对应Java的intTEXT对应String

通过这套实现,我的工具成功实现了用户配置的本地化管理。SQLite在写入性能上可能不如大型数据库,但对于日均操作量万级以下的场景完全够用,且数据文件可直接拷贝备份,维护成本极低。

朗读
赞(0)
版权属于:

至尊技术网

本文链接:

https://www.zzwws.cn/archives/40144/(转载时请注明本文出处及文章链接)

评论 (0)