Ошибка в синтаксисе запроса вставки SQL с использованием переменных - PullRequest
0 голосов
/ 11 декабря 2018

При попытке вставить запись в таблицу sql я использую 10 переменных для 10 столбцов в таблице, но, как и при выполнении запроса, выдается ошибка.Я пытался посмотреть, есть ли в моем коде опечатка, но не могу найти:

Исключение в потоке "main" java.sql.SQLSyntaxErrorException: у вас есть ошибка в синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с '', '2019', '12', '3', '10660', '2018-12-11', 'UTC', ''{"sleepIQScore": {"min": 0, "max" 'в строке 1

Мой код:

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");

}

1 Ответ

0 голосов
/ 11 декабря 2018

Вы никогда не должны объединять значения в строку запроса, подобную этой.Это небезопасно, поскольку открывает ваше приложение для внедрения 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...