mysql - 从我的代码中在我的控制台中得到一些错误

标签 mysql bukkit

<分区>

我正在编写一个统计插件,它在加入时从数据库中检索统计信息,将它们实现到 HashMap 中,并在退出时将这些新统计信息实现到数据库中,这样做的原因是没有与每秒打开连接相比滞后很多。

如果这意味着什么,我正在使用 MariaDB。

下面的 HashMap

public static HashMap<String, Integer> kills = new HashMap<String, Integer>();
public static HashMap<String, Integer> deaths = new HashMap<String, Integer>(); 

代码如下

   @EventHandler
public void onDeath(PlayerDeathEvent event){
    Player p = event.getEntity();
    Player k = p.getKiller();
    kills.put(k.getName(), kills.get(k.getName() + 1));
    deaths.put(p.getName(), deaths.get(p.getName() + 1));
    removeScoreboard(p);
    setScoreboard(p);
    removeScoreboard(k);
    setScoreboard(k);
}

@EventHandler
public void onJoin(PlayerJoinEvent e){
    OfflinePlayer p2 = e.getPlayer();
    Player p = e.getPlayer();
    openConnection();
    try{
        int previousDeaths = 0;
        int previousKills = 0;

        if(playerDataContainsPlayer(p)){
            PreparedStatement sql = connection.prepareStatement("SELECT deaths FROM `player_data` WHERE player=?;");
            PreparedStatement sql2 = connection.prepareStatement("SELECT kills FROM `player_data` WHERE player=?;");

            ResultSet result = sql.executeQuery();
            ResultSet result2 = sql2.executeQuery();
            result2.next();
            result.next();

            previousDeaths = result.getInt("deaths");
            previousKills = result2.getInt("kills");

            kills.put(p.getName(), previousKills);
            deaths.put(p.getName(), previousDeaths);

            sql.close();
            sql2.close();
            result.close();
            result2.close();
            removeScoreboard(p);
            setScoreboard(p);
        } else {
            PreparedStatement newPlayer = connection.prepareStatement("INSERT INTO `player_data` values(?,0,0);");
            newPlayer.setString(1, p.getUniqueId().toString());
            newPlayer.setInt(2, 0);
            newPlayer.setInt(3, 0);
            newPlayer.execute();
            newPlayer.close();
            kills.put(p.getName(), 0);
            deaths.put(p.getName(), 0);
            removeScoreboard(p);
            setScoreboard(p);
        }

    }catch(Exception e1){
        e1.printStackTrace();
    } finally{
        closeConnection();
    }
}

@EventHandler
public void onLeave(PlayerQuitEvent e){
    Player p = e.getPlayer();
    openConnection();
    try{
        int previousDeaths = 0;
        int previousKills = 0;

        if(playerDataContainsPlayer(p)){
            PreparedStatement sql = connection.prepareStatement("SELECT deaths FROM `player_data` WHERE player=?;");
            PreparedStatement sql2 = connection.prepareStatement("SELECT kills FROM `player_data` WHERE player=?;");
            sql.setString(1, p.getUniqueId().toString());
            sql2.setString(1, p.getUniqueId().toString());

            ResultSet result = sql.executeQuery();
            ResultSet result2 = sql2.executeQuery();
            result2.next();
            result.next();

            previousDeaths = result.getInt("deaths");
            previousKills = result2.getInt("kills");

            PreparedStatement killsUpdate = connection.prepareStatement("UPDATE `player_data` SET kills=? WHERE player=?;");
            killsUpdate.setInt(1, kills.get(p.getName()));
            killsUpdate.setString(2, p.getUniqueId().toString());
            killsUpdate.executeUpdate();

            PreparedStatement deathsUpdate = connection.prepareStatement("UPDATE `player_data` SET deaths=? WHERE player=?;");
            deathsUpdate.setInt(1, deaths.get(p.getName()));
            deathsUpdate.setString(2, p.getUniqueId().toString());
            deathsUpdate.executeUpdate();

            deathsUpdate.close();
            killsUpdate.close();
            sql.close();
            sql2.close();
            result.close();
            result2.close();
        }

    }catch(Exception e1){
        e1.printStackTrace();
    } finally{
        closeConnection();
    }
}

无论何时加入,它都会显示 [20:51:43 WARN]: java.sql.SQLException: No value specified for parameter 1

无论何时你杀了人,或者死了,你的杀戮都是空的,你的死亡也是空的。我不确定为什么会这样,感谢您的帮助。

最佳答案

这里没有给PreparedStatement设置where条件的参数。

PreparedStatement sql = connection.prepareStatement("SELECT deaths FROM `player_data` WHERE player=?");
PreparedStatement sql2 = connection.prepareStatement("SELECT kills FROM `player_data` WHERE player=?");

根据where条件数据类型设置参数。 例如:preparedStatement.setInt(1, 1001);

引用这个:https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

第二个问题:

请如下设置hashmap值

        previousDeaths = result.getInt("deaths");
        previousKills = result2.getInt("kills");

        kills.put(p.getName(), previousKills);
        deaths.put(p.getName(), previousDeaths);

        PreparedStatement killsUpdate = connection.prepareStatement("UPDATE `player_data` SET kills=? WHERE player=?;");
        killsUpdate.setInt(1, kills.get(p.getName()));
        killsUpdate.setString(2, p.getUniqueId().toString());
        killsUpdate.executeUpdate();

关于mysql - 从我的代码中在我的控制台中得到一些错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40370884/

相关文章:

MySQL 未从/usr/local/mysql/data 加载数据库文件

php - 如何检查名称是否已经在表中?在 Mysql 中查询每天的总和,然后通过 PHP 将其填充到 HTML 数据中

mysql - 使用 EnterpriseDB Migration Toolkit 将 MySQL 数据库迁移到 PostgreSQL

gradle - IntelliJ IDEA无法解决良好的工作gradle依赖关系

java - 当我使用 break 时从 "for loop"获取字符串

mysql - 带解密的多个Where子句

php - 如何在 PHP 中导入 .ics 文件并将数据存储在数据库中?

java - 可以在我知道不会为空的字段上使用断言吗?

java - 获取 YAML 路径下的所有节点

javascript - 查询 Minecraft(Bukkit) 服务器 Javascript 自动更新