Java:编写SQL语句

时间:2010-01-22 00:43:46

标签: java sql

我正在编写一个一次性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")
);

4 个答案:

答案 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处理所有连接,准备就绪,你就不会遇到麻烦了。声明和交易(如果需要的话)复杂性。

有关详情,请参阅:SimpleJdbcTemplate from the Spring Framework