Я хочу создать инструкцию update с несколькими предложениями набора. Проблема в том, что некоторые из этих параметров могут быть нулевыми (не все из них). Мне нужно поставить запятую перед этими утверждениями, но я не знаю, как справиться с этим эффективно. Есть какой-либо способ сделать это?
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
Вот моя функция;
public static void update(value1, value2, value3){
String sql = "UPDATE table SET ";
//I need to check if these values are not null then I need to add them to sql string.
sql += " WHERE condition";
}
Мое решение;
int count = 0;
if(value1 != null){
if(count == 0) {
sql += "column1 = value1";
} else {
sql += ", column1 = value1";
}
count++;
}
if(value2 != null){
if(count == 0) {
sql += "column2 = value2";
} else {
sql += ", column2 = value2";
}
count++;
}
if(value3 != null){
if(count == 0) {
sql += "column3 = value3";
} else {
sql += ", column3 = value3";
}
count++;
}
Попробуйте использовать карту, где ключ будет именем столбца, а значение - значением столбца, примерно так:
public static String addSetValue(Map<String, Object> fieldMap) {
StringBuilder setQueryPart = new StringBuilder();
for (Map.Entry<String, ? extends Object> entry: fieldMap.entrySet()) {
if (entry.getValue() != null){
setQueryPart.append(entry.getKey() + " = " +entry.getValue() + ", ");
}
}
//Remove last comma, since we don't need it.
setQueryPart.deleteCharAt(setQueryPart.lastIndexOf(","));
return setQueryPart.toString();
}
Затем вы просто передаете карту, которую вы предварительно заполнили, и добавьте строку возврата в строку запроса.
Во-первых, создайте быстрый бит для хранения ключа и значения
class Token{
private String key, value;
public Token(String key, String value) {
this.key = key;
this.value = value;
}
}
Затем используйте Stream
для:
Token
Быстрый тест:
List<Token> list = new ArrayList<>();
list.add(new Token("A", "Foo"));
list.add(new Token("B", null));
list.add(new Token("C", "Bar"));
String query =
String.join(",",
list.stream()
.filter(t -> t.value != null)
.map(t -> t.key + "=" +t.value)
.toArray(String[]::new)
);
System.out.print(query);
А = Foo, С = бар
Другое решение для использования с PreparedStatement
:
//remove every null values
list.removeIf(t -> t.value == null);
//Build the query with parameters ?
query =
String.join(",",
list.stream()
.filter(t -> t.value != null)
.map(t -> t.key + "=?")
.toArray(String[]::new)
);
System.out.println(query);
А = С =?,?
И список имеет соответствующие параметры.