我有一个更新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中处理这个?
答案 0 :(得分:2)
你可以试试下面的静态查询吗?
String sql = "update employer set employerid=IF(?=0,employerid,?),"+
"status=IFNULL(?,status), url=IFNULL(?,url) " +
"where id=?";
从概念上讲,如果是0
或null
,我建议您自行更新列。这样,您无需创建动态查询字符串或动态设置参数。
答案 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);