2010-01-22 4 views
2

Я пишу одноразовую программу Java, чтобы добавить кучу строк в CSV-файле в базу данных MySQL. Существуют ли какие-либо классы Java/инструментарий для этого? Что-то, что позволит избежать необходимых символов и т. Д.? (Например, подготовленных операторов)Java: написание SQL-инструкций

Или я просто пишу к заявлениям себя, как это:

result += String.format(
    "INSERT INTO node (type, language, title) VALUES (%s, %s, %s)", 
    node.get("type"), node.get("language"), node.get("title") 
); 

ответ

4

Если вы используете JDBC, используйте PreparedStatement. Этот класс избавит вас от необходимости избегать ваших входов вручную.

код будет выглядеть в основном как это (полностью из памяти - надеюсь, что я не упускать из виду что-то):

String sql = "INSERT INTO node (type, language, title) VALUES (?, ?, ?)"; 
PreparedStatement pstmt = conn.prepareStatement(sql); 
try 
{ 
    pstmt.setString(1, node.get("type")); 
    pstmt.setString(2, node.get("language")); 
    pstmt.setString(3, node.get("title")); 
    pstmt.executeUpdate(); 
} 
finally 
{ 
    pstmt.close(); 
} 
+2

не забудьте pstmt.executeUpdate(); – beny23

+0

и pstmt.close(); – Thilo

1

Вы можете проверить DbUnit. Он имеет множество инструментов для управления базами данных из XML и плоских файлов.

+0

хороший вариант использования для DbUnit, получает большие пальцы за то, что практично :) – fasseg

2

Смотрите этот раздел в учебнике по Using Prepared Statements:

Главной особенностью объекта PreparedStatement является то, что, в отличие от Statement объекта, оно дается оператор SQL, когда он будет создан. Преимущество этого заключается в том, что в большинстве случаев этот оператор SQL сразу отправляется в СУБД, где он компилируется. В результате объект PreparedStatement содержит не только инструкцию SQL, но и оператор SQL, который был предварительно скомпилирован. Это означает, что при выполнении PreparedStatement СУБД может просто запустить инструкцию PreparedStatement SQL без необходимости ее компиляции в первую очередь.

Хотя объекты PreparedStatement могут использоваться для операторов SQL без параметров, вы, вероятно, чаще всего используете их для операторов SQL, которые принимают параметры. Преимущество использования операторов SQL, принимающих параметры, заключается в том, что вы можете использовать один и тот же оператор и предоставлять его разными значениями каждый раз при его выполнении. Примеры этого в следующих разделах.

...

Глядя на эти примеры, вы можете спросить, почему вы выбрали бы использовать объект PreparedStatement с параметрами, а не только простое утверждение, так как простое утверждение включает в себя меньшее число шагов. Если вы собираетесь обновлять столбец SALES только один или два раза, тогда нет необходимости использовать инструкцию SQL с входными параметрами. Если вы будете часто обновлять, с другой стороны, было бы намного проще использовать объект PreparedStatement, особенно в ситуациях, когда вы можете использовать цикл for или while для установки параметра в последовательность значений.

Как ни странно, этот учебник, кажется, не говоря уже о том, что с помощью PreparedStatement также дает преимущество иметь специальные символы автоматически экранируются, что это помогает предотвратить инъекции SQL, и т.д. - но те основные преимущества.

0

Это можно было бы считать немного кувалдой подхода, но вы могли бы хотеть к рассмотрению с помощью пружины для вызовов SQL, то выше становится таким же простым, как:

getSimpleJdbcTemplate().update(
"INSERT INTO node (type, language, title) VALUES (?, ?, ?)", 
node.get("type"), 
node.get("language"), 
node.get("title")); 

Это имеет преимущество использования JDBC подготовлены statments под капотом, так что вы не будете в конечном итоге в беде, если название включает в кавычки или другие символы, которые в противном случае должны были быть экранированы , позволяя Spring обрабатывать всю связанную, подготовленную операционную и транзакционную (при необходимости вообще) сложность.

подробнее см: SimpleJdbcTemplate from the Spring Framework

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