Java JDBC查询不会返回任何没有错误的值

Java JDBC查询不会返回任何没有错误的值,java,mysql,jdbc,Java,Mysql,Jdbc,我有一个运行MariaDB的本地SQL服务器,需要使用Java和JDBC从数据库中查询数据。我可以连接到数据库,也可以写入数据,但简单的选择不起作用 我已经尝试使用不同版本的mysql java连接器,并检查SQL Server是否是最新的 连接到数据库: //Check wether connection already exists if(connection != null && !connection.isClosed()){ return; } //Create

我有一个运行MariaDB的本地SQL服务器,需要使用Java和JDBC从数据库中查询数据。我可以连接到数据库,也可以写入数据,但简单的选择不起作用

我已经尝试使用不同版本的mysql java连接器,并检查SQL Server是否是最新的

连接到数据库:

//Check wether connection already exists
if(connection != null && !connection.isClosed()){
    return;
}
//Create new connection
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/statdb", "root", "");
System.out.println("Connected to Database");
//Update guilds from Database
updateGuildsInDatabase();
最后调用的方法如下所示:

private void updateGuildsInDatabase() throws SQLException {
    //Check for not existing connection
    if(connection == null || connection.isClosed()){
        init();
        return;
    }
    ArrayList<String> localInDb = new ArrayList<>();
    Statement qGStmt = connection.createStatement();
    //Execute Query
    ResultSet guilds = qGStmt.executeQuery("SELECT * FROM guilds;");
    guilds.first();
    //Adding results to List
    while(guilds.next()){
        localInDb.add(guilds.getString("guild_uid").toLowerCase());
    }
    System.out.println("Queried: " + localInDb.size());
    this.guildsInDb = localInDb;
}
Connected to Database
Queried: 1
Connected to Database
Queried: 0
但实际输出如下所示:

private void updateGuildsInDatabase() throws SQLException {
    //Check for not existing connection
    if(connection == null || connection.isClosed()){
        init();
        return;
    }
    ArrayList<String> localInDb = new ArrayList<>();
    Statement qGStmt = connection.createStatement();
    //Execute Query
    ResultSet guilds = qGStmt.executeQuery("SELECT * FROM guilds;");
    guilds.first();
    //Adding results to List
    while(guilds.next()){
        localInDb.add(guilds.getString("guild_uid").toLowerCase());
    }
    System.out.println("Queried: " + localInDb.size());
    this.guildsInDb = localInDb;
}
Connected to Database
Queried: 1
Connected to Database
Queried: 0
我认为你不需要行会,首先。尝试删除它

根据JavaDoc:

结果集光标最初位于第一行之前;对方法next的第一次调用使第一行成为当前行;第二个调用使第二行成为当前行,依此类推

我相信这里发生的事情是,公会。首先将光标从第一排之前设置到第一排。然后在while循环中将光标向前移动一步。因此,您缺少第一行。

ResultSetfirst方法本身会将光标移动到结果集的第一行。然后,ResultSetnext方法将光标向前移动1,如果有记录,则读取其中的任何记录

因此,使用您的模式将始终导致从结果集中跳过第一条记录。如果结果集恰好只有一条记录,则记录计数将显示为零

您可能应该删除对ResultSetfirst的调用。改用这个:

ResultSet guilds = qGStmt.executeQuery("SELECT * FROM guilds;");
while(guilds.next()) {
    localInDb.add(guilds.getString("guild_uid").toLowerCase());
}
System.out.println("Queried: " + localInDb.size());
this.guildsInDb = localInDb;

在新结果集上调用ResultSetnext在逻辑上起作用的原因是,默认情况下,JDBC结果集实际上并不开始指向第一条记录。相反,我们通常在第一次调用ResultSetnext时将其提前到第一条记录。

其他两个答案是正确的,从结果集中检索时跳过第一行。不需要你的行业协会;正如他们所解释的,默认情况下,结果集自动指向第一行

示例代码,从ResultSet检索 下面是使用的完整示例。这显示了在内存中创建一个新的数据库,而不是持久化到磁盘,添加一个表,用几行填充该表,然后通过结果集检索所有这些行

关键行是while rs.next{

跑步的时候

插入名称列表:[α、β、γ、δ]

第pkey行名称:69908390-5fa6-4eee-8e12-40106db8d60d名称:阿尔法

第pkey行名称:3116acb9-fcce-427f-b222-99c78c6e752a

第pkey行:b3fd0930-a2e7-461a-be70-f05124fc58de名称:伽马

第pkey行名称:dddb423a-5eb2-4e5e-be16-7bb0c27c0033名称:Delta


您是否尝试使用表“guilds”中的两个条目?先注释guilds.first,然后重试.guilds.first已将光标移动到第一行,然后在使用条件guild.next循环时,您的代码不会进入该循环,因为表中没有下一个条目。