我正在尝试使用以下代码检查玩家是否已在数据库中:
Statement sql = mySql.getConnection().createStatement();
ResultSet check = sql.executeQuery("SELECT * FROM `playerinfo` WHERE Username='" + player.getName() + "';");
System.out.println(check.toString());
if(check != null) {
System.out.println("2");
Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "Player already in database");
check.close();
sql.close();
return;
}
我检查过,但数据库中没有任何内容,它说该播放器已包含在数据库中 抱歉英语不好
最佳答案
一些注意事项:
检查数据库是否包含特定值时,最好使用返回单个值的查询(而不是 SELECT *
,它返回与 WHERE
条件匹配的所有行的所有列)。你可以这样做,例如通过选择带有行限制子句 ( SELECT 1
) 的单个检查标志 ( LIMIT 1
):
SELECT 1 FROM playerinfo WHERE Username = ? LIMIT 1
如果存在给定名称的玩家,则此查询保证仅返回一行(包含单列“1”);如果不存在具有给定名称的玩家,则不返回任何行。
正如其他人所指出的,当您在查询中输入参数时,您应该使用 PreparedStatement
而不是带有连接输入的简单语句。这样,您可以避免 SQL 注入(inject),并且数据库还能够在内部重用/缓存查询(或游标)。
最后,您应该关闭您使用的资源,即使 Exception
在执行过程中被抛出。最好在 finally
中完成此操作。子句,或者如果您使用的是 Java 7 或更高版本,请使用 try-with-resources statement .
考虑到这些事情,重写代码可能如下所示:
PreparedStatement ps = null;
try {
ps = mySQL.getConnection()
.prepareStatement("SELECT 1 FROM playerinfo WHERE Username = ? LIMIT 1");
ps.setString(1, player.getName());
ResultSet rs = ps.executeQuery();
// the first invocation of rs.next() returns true if
// there are rows in the result set, or false if no rows were found
if (rs.next()) {
System.out.println("2");
Bukkit.getConsoleSender().sendMessage(ChatColor.RED
+ "Player already in database");
}
rs.close();
} finally {
if (ps != null) {
ps.close();
}
}
关于java - MySQL - 对象不为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29879506/