我遇到更新查询问题。以下是我正在调用的函数:
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
答案 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的使用有两个主要优点:
更多(如不同答案中所述)PreparedStatement提供了批量执行作业的可能性。基本上这意味着您收集所有操作并一次执行所有操作。这也可以显着提高应用程序的性能。
答案 2 :(得分:0)
我的猜测是你的数据中有反斜杠,你试图删除它。也许您的替换逻辑不能处理您的数据,并且一些反斜杠正在将其转换为您的SQL语句并将其破坏。请改用预备语句。
或者你对id有唯一的索引吗?
答案 3 :(得分:0)
lineArr.size()不应该是arr.size()吗?当你在循环中做arr.get(i)时。