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 的组合在需要轻量级、快速部署的场景中表现卓越,尤其适合中小型项目和本地化应用开发。建议读者通过实际案例反复练习,逐步深入理解数据库与编程语言的协同工作原理,最终实现高效、可靠的代码设计。

最新发布