SQL/JAVA:尝试将数据保存到表时,将不会添加到表中

SQL/JAVA:尝试将数据保存到表时,将不会添加到表中,java,mysql,sql,jdbc,Java,Mysql,Sql,Jdbc,我的代码没有将任何数据保存到表中。我不知道为什么不是,但是,我修复了我在上一篇文章中发布的错误。有什么原因不能吗?它不再给我任何错误。我拥有的表是否与查询兼容?我现在真的被卡住了 以下是将其保存到表中的代码: public boolean saveHighScore(Client c) throws SQLException { long totallvlexp = (long) (c.playerXP[0]) + (c.playerXP[1]) + (c.playerXP[2]) + (c.p

我的代码没有将任何数据保存到表中。我不知道为什么不是,但是,我修复了我在上一篇文章中发布的错误。有什么原因不能吗?它不再给我任何错误。我拥有的表是否与查询兼容?我现在真的被卡住了

以下是将其保存到表中的代码:

public boolean saveHighScore(Client c) throws SQLException {
long totallvlexp = (long) (c.playerXP[0]) + (c.playerXP[1]) + (c.playerXP[2]) + (c.playerXP[3]) + (c.playerXP[4]) + (c.playerXP[5]) + (c.playerXP[6]) + (c.playerXP[7]) + (c.playerXP[8]) + (c.playerXP[9]) + (c.playerXP[10]) + (c.playerXP[11]) + (c.playerXP[12]) + (c.playerXP[13]) + (c.playerXP[14]) + (c.playerXP[15]) + (c.playerXP[16]) + (c.playerXP[17]) + (c.playerXP[18]) + (c.playerXP[19]) + (c.playerXP[20]); 
int totallevell = (int) (c.getLevelForXP(c.playerXP[0]) + c.getLevelForXP(c.playerXP[1]) + c.getLevelForXP(c.playerXP[2]) + c.getLevelForXP(c.playerXP[3]) + c.getLevelForXP(c.playerXP[4]) + c.getLevelForXP(c.playerXP[5]) + c.getLevelForXP(c.playerXP[6]) + c.getLevelForXP(c.playerXP[7]) + c.getLevelForXP(c.playerXP[8]) + c.getLevelForXP(c.playerXP[9]) + c.getLevelForXP(c.playerXP[10]) + c.getLevelForXP(c.playerXP[11]) + c.getLevelForXP(c.playerXP[12]) + c.getLevelForXP(c.playerXP[13]) + c.getLevelForXP(c.playerXP[14]) + c.getLevelForXP(c.playerXP[15]) + c.getLevelForXP(c.playerXP[16]) + c.getLevelForXP(c.playerXP[17]) + c.getLevelForXP(c.playerXP[18]) + c.getLevelForXP(c.playerXP[19]) + c.getLevelForXP(c.playerXP[20]));
boolean result = true;
String updateSkillsSql = "UPDATE skills"
    + " SET `Attacklvl`=?,"
    + " `Attackxp`=?,"
    + " `Defencelvl`=?,"
    + " `Defencexp`=?,"
    + " `Strengthlvl`=?,"
    + " `Strengthxp`=?,"
    + " `Hitpointslvl`=?,"
    + " `Hitpointsxp`=?,"
    + " `Rangelvl`=?,"
    + " `Rangexp`=?,"
    + " `Prayerlvl`=?,"
    + " `Prayerxp`=?,"
    + " `Magiclvl`=?,"
    + " `Magicxp`=?,"
    + " `Cookinglvl`=?,"
    + " `Cookingxp`=?,"
    + " `Woodcuttinglvl`=?,"
    + " `Woodcuttingxp`=?,"
    + " `Fletchinglvl`=?,"
    + " `Fletchingxp`=?,"
    + " `Fishinglvl`=?,"
    + " `Fishingxp`=?,"
    + " `Firemakinglvl`=?,"
    + " `Firemakingxp`=?,"
    + " `Craftinglvl`=?,"
    + " `Craftingxp`=?,"
    + " `Smithinglvl`=?,"
    + " `Smithingxp`=?,"
    + " `Mininglvl`=?,"
    + " `Miningxp`=?,"
    + " `Herblorelvl`=?,"
    + " `Herblorexp`=?,"
    + " `Agilitylvl`=?,"
    + " `Agilityxp`=?,"
    + " `Thievinglvl`=?,"
    + " `Thievingxp`=?,"
    + " `Slayerlvl`=?,"
    + " `Slayerxp`=?,"
    + " `Farminglvl`=?,"
    + " `Farmingxp`=?,"
    + " `Runecraftlvl`=?,"
    + " `Runecraftxp`=?"
    + " WHERE `playerName`=?";


String updateSkillsoverallSql = "UPDATE skillsoverall"
+ " SET `lvl`=?,"
+ " `xp`=?"
+ " WHERE `playerName`=?";

String updatePlayerRightsSql = "UPDATE playerrights"
+ " SET `rank` = ?"
+ " WHERE `playerName`=?";

try(Connection con = DriverManager.getConnection("jdbc:mysql://localhost/highscores","root","root")) {
con.setAutoCommit(false);
    try(PreparedStatement pstmt = con.prepareStatement(updateSkillsSql);PreparedStatement pstmt2 = con.prepareStatement(updateSkillsoverallSql);PreparedStatement pstmt3 = con.prepareStatement(updatePlayerRightsSql);) {
        setParameters(pstmt,
                    c.playerLevel[0], c.playerXP[0],
                    c.playerLevel[1], c.playerXP[1],
                    c.playerLevel[2], c.playerXP[2],
                    c.playerLevel[3], c.playerXP[3],
                    c.playerLevel[4], c.playerXP[4],
                    c.playerLevel[5], c.playerXP[5],
                    c.playerLevel[6], c.playerXP[6],
                    c.playerLevel[7], c.playerXP[7],
                    c.playerLevel[8], c.playerXP[8],
                    c.playerLevel[9], c.playerXP[9],
                    c.playerLevel[10], c.playerXP[10],
                    c.playerLevel[11], c.playerXP[11],
                    c.playerLevel[12], c.playerXP[12],
                    c.playerLevel[13], c.playerXP[13],
                    c.playerLevel[14], c.playerXP[14],
                    c.playerLevel[15], c.playerXP[15],
                    c.playerLevel[16], c.playerXP[16],
                    c.playerLevel[17], c.playerXP[17],
                    c.playerLevel[18], c.playerXP[18],
                    c.playerLevel[19], c.playerXP[19],
                    c.playerLevel[20], c.playerXP[20],
                    c.playerName);

        setParameters(pstmt2,
            totallevell, totallvlexp,
                    c.playerName);
        setParameters(pstmt3,
            c.getPermission().getId(), c.playerName);

        pstmt.executeUpdate();
        pstmt2.executeUpdate();
        pstmt3.executeUpdate();
    } catch (Exception e) {
        System.out.println(String.format("There's a problem when saving the data of  player %s.", c.playerName));
        e.printStackTrace(System.out);
        con.rollback();
        result = false;
    }
    if (result) {
        con.commit();
        con.setAutoCommit(true);
    }
} catch (Exception e) {
    System.out.println(String.format("There's a problem when saving the data of  player %s.", c.playerName));
    e.printStackTrace(System.out);
    result = false;
    }
    return result;
}

private void setParameters(PreparedStatement pstmt, Object ... args) {
    int i = 0;
    try {
        for (Object arg : args) {
            pstmt.setObject(++i, arg);
        }
    } catch(Exception e) {
        e.printStackTrace();
    }
}
}
CREATE TABLE `skills` (
`playerName` varchar(15) NOT NULL default '',
`Attacklvl` double default NULL,
`Attackxp` double default NULL,
`Defencelvl` double default NULL,
`Defencexp` double default NULL,
`Strengthlvl` double default NULL,
`Strengthxp` double default NULL,
`Hitpointslvl` double default NULL,
`Hitpointsxp` double default NULL,
`Rangelvl` double default NULL,
`Rangexp` double default NULL,
`Prayerlvl` double default NULL,
`Prayerxp` double default NULL,
`Magiclvl` double default NULL,
`Magicxp` double default NULL,
`Cookinglvl` double default NULL,
`Cookingxp` double default NULL,
`Woodcuttinglvl` double default NULL,
`Woodcuttingxp` double default NULL,
`Fletchinglvl` double default NULL,
`Fletchingxp` double default NULL,
`Fishinglvl` double default NULL,
`Fishingxp` double default NULL,
`Firemakinglvl` double default NULL,
`Firemakingxp` double default NULL,
`Craftinglvl` double default NULL,
`Craftingxp` double default NULL,
`Smithinglvl` double default NULL,
`Smithingxp` double default NULL,
`Mininglvl` double default NULL,
`Miningxp` double default NULL,
`Herblorelvl` double default NULL,
`Herblorexp` double default NULL,
`Agilitylvl` double default NULL,
`Agilityxp` double default NULL,
`Thievinglvl` double default NULL,
`Thievingxp` double default NULL,
`Slayerlvl` double default NULL,
`Slayerxp` double default NULL,
`Farminglvl` double default NULL,
`Farmingxp` double default NULL,
`Runecraftlvl` double default NULL,
`Runecraftxp` double default NULL,
 index (playerName),

constraint fk_playername_rights
foreign key (playername) references players (playername)
on delete restrict
on update restrict 

) ENGINE=MyISAM;
ALTER TABLE skills ADD INDEX idx_playername (playername);

CREATE TABLE `playerrights` (
`playerName` varchar(15) NOT NULL default '',
`rank` int(2) default NULL,
index (playername),

constraint fk_playername_rights
foreign key (playername) references players (playername)
on delete restrict
on update restrict 

) ENGINE=MyISAM;
ALTER TABLE playerrights ADD INDEX idx_playername (playername);

CREATE TABLE `skillsoverall` (
`playerName` varchar(15) NOT NULL default '',
`lvl` int(11) default NULL,
`xp` BIGINT(11) default NULL,
index (playername),

constraint fk_playername_rights
foreign key (playername) references players (playername)
on delete restrict
on update restrict 

) ENGINE=MyISAM;
ALTER TABLE skillsoverall ADD INDEX idx_playerName (playerName);
以下是表格:

public boolean saveHighScore(Client c) throws SQLException {
long totallvlexp = (long) (c.playerXP[0]) + (c.playerXP[1]) + (c.playerXP[2]) + (c.playerXP[3]) + (c.playerXP[4]) + (c.playerXP[5]) + (c.playerXP[6]) + (c.playerXP[7]) + (c.playerXP[8]) + (c.playerXP[9]) + (c.playerXP[10]) + (c.playerXP[11]) + (c.playerXP[12]) + (c.playerXP[13]) + (c.playerXP[14]) + (c.playerXP[15]) + (c.playerXP[16]) + (c.playerXP[17]) + (c.playerXP[18]) + (c.playerXP[19]) + (c.playerXP[20]); 
int totallevell = (int) (c.getLevelForXP(c.playerXP[0]) + c.getLevelForXP(c.playerXP[1]) + c.getLevelForXP(c.playerXP[2]) + c.getLevelForXP(c.playerXP[3]) + c.getLevelForXP(c.playerXP[4]) + c.getLevelForXP(c.playerXP[5]) + c.getLevelForXP(c.playerXP[6]) + c.getLevelForXP(c.playerXP[7]) + c.getLevelForXP(c.playerXP[8]) + c.getLevelForXP(c.playerXP[9]) + c.getLevelForXP(c.playerXP[10]) + c.getLevelForXP(c.playerXP[11]) + c.getLevelForXP(c.playerXP[12]) + c.getLevelForXP(c.playerXP[13]) + c.getLevelForXP(c.playerXP[14]) + c.getLevelForXP(c.playerXP[15]) + c.getLevelForXP(c.playerXP[16]) + c.getLevelForXP(c.playerXP[17]) + c.getLevelForXP(c.playerXP[18]) + c.getLevelForXP(c.playerXP[19]) + c.getLevelForXP(c.playerXP[20]));
boolean result = true;
String updateSkillsSql = "UPDATE skills"
    + " SET `Attacklvl`=?,"
    + " `Attackxp`=?,"
    + " `Defencelvl`=?,"
    + " `Defencexp`=?,"
    + " `Strengthlvl`=?,"
    + " `Strengthxp`=?,"
    + " `Hitpointslvl`=?,"
    + " `Hitpointsxp`=?,"
    + " `Rangelvl`=?,"
    + " `Rangexp`=?,"
    + " `Prayerlvl`=?,"
    + " `Prayerxp`=?,"
    + " `Magiclvl`=?,"
    + " `Magicxp`=?,"
    + " `Cookinglvl`=?,"
    + " `Cookingxp`=?,"
    + " `Woodcuttinglvl`=?,"
    + " `Woodcuttingxp`=?,"
    + " `Fletchinglvl`=?,"
    + " `Fletchingxp`=?,"
    + " `Fishinglvl`=?,"
    + " `Fishingxp`=?,"
    + " `Firemakinglvl`=?,"
    + " `Firemakingxp`=?,"
    + " `Craftinglvl`=?,"
    + " `Craftingxp`=?,"
    + " `Smithinglvl`=?,"
    + " `Smithingxp`=?,"
    + " `Mininglvl`=?,"
    + " `Miningxp`=?,"
    + " `Herblorelvl`=?,"
    + " `Herblorexp`=?,"
    + " `Agilitylvl`=?,"
    + " `Agilityxp`=?,"
    + " `Thievinglvl`=?,"
    + " `Thievingxp`=?,"
    + " `Slayerlvl`=?,"
    + " `Slayerxp`=?,"
    + " `Farminglvl`=?,"
    + " `Farmingxp`=?,"
    + " `Runecraftlvl`=?,"
    + " `Runecraftxp`=?"
    + " WHERE `playerName`=?";


String updateSkillsoverallSql = "UPDATE skillsoverall"
+ " SET `lvl`=?,"
+ " `xp`=?"
+ " WHERE `playerName`=?";

String updatePlayerRightsSql = "UPDATE playerrights"
+ " SET `rank` = ?"
+ " WHERE `playerName`=?";

try(Connection con = DriverManager.getConnection("jdbc:mysql://localhost/highscores","root","root")) {
con.setAutoCommit(false);
    try(PreparedStatement pstmt = con.prepareStatement(updateSkillsSql);PreparedStatement pstmt2 = con.prepareStatement(updateSkillsoverallSql);PreparedStatement pstmt3 = con.prepareStatement(updatePlayerRightsSql);) {
        setParameters(pstmt,
                    c.playerLevel[0], c.playerXP[0],
                    c.playerLevel[1], c.playerXP[1],
                    c.playerLevel[2], c.playerXP[2],
                    c.playerLevel[3], c.playerXP[3],
                    c.playerLevel[4], c.playerXP[4],
                    c.playerLevel[5], c.playerXP[5],
                    c.playerLevel[6], c.playerXP[6],
                    c.playerLevel[7], c.playerXP[7],
                    c.playerLevel[8], c.playerXP[8],
                    c.playerLevel[9], c.playerXP[9],
                    c.playerLevel[10], c.playerXP[10],
                    c.playerLevel[11], c.playerXP[11],
                    c.playerLevel[12], c.playerXP[12],
                    c.playerLevel[13], c.playerXP[13],
                    c.playerLevel[14], c.playerXP[14],
                    c.playerLevel[15], c.playerXP[15],
                    c.playerLevel[16], c.playerXP[16],
                    c.playerLevel[17], c.playerXP[17],
                    c.playerLevel[18], c.playerXP[18],
                    c.playerLevel[19], c.playerXP[19],
                    c.playerLevel[20], c.playerXP[20],
                    c.playerName);

        setParameters(pstmt2,
            totallevell, totallvlexp,
                    c.playerName);
        setParameters(pstmt3,
            c.getPermission().getId(), c.playerName);

        pstmt.executeUpdate();
        pstmt2.executeUpdate();
        pstmt3.executeUpdate();
    } catch (Exception e) {
        System.out.println(String.format("There's a problem when saving the data of  player %s.", c.playerName));
        e.printStackTrace(System.out);
        con.rollback();
        result = false;
    }
    if (result) {
        con.commit();
        con.setAutoCommit(true);
    }
} catch (Exception e) {
    System.out.println(String.format("There's a problem when saving the data of  player %s.", c.playerName));
    e.printStackTrace(System.out);
    result = false;
    }
    return result;
}

private void setParameters(PreparedStatement pstmt, Object ... args) {
    int i = 0;
    try {
        for (Object arg : args) {
            pstmt.setObject(++i, arg);
        }
    } catch(Exception e) {
        e.printStackTrace();
    }
}
}
CREATE TABLE `skills` (
`playerName` varchar(15) NOT NULL default '',
`Attacklvl` double default NULL,
`Attackxp` double default NULL,
`Defencelvl` double default NULL,
`Defencexp` double default NULL,
`Strengthlvl` double default NULL,
`Strengthxp` double default NULL,
`Hitpointslvl` double default NULL,
`Hitpointsxp` double default NULL,
`Rangelvl` double default NULL,
`Rangexp` double default NULL,
`Prayerlvl` double default NULL,
`Prayerxp` double default NULL,
`Magiclvl` double default NULL,
`Magicxp` double default NULL,
`Cookinglvl` double default NULL,
`Cookingxp` double default NULL,
`Woodcuttinglvl` double default NULL,
`Woodcuttingxp` double default NULL,
`Fletchinglvl` double default NULL,
`Fletchingxp` double default NULL,
`Fishinglvl` double default NULL,
`Fishingxp` double default NULL,
`Firemakinglvl` double default NULL,
`Firemakingxp` double default NULL,
`Craftinglvl` double default NULL,
`Craftingxp` double default NULL,
`Smithinglvl` double default NULL,
`Smithingxp` double default NULL,
`Mininglvl` double default NULL,
`Miningxp` double default NULL,
`Herblorelvl` double default NULL,
`Herblorexp` double default NULL,
`Agilitylvl` double default NULL,
`Agilityxp` double default NULL,
`Thievinglvl` double default NULL,
`Thievingxp` double default NULL,
`Slayerlvl` double default NULL,
`Slayerxp` double default NULL,
`Farminglvl` double default NULL,
`Farmingxp` double default NULL,
`Runecraftlvl` double default NULL,
`Runecraftxp` double default NULL,
 index (playerName),

constraint fk_playername_rights
foreign key (playername) references players (playername)
on delete restrict
on update restrict 

) ENGINE=MyISAM;
ALTER TABLE skills ADD INDEX idx_playername (playername);

CREATE TABLE `playerrights` (
`playerName` varchar(15) NOT NULL default '',
`rank` int(2) default NULL,
index (playername),

constraint fk_playername_rights
foreign key (playername) references players (playername)
on delete restrict
on update restrict 

) ENGINE=MyISAM;
ALTER TABLE playerrights ADD INDEX idx_playername (playername);

CREATE TABLE `skillsoverall` (
`playerName` varchar(15) NOT NULL default '',
`lvl` int(11) default NULL,
`xp` BIGINT(11) default NULL,
index (playername),

constraint fk_playername_rights
foreign key (playername) references players (playername)
on delete restrict
on update restrict 

) ENGINE=MyISAM;
ALTER TABLE skillsoverall ADD INDEX idx_playerName (playerName);

我看你的代码在审核后没有任何问题。然而,我有一个重要的建议,我觉得它可以解决你的问题

在您尝试更新代码中的表之前,请打印出不工作的SQL。在您的情况下,我相信是updateSkillsSql

System.out.println(updateSkillsSql);
接下来,将查询复制并粘贴到当前连接并使用数据库的SQL控制台中。如果返回任何错误,请检查SQL

我发现,在尝试用其他语言(如PHP、Java)编写查询时,99%的时间我都能够在通过SQL控制台直接应用时更快地调试问题。通常情况下,它最终会丢失引用,或者是一个我没想到会有引用的空间


如果执行此操作-发布查询结果和在SQL中运行查询的结果。如果您无法解决问题,我将更新我的答案,并提供更多详细信息。

我认为您的代码在检查后没有任何问题。然而,我有一个重要的建议,我觉得它可以解决你的问题

在您尝试更新代码中的表之前,请打印出不工作的SQL。在您的情况下,我相信是updateSkillsSql

System.out.println(updateSkillsSql);
接下来,将查询复制并粘贴到当前连接并使用数据库的SQL控制台中。如果返回任何错误,请检查SQL

我发现,在尝试用其他语言(如PHP、Java)编写查询时,99%的时间我都能够在通过SQL控制台直接应用时更快地调试问题。通常情况下,它最终会丢失引用,或者是一个我没想到会有引用的空间

如果执行此操作-发布查询结果和在SQL中运行查询的结果。如果您无法解决问题,我将更新我的答案,并提供更多详细信息。

将评论转化为答案

您可能希望/需要将准备好的声明更改为。
但是,要使其工作,您需要一个
主键
/
唯一
索引。只要辅助表每人最多只能容纳一个条目,playerName列将满足此要求。(虽然从长远来看,数字ID可能是更好的选择…)

有关简单示例,请参见。
或者检查这个,它更接近你的问题领域。请特别注意,在技能中只存在一条记录,尽管有两条
插入记录

如果需要调整/进一步详细信息,请发表意见。

将意见转化为答案

您可能希望/需要将准备好的声明更改为。
但是,要使其工作,您需要一个
主键
/
唯一
索引。只要辅助表每人最多只能容纳一个条目,playerName列将满足此要求。(虽然从长远来看,数字ID可能是更好的选择…)

有关简单示例,请参见。
或者检查这个,它更接近你的问题领域。请特别注意,在技能中只存在一条记录,尽管有两条
插入记录


如果需要调整/进一步的详细信息,请发表意见。

您是否插入过要更新的记录?我的印象是提交可以做到这一点,没有?@Joliquine4 SQL
update
可以处理已经存在的记录。您需要
insert
来创建初始记录。是否有一种好方法可以先插入第一次保存,然后再使用更新,或者我需要将java变量存储为布尔值并为每个用户跟踪它@GriffeyDogIf如果您使用的是MySQL(我自己也不熟悉),那么它似乎有一些特殊的语句/语法可以尝试。请看。您是否插入过要更新的记录?我的印象是提交可以做到这一点,没有?@joliquine4sql
update
可以处理已经存在的记录。您需要
insert
来创建初始记录。是否有一种好方法可以先插入第一次保存,然后再使用更新,或者我需要将java变量存储为布尔值并为每个用户跟踪它@GriffeyDogIf如果您使用的是MySQL(我自己也不熟悉),那么它似乎有一些特殊的语句/语法可以尝试。请参阅。感谢您的帮助,但在评论的帮助下,我发现我的问题只是更新之前没有使用INSERT,但现在我有了一个新问题;我不知道如何在语法上使用插入。。。在重复密钥更新时。@Joliquine4您需要帮助的是哪一部分?-您似乎缺少
主键
/
唯一
索引,但…@Abecee我有一个主键,但改为外键,因为我的每个表只是为同一个人保存的不同类型的数据。我不知道做什么才是独一无二的。我找不到插入的示例。。。在使用SET的重复密钥更新中,我不知道它将如何影响我的PreparedStatement。@Joliquine4 PreparedStatement确实需要保存该确切语句。此语句反过来需要一个
主键
/
唯一
索引。有关示例,请参见。如果辅助表每人只保存/最多保存一条记录,
外键
仍然应该是唯一的。@Abecee“应该”如中所示,我应该使它们唯一,或者“应该”如中所示,应该是唯一的,因为它感谢您的帮助,但我已经发现,在Common的帮助下