SQLite – Java(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
在现代软件开发中,SQLite – Java 的组合因其轻量级、易集成和高效性,成为许多中小型项目和本地化应用的首选技术栈。无论是构建个人工具、移动应用后端,还是快速验证业务逻辑,SQLite 与 Java 的协同工作都能提供灵活且可靠的解决方案。本文将从基础到进阶,通过案例与代码示例,系统性地讲解如何在 Java 环境中高效使用 SQLite 数据库,帮助开发者快速掌握这一技术组合的核心能力。
一、环境搭建与依赖配置
1.1 SQLite 数据库简介
SQLite 是一个嵌入式关系型数据库,它将整个数据库存储在一个文件中,无需单独运行服务进程。这种设计使其非常适合需要轻量级存储的场景。
1.2 Java 项目集成 SQLite
要在 Java 项目中使用 SQLite,需引入其 JDBC 驱动依赖。对于 Maven 项目,可在 pom.xml
中添加以下配置:
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.42.0.0</version>
</dependency>
1.3 验证连接
编写一个简单的测试类,尝试连接 SQLite 数据库文件:
import java.sql.*;
public class SQLiteTest {
public static void main(String[] args) {
String url = "jdbc:sqlite:my_database.db";
try (Connection conn = DriverManager.getConnection(url)) {
System.out.println("成功连接到 SQLite 数据库!");
} catch (SQLException e) {
System.out.println("连接失败: " + e.getMessage());
}
}
}
运行此代码后,若输出“成功连接”,则说明环境配置完成。
二、核心概念与操作流程
2.1 数据库连接(Connection)
在 Java 中,数据库操作的第一步是获取 Connection
对象,它类似于“门卫”,控制着数据库的访问权限。通过 DriverManager.getConnection(url)
方法即可创建连接。
2.2 SQL 语句执行器(Statement)
Statement
对象负责执行静态 SQL 语句,例如:
String sql = "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)";
try (Statement stmt = conn.createStatement()) {
stmt.execute(sql);
System.out.println("表创建成功");
}
2.3 结果集(ResultSet)
当执行查询语句时,Statement
会返回 ResultSet
对象,它如同“数据包裹”,封装了数据库返回的所有行和列。遍历结果集的示例如下:
String query = "SELECT * FROM users WHERE age > 20";
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query)) {
while (rs.next()) {
System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name"));
}
}
三、CRUD 操作实战
3.1 创建数据表(Create)
通过 CREATE TABLE
语句定义表结构:
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price REAL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
3.2 插入数据(Insert)
使用 PreparedStatement
防止 SQL 注入,例如:
String insertSql = "INSERT INTO products (name, price) VALUES (?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(insertSql)) {
pstmt.setString(1, "笔记本电脑");
pstmt.setDouble(2, 899.99);
pstmt.executeUpdate();
}
3.3 查询数据(Read)
结合 WHERE
条件筛选记录:
String selectSql = "SELECT * FROM products WHERE price > 500";
try (PreparedStatement pstmt = conn.prepareStatement(selectSql);
ResultSet rs = pstmt.executeQuery()) {
// 遍历结果集
}
3.4 更新与删除(Update & Delete)
更新操作示例:
String updateSql = "UPDATE products SET price = ? WHERE id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(updateSql)) {
pstmt.setDouble(1, 999.99);
pstmt.setInt(2, 1);
pstmt.executeUpdate();
}
删除操作与更新类似,只需将 UPDATE
替换为 DELETE
。
四、事务管理与异常处理
4.1 事务的重要性
事务(Transaction)确保多个操作的原子性,例如银行转账:若 A 转账给 B 失败,需保证 A 的余额未减少且 B 的余额未增加。
4.2 使用事务的代码示例
try {
conn.setAutoCommit(false); // 关闭自动提交
String sql1 = "UPDATE accounts SET balance = balance - 100 WHERE id = 1";
String sql2 = "UPDATE accounts SET balance = balance + 100 WHERE id = 2";
PreparedStatement pstmt1 = conn.prepareStatement(sql1);
PreparedStatement pstmt2 = conn.prepareStatement(sql2);
pstmt1.executeUpdate();
pstmt2.executeUpdate();
conn.commit(); // 提交事务
} catch (SQLException e) {
conn.rollback(); // 回滚事务
throw e;
} finally {
conn.setAutoCommit(true); // 恢复默认设置
}
五、连接池与性能优化
5.1 为何需要连接池?
频繁创建和关闭数据库连接会消耗资源。连接池(如 HikariCP)通过复用连接提升性能,类比“共享汽车”比每次租车更高效。
5.2 配置 HikariCP
添加依赖后,配置代码如下:
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:sqlite:my_database.db");
config.setMaximumPoolSize(10); // 最大连接数
HikariDataSource ds = new HikariDataSource(config);
使用时通过 ds.getConnection()
获取连接。
5.3 性能优化技巧
- 索引优化:为高频查询字段添加索引:
CREATE INDEX idx_product_name ON products(name);
- 预编译语句:复用
PreparedStatement
对象减少解析时间。 - 批量操作:批量插入数据可显著提升速度:
String batchSql = "INSERT INTO logs (message) VALUES (?)"; try (PreparedStatement pstmt = conn.prepareStatement(batchSql)) { for (String msg : messages) { pstmt.setString(1, msg); pstmt.addBatch(); } pstmt.executeBatch(); }
六、实际案例:学生管理系统
6.1 需求分析
构建一个简单的学生信息管理系统,包含增删改查功能。
6.2 数据库设计
CREATE TABLE students (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
grade TEXT,
enrollment_date DATE
);
6.3 Java 实现代码
public class StudentDAO {
private Connection conn;
public StudentDAO(Connection conn) {
this.conn = conn;
}
public void addStudent(String name, int age, String grade) {
String sql = "INSERT INTO students (name, age, grade) VALUES (?, ?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, name);
pstmt.setInt(2, age);
pstmt.setString(3, grade);
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 其他方法(查询、更新、删除)类似上述模式
}
七、常见问题与解决方案
7.1 数据库文件未找到
确保路径正确,若使用相对路径,文件会生成在项目根目录。可改为绝对路径或检查代码中的 URL 配置。
7.2 SQL 语法错误
使用 SQLite 官方工具(如 DB Browser for SQLite)预验证 SQL 语句,避免因语法问题导致的运行时错误。
7.3 性能下降问题
检查是否因缺少索引或未关闭连接导致资源泄漏。使用连接池和批量操作可缓解此类问题。
结论
通过本文的讲解,读者已掌握如何在 Java 项目中高效使用 SQLite 数据库,包括环境配置、核心操作、事务管理及性能优化策略。SQLite – Java 的组合在需要轻量级、快速部署的场景中表现卓越,尤其适合中小型项目和本地化应用开发。建议读者通过实际案例反复练习,逐步深入理解数据库与编程语言的协同工作原理,最终实现高效、可靠的代码设计。