Вставьте переменную Java, используя Java в SQL - PullRequest
5 голосов
/ 13 февраля 2010

Я пытался сделать:

 String sql = "INSERT INTO CURRENT_WEATHER_US VALUES("+city_code+",   
"+object.city+","+object.region+","+object.country+","+object.wind_chill+",  
"+object.wind_direction+", "+object.wind_speed+","+object.humidity+","+object.visibility+", 
"+object.pressure+","+object.rising+",  
"+object.sunrise+","+object.sunset+","+object.textual_description+",  
"+object.condition_code+","+object.temp+","+object.for_temp_high+",  
"+object.for_temp_low+","+object.for_description+","+object.forecast_code+")";   

  stmt.execute(sql);  

Ошибка отсутствует запятая

Пожалуйста, помогите

Ответы [ 3 ]

27 голосов
/ 13 февраля 2010

Это не совсем тот способ, которым вы должны создавать и выполнять запрос SQL INSERT с переменными. Это не только склонно к атакам SQL-инъекций , но и довольно .. громоздко;) Возможно, значение содержало одинарную кавычку и приводило к тому, что ваш запрос был синтаксически неверным.

Только не объединяйте строки в переменную SQL. Вместо этого используйте PreparedStatement ( учебник здесь ) в сочетании с ? в качестве заполнителя для переменной в строке SQL. Таким образом, вы можете красиво разместить полноценные объекты Java (включая Date и InputStream!) В выражении SQL по индексу значения, не беспокоясь о символах в строках, которые могут синтаксически нарушать запрос SQL (и, следовательно, также вызывать риски внедрения SQL).

Вот базовый пример, основанный на вашем исходном запросе SQL:

private static final String SQL_INSERT = "INSERT INTO CURRENT_WEATHER_US"
    + " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

public void create(String cityCode, Weather weather) throws SQLException {
    try (
        Connection connection = database.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL_INSERT);
    ) {
        statement.setString(1, cityCode);
        statement.setString(2, weather.getCity());
        statement.setString(3, weather.getRegion());
        // ...
        statement.setString(20, weather.getForecastCode());
        statement.executeUpdate();
    }
}

Чтобы узнать больше об использовании basic JDBC надлежащим образом, вы можете найти эту статью полезной.

Надеюсь, это поможет.

3 голосов
/ 13 февраля 2010

Вы должны изучить использование PrepairedStatements вместо построения строк. Они быстрее и заботятся о многих ловушках, связанных с цитированием и экранированием значений.

0 голосов
/ 13 февраля 2010

Как и все остальные говорят, вы действительно должны преобразовать его в PreparedStatements по ряду причин. Скорее всего, вы получаете ошибку (вы не опубликовали точную ошибку ORA), потому что вы передаете значения типа String, но вы не заключили их в одинарные кавычки в своем жестко закодированном запросе.

Если textual_description и for_description, где в вашем запросе только столбцы типа String, то ваш запрос должен выглядеть следующим образом:

String sql = "INSERT INTO CURRENT_WEATHER_US VALUES( " +
    city_code + ", " +
    object.city + ", " +
    object.region + ", " +
    object.country + ", " +
    object.wind_chill  + ", " +
    object.wind_direction + ", " +
    object.wind_speed + ", " +
    object.humidity + ", " +
    object.visibility + ", " +
    object.pressure + ", " +
    object.rising + ", " +
    object.sunrise + ", " +
    object.sunset + ", " +
    "'" + object.textual_description + "', " +
    object.condition_code + ", " +
    object.temp + ", " +
    object.for_temp_high + ", " +
    object.for_temp_low + ", " +
    "'" + object.for_description + "', " +
    object.forecast_code + 
    " )";   

stmt.execute(sql);  

Обратите внимание на одинарные кавычки, окружающие эти значения.

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