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 代码块中。 还是不行。

有几点不知道你真正想达到什么目的:

  1. 如果你想生成一个查询来删除记录,你能不能创建一个包含条件的查询来执行一次?
  2. 您是否遇到过事务提交问题?您要开始交易吗?
  3. 如果您的查询使用参数,我会在循环外准备 SQL 字符串和语句,并在执行前在循环中设置参数。
  4. 另外请确保您在显示代码的环境中没有任何其他疑问或问题。

然而,您的逻辑没有任何问题,尽管根据我的经验,我发现模式 (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;