我正在编写一个一次性Java程序,将CSV文件中的一堆行添加到MySQL数据库中。是否有任何Java类/工具包可以帮助解决这个问题?什么东西会逃脱必要的角色等? (例如准备好的陈述)
或者我应该自己编写语句,如下:
result += String.format(
"INSERT INTO node (type, language, title) VALUES (%s, %s, %s)",
node.get("type"), node.get("language"), node.get("title")
);
答案 0 :(得分: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();
}
答案 1 :(得分:2)
请参阅Using Prepared Statements教程中的此部分:
PreparedStatement对象的主要特性是,与Statement对象不同,它在创建时会被赋予一个SQL语句。这样做的好处是,在大多数情况下,此SQL语句会立即发送到DBMS,并在其中进行编译。因此,PreparedStatement对象不仅包含SQL语句,还包含已预编译的SQL语句。这意味着当执行PreparedStatement时,DBMS可以只运行PreparedStatement SQL语句而无需先编译它。
虽然PreparedStatement对象可用于没有参数的SQL语句,但您最常使用它们来获取带参数的SQL语句。 使用带参数的SQL语句的优点是,您可以使用相同的语句,并在每次执行时为其提供不同的值。以下各节的示例。
...
查看这些示例,您可能想知道为什么要选择使用带参数的PreparedStatement对象而不仅仅是简单语句,因为简单语句涉及的步骤更少。如果您只需要更新SALES列一次或两次,那么就不需要使用带有输入参数的SQL语句。 另一方面,如果要经常更新,则使用PreparedStatement对象可能要容易得多,尤其是在可以使用for循环或while循环将参数设置为一系列值的情况下。 / strong>
奇怪的是,本教程似乎没有提到使用PreparedStatement还可以让您自动转义特殊字符,有助于防止SQL注入等等 - 但这些都是主要的好处。
答案 2 :(得分:1)
您可能想查看DbUnit。它有一堆用于从XML和平面文件操作数据库的工具。
答案 3 :(得分:0)
这可能被认为是一种大锤方法,但你可能想考虑使用spring进行SQL调用,那么上面就变得如此简单:
getSimpleJdbcTemplate().update(
"INSERT INTO node (type, language, title) VALUES (?, ?, ?)",
node.get("type"),
node.get("language"),
node.get("title"));
这样做的好处就是在底层使用JDBC编写的语句,所以如果标题包含引号或其他必须转义的字符,同时让Spring处理所有连接,准备就绪,你就不会遇到麻烦了。声明和交易(如果需要的话)复杂性。