SQLite JDBC驱动需正确添加到classpath:Maven加xerial依赖,手动运行用-cp指定jar,IDE需配置为运行时依赖;连接失败主因是路径、权限或数据库被占用;金额用REAL类型最稳妥;PreparedStatement参数索引从1开始且须调用executeUpdate()。

SQLite JDBC驱动怎么装才不报java.lang.ClassNotFoundException: org.sqlite.JDBC
没加对依赖,或者加了但没进 classpath,是这个错的唯一原因。JDBC 驱动不是“下载 jar 放目录里”就完事的,得让 Java 看得见。
- 用 Maven 就直接加
<dependency>:<dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version>3.45.1.0</version> </dependency>
- 手动跑的话,必须把
sqlite-jdbc-3.45.1.0.jar加到-cp参数里,比如:java -cp ".;sqlite-jdbc-3.45.1.0.jar" Main
(Windows 用分号,macOS/Linux 用冒号) - IDE 用户注意:IntelliJ 或 Eclipse 添加 jar 后,要确认它出现在 “Module Dependencies” 或 “Build Path” 的运行时(Runtime)范围,不是只编译期有效
Connection conn = DriverManager.getConnection("jdbc:sqlite:account.db") 执行失败,常见卡在哪
路径不对、权限不足、数据库被占用,三者占九成。SQLite 不是服务端数据库,它本质就是个文件,所有问题都绕不开文件系统。
- 相对路径默认从
System.getProperty("user.dir")开始找 —— 也就是你执行java命令时所在的目录,不是项目根目录,更不是src目录 - 想确保位置可控,直接用绝对路径:
DriverManager.getConnection("jdbc:sqlite:/home/you/app/account.db") - Windows 下注意反斜杠转义或用正斜杠:
"jdbc:sqlite:C:/myapp/account.db"比"jdbc:sqlite:C:\myapp\account.db"安全 - 如果程序反复重启时报
database is locked,大概率是前一次连接没conn.close(),或者没关Statement/ResultSet
建账本表时,为什么用 REAL 存金额比 TEXT 或 INTEGER 更稳妥
因为钱不是字符串,也不是整数,而 SQLite 没有原生 decimal 类型,REAL 是最贴近实际需求的妥协方案。
-
TEXT看似能存 "19.99",但排序、求和、范围查询全失效;INTEGER存“分”单位(如 1999)虽可避免浮点误差,但业务逻辑里每处都要除 100,易漏、难读 -
REAL在记账这种精度要求 ≤ 小数点后两位的场景完全够用 —— Javadouble表示 19.99 是精确的,SQLiteREAL也按 IEEE 754 存,只要不做高频累加或科学计算,不会出肉眼可见偏差 - 建表语句建议带
NOT NULL和默认值:CREATE TABLE IF NOT EXISTS records ( id INTEGER PRIMARY KEY, amount REAL NOT NULL, category TEXT NOT NULL, note TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP )
PreparedStatement 执行插入老是空指针或 SQL 异常,参数绑定容易漏什么
最常漏的是 ps.setString(1, ...) 的序号从 1 开始,不是 0;其次是没检查 NULL 值传给非空字段;还有就是 executeUpdate() 忘了调用。
立即学习“Java免费学习笔记(深入)”;
- 参数索引严格按
?出现顺序数,比如INSERT INTO records(amount, category) VALUES (?, ?),第一个?是 index 1,第二个是 2 - 字段定义为
NOT NULL,但代码里传了null(比如ps.setString(2, null)),会直接抛SQLException - 别用
executeQuery()插数据 —— 它只用于SELECT;插入/更新得用executeUpdate(),它返回影响行数,方便判断是否成功 - 一个最小可用插入片段:
String sql = "INSERT INTO records(amount, category, note) VALUES (?, ?, ?)"; try (PreparedStatement ps = conn.prepareStatement(sql)) { ps.setDouble(1, 29.5); ps.setString(2, "food"); ps.setString(3, "lunch"); int rows = ps.executeUpdate(); // 这行不能少 }
account.db 文件有没有生成,用命令行 sqlite3 account.db ".schema" 看表建没建成功 —— 很多时候问题根本不在 Java 代码,而在你根本没看到那个 db 文件出现在哪。










