使用Prepared Statement进行选择性更新

时间:2012-10-17 02:36:26

标签: java mysql prepared-statement

我有一个更新MySQL表的函数。我需要根据参数是否存在来选择性地更新字段。这就是我现在编码的方式。

        String sql =  "";
        if (employerId > 0) sql = sql + "employerid=?,";
        if (status != null) sql += " status=?,";
        if(printurl != null) sql += " url=?";
        if (sql.endsWith(",")) sql = sql.substring(0, sql.length()-1);
        PreparedStatement ps = con.prepareStatement("update employer set "
                + sql
                + "where id=?");

       if (employerId > 0) ps.setInt(1, employerId);
       if (status != null) ps.setString(2,status);

当我这样做时,如何确定参数索引?根据存在的参数(如果条件),参数索引也会有所不同,对吧?我该如何解决这个问题?有没有更好的方法在Java中处理这个?

4 个答案:

答案 0 :(得分:2)

你可以试试下面的静态查询吗?

String sql =  "update employer set employerid=IF(?=0,employerid,?),"+
              "status=IFNULL(?,status), url=IFNULL(?,url) " +
              "where id=?";

从概念上讲,如果是0null,我建议您自行更新列。这样,您无需创建动态查询字符串或动态设置参数。

答案 1 :(得分:1)

SqlBuilder库提供了一种在java程序中生成动态SQL查询的更好方法。 QueryPreparer类通过跟踪索引来专门解决您在此遇到的问题。

免责声明,我是SqlBuilder项目的主要开发人员。

答案 2 :(得分:1)

如何使用 arraylist ?当您首先检查是否存在参数时,请添加到arraylist。之后,迭代数组列表并设置参数。在这种情况下,

  

它不仅可以确定参数索引,还可以避免使用   检查参数再次存在。

喜欢那个

List paramList = new ArrayList<Object>();

         if (employerId > 0) {
             sql = sql + "employerid=? ,";
             paramList.add(employerId);
         }
         if (status != null) { 
             sql += " status=? ,";
             paramList.add(status);
         }
         if(printurl != null) {
             sql += " url=? ";
             paramList.add(printurl);
         }
         if (sql.endsWith(",")) 
             sql = sql.substring(0, sql.length()-1);

         PreparedStatement ps = con.prepareStatement("update employer set " + sql + "where id=?");

         for(int i=0; i< paramList.size(); i++) {
             if(paramList.get(i) instanceof Integer) {
                 ps.setInt((i + 1), (Integer)paramList.get(i));
             }
             else if(paramList.get(i) instanceof String) {
                 ps.setString((i + 1), (String)paramList.get(i));
             }
         }
         System.out.println(ps);

答案 3 :(得分:0)

请参阅以下代码:

       String sql =  "update employer set ";
        boolean hasParam = false;
        if (employerId > 0){
                sql += " employerid=? ";
                hasParam = true;
        }
        if (status != null){
            if(hasParam){
                sql += " , ";
            }
            sql += " status=? ";
            hasParam = true;
        }
        if(printurl != null){
            if(hasParam){
                sql += " , ";
            }
            sql += " url=?";
        }
        sql += " where id=?";
        PreparedStatement ps = con.prepareStatement(sql);

       int index = 1;
       if(employerId > 0){
           ps.setInt(index++, employerId);
       }
       if(status != null){
           ps.setString(index++, status);
       }
       if(printurl != null){
           ps.setString(index++, printurl);
       }
       ps.setInt(index, id);