java—使用变量的sql insert查询语法错误

qjp7pelc  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(347)

在尝试在sql表中插入一条记录时,我对表中的10列使用了10个变量,但是当我运行查询时,它抛出了一个错误。我试过查找代码中是否有任何拼写错误,但找不到:
线程“main”java.sql.sqlsyntaxerrorexception中的异常:您的sql语法有错误;检查与您的mysql服务器版本对应的手册,以了解在第1行的“'、'2019'、'12'、'3'、'10660'、'2018-12-11'、'utc'、'{“sleepiqscore”:{“min”:0,“max”'附近使用的正确语法
我的代码是:

public void insertDataTable1() throws SQLException {
    connection = new MyConnection().getConnection();
    Random random = new Random();
    String timeZone = "UTC";
    String dummyJson = "'{\"sleepIQScore\": {\"min\": 0, \"max\": 0, \"sum\": 0, \"count\": 0}}')";
    int longestSessionDuration = 1000 + random.nextInt(9999), bamUserID = 1000000 + random.nextInt(9999999);
    int year = 2019, month = 12, sleepSessionCount =3;
    java.sql.Date longestSessionStart = new java.sql.Date(Calendar.getInstance().getTime().getTime());

    String sql = "INSERT INTO aggregates_all_time(bam_user,year,month,sleep_session_count," +
            "longest_session_total_duration,longest_session_start,timezone, current_stats, second_longest_session_stats, prior_stats)"
            + "VALUES ("+bamUserID+"','"+year+"','"+month+"','"+sleepSessionCount+"','"+longestSessionDuration+"','" +
            ""+longestSessionStart+"','"+timeZone+"','"+dummyJson+" ','"+dummyJson+"','"+dummyJson+")";

    PreparedStatement preparedStatement = connection.prepareStatement(sql);
    int i = preparedStatement.executeUpdate();
    System.out.println(i + " Row/s inserted");

}
efzxgjgh

efzxgjgh1#

决不能像这样将值串联到查询字符串中。它是不安全的,因为它会将应用程序打开到sql注入,而sql注入是导致安全问题的主要原因之一。此外,由于缺少引号等原因,它还会导致像您的问题这样的错误。
但是,解决方案不是添加那些缺少的引号,因为这仍然会使您面临sql注入风险。相反,您需要在执行之前使用参数并设置这些参数的值。
根据您的问题中的查询,简化了一个示例:

try (PreparedStatement preparedStatement = connection.prepareStatement(
        "INSERT INTO aggregates_all_time(bam_user, year, month, ..) values (?, ?, ?, ..)")) {
    preparedStatement.setInt(bamUserID);
    preparedStatement.setInt(year);
    preparedStatement.setInt(month);
    // other values

    preparedStatement.executeUpdate();
}

另请参见jdbc教程中的使用准备好的语句。

相关问题