package liquibase.statement; import static liquibase.util.SqlUtil.replacePredicatePlaceholders; import liquibase.change.ColumnConfig; import liquibase.changelog.ChangeSet; import liquibase.database.Database; import liquibase.resource.ResourceAccessor; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class UpdateExecutablePreparedStatement extends ExecutablePreparedStatementBase { private String whereClause; private List<String> whereColumnNames = new ArrayList<String>(); private List<Object> whereParameters = new ArrayList<Object>(); public UpdateExecutablePreparedStatement(Database database, String catalogName, String schemaName, String tableName, List<ColumnConfig> columns, ChangeSet changeSet, ResourceAccessor resourceAccessor) { super(database, catalogName, schemaName, tableName, columns, changeSet, resourceAccessor); } @Override public boolean continueOnError() { return false; } @Override protected String generateSql(List<ColumnConfig> cols) { StringBuilder sql = new StringBuilder("UPDATE ").append(database.escapeTableName(getCatalogName(), getSchemaName(), getTableName())); StringBuilder params = new StringBuilder(" SET "); for(ColumnConfig column : getColumns()) { params.append(database.escapeColumnName(getCatalogName(), getSchemaName(), getTableName(), column.getName())); params.append(" = "); params.append("?, "); cols.add(column); } params.deleteCharAt(params.lastIndexOf(" ")); params.deleteCharAt(params.lastIndexOf(",")); sql.append(params); if (getWhereClause() != null) { sql.append(" WHERE ").append(replacePredicatePlaceholders(database, getWhereClause(), getWhereColumnNames(), getWhereParameters())); } return sql.toString(); } public String getWhereClause() { return whereClause; } public UpdateExecutablePreparedStatement setWhereClause(String whereClause) { this.whereClause = whereClause; return this; } public UpdateExecutablePreparedStatement addWhereParameter(Object value) { this.whereParameters.add(value); return this; } public UpdateExecutablePreparedStatement addWhereParameters(Object... value) { this.whereParameters.addAll(Arrays.asList(value)); return this; } public UpdateExecutablePreparedStatement addWhereColumnName(String value) { this.whereColumnNames.add(value); return this; } public List<Object> getWhereParameters() { return whereParameters; } public List<String> getWhereColumnNames() { return whereColumnNames; } }