有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中SQL update语句的不同内容

我需要编写一个更新函数,其内容根据传递的参数不同而不同,例如,如果我有updateBook(int id, String title, String author, int pages),我必须执行以下操作:

String sql;
if((!title.equals("null"))&&(!author.equals("null"))&&(pages>0)))
        sql = "UPDATE book SET title='"+title+"', author='"+author+"', pages="+pages;
else if(((!title.equals("null"))&&(!author.equals("null")))
        sql = "UPDATE book SET title='"+title+"', author='"+author+"'";
else if(((!title.equals("null"))&&(pages>0)))
        sql = "UPDATE book SET title='"+title+"', pages="+pages;
... //and so on

sql = sql + " WHERE bookid="+id+";";

表中的字段越多,我需要做的检查就越多,这让人感到不舒服,需要我编写大量代码。 另外,做一些类似于:

sql = "UPDATE book SET ";
if(!title.equals("null"))
        sql = sql +"title='"+title+"',";
if(!author.equals("null"))
        sql = sql+"author='"+author+"',";
if(pages>0)
        sql = sql+"pages="+pages";
sql = sql + ";";

无法工作,因为不需要的逗号会导致语句错误。 您还可以看到,如果我有6、7、8等字段,那么检查开始变得太多,并且我不能再执行更多单独的更新语句,因为如果出现问题,我需要回滚在该函数中执行的任何查询

有没有办法让定制的update语句只需编写很少的代码


共 (1) 个答案

  1. # 1 楼答案

    首先,使用PreparedStatement
    我会像下面这样做

    List<Object> params = new ArrayList<>();
    StringBuilder sql = new StringBuilder();
    if(!title.equals("null")) {
       sql.append("title = ?");
       params.add(title);
    }
    if(!author.equals("null")) {
        if (sql.length() > 0) {
            sql.append(", ");
        }
        sql.append("author = ?");
        params.add(author);
    }
    if(pages>0) {
        if (sql.length() > 0) {
            sql.append(", ");
        }
        sql.append("pages = ?");
        params.add(pages);
    }
    if (sql.length() > 0) {
        sql.insert(0, "UPDATE book SET ");
        sql.append(" WHERE bookid=?");
        java.sql.Connection conn = // however you obtain it
        java.sql.PreparedStatement ps = conn.prepareStatement(sql.toString());
        for (int i = 0; i < params.size(); i++) {
            ps.setObject(i + 1, params.get(i));
        }
        ps.executeUpdate();
    }