PreparedStatement没有使用正确的查询执行

时间:2016-12-02 16:44:03

标签: java jdbc prepared-statement derby

将一个准备好的语句放在一个带有不同查询字符串的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 个答案:

答案 0 :(得分:1)

有几点不知道你真正希望实现的目标:

  1. 如果要生成DELETE记录的查询,是否可以创建一个包含执行一次的标准的查询?
  2. 您是否有任何机会遇到交易提交问题?你在开始交易吗?
  3. 如果你的查询是参数,我会在循环之外准备SQL字符串和语句,并在循环中设置参数,然后再执行。
  4. 另外,请确保您在所显示的代码周围没有任何其他查询或问题。
  5. 然而,你的逻辑没有任何问题,虽然从我的经验中发现模式(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;