将一个准备好的语句放在一个带有不同查询字符串的for循环中会以某种方式破坏它吗?
我有这个:
if(btn.equals("Continue")){
String[] vals1 = request.getParameterValues("Vals");
String count = "";
queryStr = AniModel.deleteQuery(vals1);
PreparedStatement ps = conn.prepareStatement(queryStr);
int update = ps.executeUpdate();
count = "" + update;
request.setAttribute("query",queryStr);
request.setAttribute("count",count);
RequestDispatcher dispatch = request.getRequestDispatcher("success4.jsp");
dispatch.forward(request, response);
}
它需要几个数组元素,用于调用我创建的DELETE查询:
public static String deleteQuery(String[] title){
String qry="DELETE FROM AnimeDatabase WHERE ";
for(int i=0;i < title.length;i++){
if (i>0) qry += " OR ";
qry += "ANI_TITLE='" + title[i] + "'";
}
return qry;
}
它从中获取数组值:
<%
String[] values = request.getParameterValues("cbg");
int countme=0;
int numb=1;
for(int i=0;i < values.length;i++){
countme++;
numb=countme;
%>
<tr><td><input type="hidden" name="Vals" value="<%out.println(values[i]);%>"id="vs_<%=(numb)%>"><%=values[i]%></td></tr>
<%
}
%>
它最终具有正确的查询输入,但它只是没有在数据库上执行更新。
编辑: 我希望在执行命令时实现这一点,它将执行循环并根据数组中有多少值执行语句,直到结束。
将其设为conn.setAutoCommit(false);
并将conn.commit();
放在Continue代码块中。
仍然无法工作。
答案 0 :(得分:1)
有几点不知道你真正希望实现的目标:
然而,你的逻辑没有任何问题,虽然从我的经验中发现模式(3)更快,但我现在看不到代码的直接问题。
(但是还有一些其他的问题,例如count是一个字符串,但它可能是一个命名问题。虽然更新会返回一个数字,所以你再次转换为一个字符串但实际上没有对count var做任何事情实质上它只包含以字符串格式影响的最后一行数)
对于选项1(和您的编辑)。有优化的空间:
String[] vals1 = request.getParameterValues("Vals");
int count = 0;
String sql = "DELETE FROM AnimeDatabase WHERE ";
for(int i=0; i < vals1.length; i++) {
if (i>0) sql += " OR ";
sql += "ANI_TITLE='" + vals1 + "'";
}
PreparedStatement ps = conn.prepareStatement(sql);
int update = ps.executeUpdate();
count = update;