悠悠楠杉
如何用Java操作SQLite数据库Java连接SQLite实例教程
标题: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());
}
}
六、避坑指南
- 连接泄漏:务必使用
try-with-resources确保Connection/Statement自动关闭 - 并发写入:SQLite默认锁机制限制,建议使用
SQLiteConfig.enableWriteAheadLogging()启用WAL模式 - 数据类型:SQLite的
INTEGER对应Java的int,TEXT对应String
通过这套实现,我的工具成功实现了用户配置的本地化管理。SQLite在写入性能上可能不如大型数据库,但对于日均操作量万级以下的场景完全够用,且数据文件可直接拷贝备份,维护成本极低。
