sql update语句无法正常执行

时间:2011-10-20 13:52:01

标签: java sql

我遇到更新查询问题。以下是我正在调用的函数:

    public static void update(ArrayList<String> arr, int id)
    {   
        Connection conn = null;
        System.out.println(lineArr.size());
        try
        {

        Class.forName ("com.mysql.jdbc.Driver").newInstance();
        conn = DriverManager.getConnection (url,userName,password);

        for(int i=0;i<arr.size();i++)
        {
        String currentLine = arr.get(i);
        //process the string
        int lastSlash=currentLine.lastIndexOf("\\"); 
        String location=currentLine.substring(0, lastSlash+1);
            location=location.replace("\\", "\\\\");
        String name=currentLine.substring(lastSlash+1);         

        String query=" UPDATE tbl1 " +
                 " set tbl1.id= ?"+
                 " where tbl1.sid =(select tbl2.sid from tbl2 " +
                       "where tbl2.cl=? and tbl2.cl2=?)";
            PreparedStatement psmt = conn.prepareStatement(query);
                    psmt.setString(1, id+"");
            psmt.setString(2, location);
            psmt.setString(3, name);
                    System.out.println(psmt1.toString());
            psmt.executeUpdate();
            System.out.println("-----------------------------------------------");
        }//for
        //conn.close();
    }
    catch (Exception e)
    {
        System.out.println(e.getMessage());
        e.printStackTrace();
    }
}

以下是打印输出:

2

    com.mysql.jdbc.JDBC4PreparedStatement@ffcd87:  UPDATE tb1  set tbl1.id= '391' WHERE tbl1.sid =(select tbl2.id from tbl2 where tbl2.location='src\\ps\\' and tbl2 .name='test.cxx')
    -----------------------------------------------
    **com.mysql.jdbc.JDBC4PreparedStatement@e7e7b:   UPDATE tb1  set tbl1.id= '391' WHERE tbl1.sid =(select tbl2.id from tbl2 where tbl2.location='\nsrc\\ps\\' and tbl2 .name='test.hxx')**

请注意,准备好的语句如何在位置的开头添加\n

4 个答案:

答案 0 :(得分:1)

您应该使用PreparedStatement。否则,您需要关闭语句并在每个循环中重新打开。

如果您使用的是PreparedStatement,则可以在循环外部移动查询定义。在循环内部,您可以使用批量插入,即stmt.addBatch();然后最后在循环之外,你可以做一个stmt.executeBatch();

conn = DriverManager.getConnection (url,userName,password);


String query=" UPDATE tbl1 " +
         " set id= ? "+
         " where sid =(select sid from tbl2 " +
               "where tbl2.cl= ? and tbl2.cl2= ?)";
PreparedStatement stmt=conn.createStatement(query);


for(int i=0;i<lineArr.size();i++)
{
  String currentLine = arr.get(i);
  int lastSlash=currentLine.lastIndexOf("\\"); 
  String location=currentLine.substring(0, lastSlash+1);
      location=location.replace("\\", "\\\\");
  String name=currentLine.substring(lastSlash+1);         

  stmt.setString(1,id);
  stmt.setString(2, location);
  stmt.setString(3, name);

  stmt.addBatch();

}//for

int count=stmt.executeBatch();

答案 1 :(得分:1)

基本上,通过连接字符串构建sql语句不是一个好主意。您应该考虑使用PreparedStatement来查询数据库。 使用Prepared Statement时,您应该在循环外创建它,只更新参数。

PreparedStatement statement = con.prepareStatement("UPDATE table SET attr1 = ? WHERE attr2 = ?");
statement.setString(1, "something new");
statement.setString(2, someNumber);
statement.executeUpdate();

statement.setString(1, "something else");
statement.setString(2, anotherNumber);
statement.executeUpdate();

PreparedStatement的使用有两个主要优点:

  • 通常,如果经常执行相同的查询,性能会更好
  • 它更安全(类型安全)和安全(没有sql注入)

更多(如不同答案中所述)PreparedStatement提供了批量执行作业的可能性。基本上这意味着您收集所有操作并一次执行所有操作。这也可以显着提高应用程序的性能。

答案 2 :(得分:0)

我的猜测是你的数据中有反斜杠,你试图删除它。也许您的替换逻辑不能处理您的数据,并且一些反斜杠正在将其转换为您的SQL语句并将其破坏。请改用预备语句。

或者你对id有唯一的索引吗?

答案 3 :(得分:0)

lineArr.size()不应该是arr.size()吗?当你在循环中做arr.get(i)时。