MySQL语法错误当我尝试通过JDBC执行SQL查询

egmofgnx  于 2024-01-05  发布在  Mysql
关注(0)|答案(2)|浏览(294)

我正在构建一个Java微服务,它使用AWS Aurora MySQL进行某些操作。代码连接到数据库很好,我的前三个查询都抛出了类似的错误,直到我意识到我丢失了数据库。
然而,最后一个查询(update语句)仍然给我同样的语法错误,即使是使用了codeon,我也不知道为什么。
代码如下:

  1. try {
  2. conn = DriverManager.getConnection(jdbcUrl);
  3. setupStatement = conn.createStatement();
  4. idInsertStatement = conn.createStatement();
  5. secretNumberUpdateStatement = conn.createStatement();
  6. String createTableIfNotExists = "CREATE TABLE IF NOT EXISTS secret_number_generator(id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, secret_number VARCHAR(20);";
  7. String generateSecretId = "INSERT INTO secret_number_generator VALUES(null,null);";
  8. String getLastRecordId = "SELECT id FROM secret_number_generator ORDER BY id DESC LIMIT 1;";
  9. setupStatement.addBatch(createTableIfNotExists);
  10. idInsertStatement.addBatch(generateSecretId);
  11. setupStatement.executeBatch();
  12. idInsertStatement.executeBatch();
  13. readStatement = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
  14. resultSet = readStatement.executeQuery(getLastRecordId);
  15. while(resultSet.next()){
  16. id = String.valueOf(resultSet.getLong("id"));
  17. }
  18. /*
  19. Logic for setting up secretNumber
  20. */
  21. }
  22. secretNumber = "R" + env + id + randomDigit;
  23. String updateSecretNumber = "UPDATE secret_number_generator SET secret_number = " + secretNumber + " WHERE id = " + id + ";";
  24. secretNumberUpdateStatement.addBatch(updateSecretNumber);
  25. secretNumberUpdateStatement.executeBatch();
  26. resultSet.close();
  27. setupStatement.close();
  28. idInsertStatement.close();
  29. secretNumberUpdateStatement.close();
  30. readStatement.close();
  31. conn.close();
  32. } catch (SQLException ex) {
  33. // Handle any errors
  34. System.out.println("SQLException: " + ex.getMessage());
  35. System.out.println("SQLState: " + ex.getSQLState());
  36. System.out.println("VendorError: " + ex.getErrorCode());
  37. } finally {
  38. System.out.println("Closing the connection.");
  39. if (conn != null) try { conn.close(); } catch (SQLException ignore) {}
  40. }

字符串
我得到的更新查询的错误是

  1. SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1


如前所述,在我在前面的查询末尾添加一个查询之前,它们也会显示相同的错误,现在它只显示在最后一个查询中。

yptwkmov

yptwkmov1#

虽然前面的例子给了你想要的结果,但它很容易在恶意变量值上中断。这个版本针对SQL注入进行了强化:
像这样使用PreparedStatement:

  1. PreparedStatement ps = connection.prepareStatement(
  2. "UPDATE secret_number_generator " +
  3. "SET secret_number = ? " +
  4. "WHERE id = ?";
  5. ps.setString(1, secretNumber);
  6. ps.setString(2, id);
  7. int count = ps.executeUpdate();
  8. System.out.println("updated %d rows", count);

字符串

lb3vh1jj

lb3vh1jj2#

由于您已经将列secretNumber创建为VARCHAR(20),因此在添加它之前,我将检查以确保secretNumber最多为20个字符。
第30章你有以下的

  1. secretNumber = "R" + env + id + randomDigit;

字符串
所以,你可以使用调试器,或者在第31行你可以把下面的。

  1. if (secretNumber.length() > 20) throw new Exception();


如果这不起作用,我想你可以尝试在值周围加上单引号。

  1. String updateSecretNumber =
  2. "UPDATE secret_number_generator " +
  3. "SET secret_number = '" + secretNumber + "' " +
  4. "WHERE id = '" + id + "'";


此外,不需要在单个语句的结尾处添加一个后缀。

展开查看全部

相关问题