Java JDBC查询不会返回任何没有错误的值
我有一个运行MariaDB的本地SQL服务器,需要使用Java和JDBC从数据库中查询数据。我可以连接到数据库,也可以写入数据,但简单的选择不起作用 我已经尝试使用不同版本的mysql java连接器,并检查SQL Server是否是最新的 连接到数据库: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
//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循环时,您的代码不会进入该循环,因为表中没有下一个条目。