DriverManager
建立连接(URL格式:jdbc:sqlite:路径/数据库名.db
),创建Statement
或PreparedStatement
执行SQL操作(增删改查),处理结果集后关闭连接,SQLite无需独立服务,数据存储在单一文件中。准备工作
-
下载JDBC驱动
访问 SQLite JDBC驱动GitHub页面 下载最新版sqlite-jdbc-{version}.jar
或通过Maven添加依赖:<dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version>3.42.0.0</version> <!-- 检查最新版本 --> </dependency>
-
创建SQLite数据库文件
在项目目录中新建数据库文件(如mydatabase.db
),SQLite会自动创建该文件。
核心操作代码示例
连接数据库
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SQLiteDemo { public static void main(String[] args) { String url = "jdbc:sqlite:path/to/mydatabase.db"; // 相对或绝对路径 try (Connection conn = DriverManager.getConnection(url)) { System.out.println("成功连接SQLite数据库"); } catch (SQLException e) { System.err.println("连接失败: " + e.getMessage()); } } }
创建表
String sql = "CREATE TABLE IF NOT EXISTS users (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT NOT NULL," + "email TEXT UNIQUE)"; try (Connection conn = DriverManager.getConnection(url); Statement stmt = conn.createStatement()) { stmt.execute(sql); System.out.println("表创建成功"); } catch (SQLException e) { System.err.println("错误: " + e.getMessage()); }
插入数据(防SQL注入)
String insertSQL = "INSERT INTO users (name, email) VALUES (?, ?)"; try (Connection conn = DriverManager.getConnection(url); PreparedStatement pstmt = conn.prepareStatement(insertSQL)) { pstmt.setString(1, "张三"); // 替换第一个占位符 pstmt.setString(2, "zhangsan@example.com"); pstmt.executeUpdate(); // 执行插入 System.out.println("数据插入成功"); } catch (SQLException e) { System.err.println("插入失败: " + e.getMessage()); }
查询数据
String querySQL = "SELECT id, name, email FROM users"; try (Connection conn = DriverManager.getConnection(url); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(querySQL)) { while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); String email = rs.getString("email"); System.out.println("ID: " + id + ", 姓名: " + name + ", 邮箱: " + email); } } catch (SQLException e) { System.err.println("查询失败: " + e.getMessage()); }
更新与删除数据
// 更新数据 String updateSQL = "UPDATE users SET email = ? WHERE name = ?"; try (PreparedStatement pstmt = conn.prepareStatement(updateSQL)) { pstmt.setString(1, "new_email@example.com"); pstmt.setString(2, "张三"); pstmt.executeUpdate(); } // 删除数据 String deleteSQL = "DELETE FROM users WHERE id = ?"; try (PreparedStatement pstmt = conn.prepareStatement(deleteSQL)) { pstmt.setInt(1, 3); // 删除ID=3的记录 pstmt.executeUpdate(); }
事务处理
try (Connection conn = DriverManager.getConnection(url)) { conn.setAutoCommit(false); // 关闭自动提交 // 执行多个操作 try (PreparedStatement pstmt1 = conn.prepareStatement(insertSQL); PreparedStatement pstmt2 = conn.prepareStatement(updateSQL)) { pstmt1.setString(1, "李四"); pstmt1.executeUpdate(); pstmt2.setString(1, "lisi_new@example.com"); pstmt2.setString(2, "李四"); pstmt2.executeUpdate(); conn.commit(); // 提交事务 } catch (SQLException e) { conn.rollback(); // 回滚事务 System.err.println("事务回滚: " + e.getMessage()); } }
最佳实践
- 资源关闭
使用try-with-resources
自动关闭Connection
,Statement
,ResultSet
,避免内存泄漏。 - 使用PreparedStatement
防止SQL注入攻击,提升代码安全性。 - 异常处理
捕获SQLException
并记录详细错误信息。 - 连接池优化
高频访问场景建议使用连接池(如 HikariCP)。 - 数据库路径
生产环境避免使用相对路径,推荐绝对路径。
常见问题解决
- 驱动类加载问题:
若出现ClassNotFoundException
,检查JAR包是否在类路径中。 - 数据库锁死:
确保操作后关闭连接,避免多线程同时写冲突。 - 文件权限:
确保Java进程有数据库文件的读写权限。
通过JDBC操作SQLite轻量高效,适合嵌入式应用和小型项目,重点掌握连接管理、事务控制和预编译语句,结合最佳实践可构建稳定可靠的数据层。
引用说明
- SQLite JDBC驱动源码及文档:GitHub – xerial/sqlite-jdbc
- SQLite官方语法参考:SQLite Documentation
- Oracle JDBC教程:Java Database Connectivity (JDBC)
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/33760.html