我正在为我的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列上放置了一个唯一的选项卡,所以无法进行添加。

最佳答案

你是在告诉我们

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");
}


输出"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的条目。结果是尝试再次插入该播放器,由于某些数据库约束(唯一的主键或类似的东西),该播放器将无法工作。

您可能需要将查询重写为类似

String query = "SELECT " + pUUID + " FROM playerInfo;";


然后再试一次。
我希望这有帮助...

10-04 22:05
查看更多