You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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下的空文件,从而触发自动创建。

解决步骤

  1. 找到SQLStudio创建的kontakt.sqlite文件,右键查看它的绝对路径(比如可能是C:\\Users\\49160\\eclipse-workspace-neu\\KontakteFXSQL\\kontakt.sqlite
  2. 把这个绝对路径直接替换到你的代码连接字符串中,先测试是否能连接到已有库。

二、修正代码中的路径配置

根据你找到的真实路径,修改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

火山引擎 最新活动