我正在编写一个使用MySQL数据库的Java GUI应用程序。在此应用程序中,用户可以看到带有DB表行的JTable,并使用表单修改所选行的属性。我想只更新行的修改属性。我知道如果我使用PreparedStatement和占位符,我必须在String命令中指定每个SQL表的列
String command = "UPDATE table SET attr0 = ?, attr1 = ? WHERE id = ?";
PreparedStatement statement = connection.prepareStatement(command);
但这不是我想要的。而且,我的DB表有很多列,所以我不能对每个属性组合使用不同的String命令。
有人能帮助我吗?感谢。
答案 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(它有命名参数)。