2015-08-06 3 views
1

Я знаю, что это было задано во многих аспектах, но я просто не в состоянии это сделать.Как избежать обратных косых черт в mysql с помощью JDBC?

Я хочу вставить что-то вроде \mytext в базу данных mysql, используя JDBC. Я попытался использовать метод замены Java String, чтобы найти все обратные косые черты и превратить их в двойные обратные косые черты. В самой Java, я должен бежать каждый обратный слэш на двойной обратной косой черты, так что в моем понимании это должно быть это:

String sqlProcessed = sqlString.replace("\\", "\\\\") 

Результирующая строка Я посылаю к базе данных с помощью вставки заявление, в окружении «одинарные кавычки "как это:

String query = "INSERT INTO table VALUES ('" + sqlProcessed + "')"; 

Однако, вместо того чтобы показывать ожидаемый результат, я получаю двойной обратный слеш в базе данных, то есть \\mytext. С другой стороны, без обработки обратная косая черта просто опускается, т. Е. Я получаю mytext в базе данных.

Что я делаю неправильно?

+0

Вы пытались заменить _to_ '\\\\' (три обратной косой черты)? – marekful

+0

@marekful Вы имеете в виду следующее: replace ("\\", "\\\")? Java не позволяет этого, третья обратная косая черта интерпретируется, чтобы избежать кавычек, которые вызывают меня из строки. –

ответ

2

Не связывайте значения в строку запроса (единственное допустимое исключение - если вам нужно динамически определять таблицы и имена столбцов).

Вместо этого вы должны использовать параметризованные (или подготовленные) заявления:

Например

try (PreparedStatement preparedStatement = connection.prepareStatement(
     "insert into myTable (column1, column2, column3) values (?, ?, ?)")) { 
    preparedStatement.setString(1, "value1"); 
    preparedStatement.setInt(2, 2); 
    preparedStatement.setString(3, "value3"); 
    preparedStatement.executeUpdate(); 
} 

Использование подготовленных заявлений будет устранить необходимость бежать в базе данных (либо водитель заботится об этом, или значения параметров отправляются на сервер таким образом, что не требуется экранирование), вам нужно только следить за нормальным стиранием Java String.

В качестве дополнительного бонуса вы можете получить многоразовый оператор, который вы можете выполнять несколько раз с разными значениями. И на большинстве систем баз данных (но IIRC не на MySQL с настройками по умолчанию для драйвера Connector/J), использование подготовленных операторов может (и обычно будет) иметь преимущество в производительности при повторном использовании.

+0

Хорошо, я понял. Благодаря! Я очень новичок в JDBC ... Поэтому я сделал все это с регулярными утверждениями. Теперь мне придется переопределить ядро ​​моей связи с базой данных. Есть ли причина не использовать PreparedStatements или я могу просто полностью переключиться на них? –

+1

Для DDL подготовленный оператор не очень полезен, но кроме этого: используйте 'PreparedStatement' (или' CallableStatement' для хранимых процедур), если только не существует очень веской причины. –

+1

Большое вам спасибо. Раньше я знал PreparedStatements, но я не понял, почему они так полезны. Это было довольно немного усилий, но мой код теперь намного чище! –

-1

Я предлагаю вам использовать параметры запроса вместо запроса с параметрами. Водитель поможет вам прокормить.

+1

Как бы я это сделал? –

Смежные вопросы