带有if else的PreparedStatement

时间:2018-02-20 07:39:32

标签: java sql

我有这段代码

            sql="update rpttbl set salary= ?";
            PreparedStatement presptStmt2=conCreate.prepareStatement(sql);
            rs=rptStmt.executeQuery("select temp from rpttbl");
            while (rs.next()){
                System.out.println(rs.getString(1));
                rs2=st.executeQuery("select sa8 from sarchive where sempid="+rs.getString(1)+" and "
                        + "(sdate='"+Globals.year+"-"+Globals.date+"-28' or sdate='0000-00-00')");        
                if(!rs2.next()){
                    System.out.println("no records");
                    presptStmt2.setString(1,"000");
                    presptStmt2.addBatch();
                }  
                else{
                    System.out.println(rs2.getString(1));
                    presptStmt2.setString(1,rs2.getString(1));
                    presptStmt2.addBatch();
                }

            }
            presptStmt2.executeBatch();

执行后,所有行的(薪水)列都是“000”。 似乎else块中的prepStmt2从未执行但是(rs2.getString(1))工作得很好。

请帮助

1 个答案:

答案 0 :(得分:0)

更新查询没有条件:

update rpttbl set salary= ?

它将批量执行此查询,但只有最后一次执行才有意义,因为您更新了具有相同salary值的每一行。

为该查询添加条件并更新逻辑以将该ID添加到PreparedStatement

update rpttbl set salary= ? where some_id = ?

并且

prepStmt2.set***(2, <someId>);

仅供参考:你不应该相信你的数据:

rs2=st.executeQuery("select sa8 from sarchive where sempid="+rs.getString(1)+" and "
                    + "(sdate='"+Globals.year+"-"+Globals.date+"-28' or sdate='0000-00-00')");

您正在使用PreparedStatement,因此您了解SQL注入,但是当您从数据库本身连接值时,您可以找到一些注入。永远不要在SQL中推出String。 请改用PreparedStatement并使用可用的绑定参数传递参数。

我们昨天在Can this simple String escaping prevent any SQL Injections?上与answer from Tschallacka进行了此对话。