为什么我的SQL代码在结果集中无法正常运行

时间:2019-05-09 12:48:41

标签: java sql jdbc

我正在为我的Minecraft服务器编写bukkit插件,并且我的代码在Result set部分的类或方法的编写方式上存在错误,或者如我所假定的那样。

没有检测到我的播放器已经在SQL表中。这是在hasPlayer方法中。

@EventHandler
    public void onPlayerJoin(PlayerJoinEvent event) {
        Player p = event.getPlayer();
        SQLCheckPlayer pCheck = new SQLCheckPlayer();
        pCheck.p = p;
        boolean i = pCheck.hasPlayer();
        if (i == false) {
            boolean n = pCheck.addPlayer();
            if (n == true) {
            p.sendMessage("You have been added to our database");
        } else {
            p.sendMessage("There was errors in trying to add you to our database");
        }
        } else {
            p.sendMessage("You are in our database");
        }


    }

SQLCheckPlayer类

public class SQLCheckPlayer {

    Player p;

    public boolean hasPlayer() {
        UUID pUUID = p.getUniqueId();
        String query = "SELECT playerID FROM playerInfo;";
        try {
            if (sqlConnection.getDatabaseConnection() != null) {
            Statement st = sqlConnection.getDatabaseConnection().createStatement();
            ResultSet rs = st.executeQuery(query);
            if (rs != null) {
            do{
                if(pUUID.toString() == rs.toString()) {
                    st.close();
                    Bukkit.broadcastMessage("Player successfully added");
                    return true;
                }
            } while(rs.next());

            }
            st.close();
            } else {

                Bukkit.broadcastMessage("Database connection is null");
                return false;
            }

            return false;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Bukkit.broadcastMessage("Sql Exception");
            return false;
        }
    }

    public boolean addPlayer() {
        UUID pUUID = p.getUniqueId();

        try {
            PreparedStatement st = sqlConnection.getDatabaseConnection().prepareStatement("INSERT INTO playerInfo (playerID, playerName, playerDiamonds) VALUES (?, ?, ?)");
            st.setString(1, pUUID.toString());
            st.setString(2, p.getDisplayName());
            st.setInt(3, 0);
            st.executeUpdate();
            st.close();
            return true;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }

    }
}

将我添加到数据库中后(它可以成功完成此操作),无论何时我加入,它都应该显示“您在我们的数据库中”,但始终显示为“尝试将您添加到我们的数据库时出错” 。在打印的堆栈跟踪上,它说代码正在尝试再次将我添加到数据库中,但由于我在playerUUID列上放置了一个唯一的选项卡,所以无法这样做。

2 个答案:

答案 0 :(得分:0)

您正在告诉我们

DeleteStep1Data()

输出boolean i = pCheck.hasPlayer(); if (i == false) { boolean n = pCheck.addPlayer(); if (n == true) { p.sendMessage("You have been added to our database"); } else { p.sendMessage("There was errors in trying to add you to our database"); } } else { p.sendMessage("You are in our database"); }

这是因为{p> "There was errors in trying to add you to our database"将是pCheck.hasPlayer()

false

不考虑UUID pUUID = p.getUniqueId(); String query = "SELECT playerID FROM playerInfo;"; 。相反,它将查找以pUUID作为其"playerId"的条目。结果是尝试再次插入此播放器,由于某些数据库约束(唯一的主键或类似的主键),该播放器无法正常工作。

您可能希望将查询改写为

UUID

,然后重试。 我希望这会有所帮助...

答案 1 :(得分:0)

问题出在您的SQLCheckPlayer#hasPlayer()方法上,因为由于字符串比较它永远都不会返回true,所以它总是返回false,因为您正试图将ResultSet对象转换为字符串。我还将更改查询字符串。 无论播放器是否在数据库中,您都可以使用the SQL EXISTS Operator返回一个布尔值。
因此新的查询字符串如下所示:

String query = "select exists (select null from playerInfo where `playerID` = '"+p.getUniqueId().toString()+"');"

SQLCheckPlayer#hasPlayer()就是这个:

String query = "select exists (select null from playerInfo where `playerID` = '" + p.getUniqueId().toString() + "');";
try {
    if (sqlConnection.getDatabaseConnection() != null) {
        Statement st = sqlConnection.getDatabaseConnection().createStatement();
        ResultSet rs = st.executeQuery(query);
        if (rs.next()) {
            if (rs.getBoolean(1)) {
                st.close();
                Bukkit.broadcastMessage("Player successfully added");
                return true;
            }
        }
        st.close();
    } else {
        Bukkit.broadcastMessage("Database connection is null");
        return false;
    }
    return false;
} catch (SQLException e) {
    e.printStackTrace();
    Bukkit.broadcastMessage("Sql Exception");
    return false;
}