java - MySQL - 对象不为空?

标签 java mysql sql

我正在尝试使用以下代码检查玩家是否已在数据库中:

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/

相关文章:

.net - 直接数据库连接与 Web 服务,用于 MySQL+SQL 电子商务集成?

python - 如何在 python (geoalchemy) 中设置空间 SQL 查询的范围

sql - BigQuery 是否支持 "execute immediate"命令运行动态查询?

java - 在 Javafx 中实现 sql 查询的问题

java.lang.VerifyError : (class: org/apache/jasper/compiler/JspUtil, 方法:<clinit> 签名:()V) 函数参数不兼容

java - 哪个版本的guava兼容java 1.7

java - java直接内存访问网卡

php - 如何允许一名选民投票给多名候选人,但不允许他再次投票给同一候选人?

java - 在服务启动时禁用 OSGi 服务的正确方法是什么?

Mysql查询使用数据透视表