PreparedStatement 未执行正确的查询
PreparedStatement not executing with correct query
将准备好的语句放在具有不同查询字符串的 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 代码块中。
还是不行。
有几点不知道你真正想达到什么目的:
- 如果你想生成一个查询来删除记录,你能不能创建一个包含条件的查询来执行一次?
- 您是否遇到过事务提交问题?您要开始交易吗?
- 如果您的查询使用参数,我会在循环外准备 SQL 字符串和语句,并在执行前在循环中设置参数。
- 另外请确保您在显示代码的环境中没有任何其他疑问或问题。
然而,您的逻辑没有任何问题,尽管根据我的经验,我发现模式 (3) 更快一些,但我现在看不出代码有直接问题。
(但是还有一些其他问题,例如 count 是一个字符串,但它可能是一个命名问题。虽然更新会 return 一个数字,所以你再次转换为一个字符串但实际上不是使用 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;
将准备好的语句放在具有不同查询字符串的 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 代码块中。
还是不行。
有几点不知道你真正想达到什么目的:
- 如果你想生成一个查询来删除记录,你能不能创建一个包含条件的查询来执行一次?
- 您是否遇到过事务提交问题?您要开始交易吗?
- 如果您的查询使用参数,我会在循环外准备 SQL 字符串和语句,并在执行前在循环中设置参数。
- 另外请确保您在显示代码的环境中没有任何其他疑问或问题。
然而,您的逻辑没有任何问题,尽管根据我的经验,我发现模式 (3) 更快一些,但我现在看不出代码有直接问题。
(但是还有一些其他问题,例如 count 是一个字符串,但它可能是一个命名问题。虽然更新会 return 一个数字,所以你再次转换为一个字符串但实际上不是使用 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;