MySQLSyntaxErrorException但没有线索为什么

时间:2018-03-31 18:03:42

标签: java mysql sql exception jdbc

public void verhoogAantalGewonnenSpellen(Speler speler, Spel spel){

    try(Connection conn = DriverManager.getConnection(Connectie.JDBC_URL)){
        PreparedStatement query = conn.prepareStatement("UPDATE ID222177_g69.Speler SET ? = ? + 1 WHERE spelernaam = ?");

        query.setString(1, "aantalGewonnen" + spel.getMoeilijkheidsgraad());
        query.setString(2, "aantalGewonnen" + spel.getMoeilijkheidsgraad());
        query.setString(3, speler.getNaam());
        query.executeUpdate();

    } catch(SQLException e){
        throw new RuntimeException(e);
    }
}

运行此代码会出现以下错误:

  

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在' aantalGewonnenMakkelijk' aantalGewonnenMakkelijk'附近使用正确的语法。 =' aantalGewonnenMakkelijk' + 1 WHERE spelernaam =' ObamaJohansson'

Speler包含以下列:

spelernaam((VARCHAR(45)PK, NN)
wachtwoord((VARCHAR(45))NN)
aantalGewonnenMakkelijk(INT(11))
aantalGewonnenNormaal(INT(11)
aantalGewonnenMoeilijk(INT(11). 

我一直在为这个例外苦苦挣扎几个小时,我似乎无法弄明白......有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:2)

coukd你需要setInt而不是setString

    query.setInt(1, aantalGewonnen + spel.getMoeilijkheidsgraad());
    query.setInt(2, aantalGewonnen + spel.getMoeilijkheidsgraad());

并且根据YCF_L的建议,你应该使用列名而不是var是set子句,例如:

   UPDATE ID222177_g69.Speler SET your_column_name= you_column_name + 1 
   WHERE spelernaam = ?

  UPDATE ID222177_g69.Speler SET your_column_name= ? 
   WHERE spelernaam = ?

答案 1 :(得分:0)

您不能像以前那样设置列的名称,而是可以使用这种方式连接查询和列的名称:

String colName = "aantalGewonnen" + spel.getMoeilijkheidsgraad();
String sql = String.format(
        "UPDATE ID222177_g69.Speler SET %s = %s + 1 WHERE spelernaam = ?",
        colName, colName
);

这会给你:

UPDATE ID222177_g69.Speler 
SET aantalGewonnenSomeName = aantalGewonnenSomeName + 1 
WHERE spelernaam = ?

然后像这样创建预备语句:

PreparedStatement query = conn.prepareStatement(sql);
query.setString(1, speler.getNaam());

我假设"aantalGewonnen" + spel.getMoeilijkheidsgraad()为您提供了该列的名称。

重要

但这种方式不够安全,你必须检查名称是否正确,否则可能导致另一个语法错误或SQL注入。