带有可选属性的Java SQL PreparedStatement UPDATE

时间:2013-12-14 12:23:24

标签: java sql jdbc sql-update prepared-statement

我正在编写一个使用MySQL数据库的Java GUI应用程序。在此应用程序中,用户可以看到带有DB表行的JTable,并使用表单修改所选行的属性。我想只更新行的修改属性。我知道如果我使用PreparedStatement和占位符,我必须在String命令中指定每个SQL表的列

String command = "UPDATE table SET attr0 = ?, attr1 = ? WHERE id = ?";
PreparedStatement statement = connection.prepareStatement(command);

但这不是我想要的。而且,我的DB表有很多列,所以我不能对每个属性组合使用不同的String命令。

有人能帮助我吗?感谢。

1 个答案:

答案 0 :(得分:1)

不幸的是,对于直接JDBC,您可以做的最好是动态构建SET子句(请参阅下面的粗略代码示例)。 JDBC无法处理可选参数,如果在执行之前并未绑定所有参数,则会抛出异常。

`     //'columns'假定为Map     //'id'是一个字符串

List<String> setClauses = new ArrayList<String>();
for (String key : columns.keySet()) {
    setClauses.add(String.format("%s=?", key));
}

// StringUtils is from Apache Commons Lang
// although it's pretty easy to build your own join routine. 
String command = String.format("UPDATE table SET %s WHERE id=?"
    , StringUtils.join(setClauses, ",")
);

PreparedStatement statement = connection.prepareStatement(command);
int p = 1;
for (String key : columns.keySet()) {
    statement.setString(p++, columns.get(key));
}
statement.setString(p++, id);

`

JDBC也没有命名参数,所以这就是你必须进行递增的原因。如果你能够做到这一点,我建议调查Hibernate(允许使用JavaBeans)或Spring JDBCTemplate(它有命名参数)。