Java连接SQLite时自动创建新数据库而非使用已有库,导致登录查询失败
Java连接SQLite时自动创建新数据库而非使用已有库,导致登录查询失败
我来帮你分析下这个问题,这是SQLite JDBC驱动的典型特性引发的——当指定路径下不存在数据库文件时,JDBC驱动会自动创建一个空的新文件。你觉得路径正确,但程序还是新建了数据库,说明你的代码实际指向的路径和你存放已有kontakt.sqlite的路径并不一致,咱们一步步排查解决:
一、先搞清楚已有数据库的真实位置
你提到用SQLStudio创建了kontakt.sqlite,但很可能你把这个文件放错了位置:
- 你代码里指定的路径是项目的
src目录:C:\\Users\\49160\\eclipse-workspace-neu\\KontakteFXSQL\\src\\ - 但Eclipse默认的运行工作目录是项目根目录(也就是
KontakteFXSQL文件夹),不是src。如果你把SQLStudio创建的数据库直接放在了项目根目录,那代码里的路径就会指向src下的空文件,从而触发自动创建。
解决步骤:
- 找到SQLStudio创建的
kontakt.sqlite文件,右键查看它的绝对路径(比如可能是C:\\Users\\49160\\eclipse-workspace-neu\\KontakteFXSQL\\kontakt.sqlite) - 把这个绝对路径直接替换到你的代码连接字符串中,先测试是否能连接到已有库。
二、修正代码中的路径配置
根据你找到的真实路径,修改Database类的路径常量:
比如如果数据库在项目根目录,修改为:
public class Database { public static final String DB_NAME = "kontakt.sqlite"; // 直接指向项目根目录,或者用你找到的绝对路径 public static final String PATH = "C:\\Users\\49160\\eclipse-workspace-neu\\KontakteFXSQL\\"; public static final String CONNECTION_STRING = "jdbc:sqlite:" + PATH + DB_NAME; // ... 其他代码不变 }
如果想更灵活,也可以用相对路径(前提是确保运行时工作目录是项目根目录):
public static final String CONNECTION_STRING = "jdbc:sqlite:kontakt.sqlite";
三、检查文件占用和权限问题
- 关闭SQLStudio再运行Java程序:SQLite是文件级锁,如果SQLStudio还在打开这个数据库,可能导致Java无法读取已有文件,转而创建新库。
- 确保你的Java程序有读取该文件的权限:Windows下如果文件被设置为只读或者当前用户没有访问权限,也可能出现这种情况。
四、修复LoginModel中的逻辑错误
你的isLogin方法现在不管查询结果有没有匹配的用户,都会返回true,这会导致登录逻辑完全失效。必须检查ResultSet是否有返回记录:
public class LoginModel { public boolean isLogin(String username, String password, Connection connection) throws Exception { PreparedStatement preparedStatement = null; ResultSet resultSet = null; String sql = "SELECT * FROM Login where username = ? and password = ? "; try { preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, username); preparedStatement.setString(2, password); resultSet = preparedStatement.executeQuery(); // 只有当查询到匹配记录时才返回true return resultSet.next(); } catch (Exception e) { e.printStackTrace(); return false; } finally { // 必须关闭资源,避免内存泄漏 if (resultSet != null) resultSet.close(); if (preparedStatement != null) preparedStatement.close(); // 注意:不要在这里关闭connection,应该由调用connection的地方负责关闭 } } }
按照上面的步骤调整后,你的程序应该能正确连接到已有数据库,并且登录逻辑也能正常工作了。
备注:内容来源于stack exchange,提问作者Thriest




