package com.github.ltsopensource.store.jdbc.builder; import com.github.ltsopensource.core.commons.utils.StringUtils; import com.github.ltsopensource.core.logger.Logger; import com.github.ltsopensource.core.logger.LoggerFactory; import com.github.ltsopensource.store.jdbc.SQLFormatter; import com.github.ltsopensource.store.jdbc.SqlTemplate; import com.github.ltsopensource.store.jdbc.exception.JdbcException; import java.sql.SQLException; import java.util.LinkedList; import java.util.List; /** * @author Robert HG (254963746@qq.com) on 3/9/16. */ public class UpdateSql { private static final Logger LOGGER = LoggerFactory.getLogger(UpdateSql.class); private SqlTemplate sqlTemplate; private StringBuilder sql = new StringBuilder(); private List<Object> params = new LinkedList<Object>(); public UpdateSql(SqlTemplate sqlTemplate) { this.sqlTemplate = sqlTemplate; } public UpdateSql update() { sql.append("UPDATE "); return this; } public UpdateSql table(String table) { sql.append(" `").append(table).append("` "); return this; } public UpdateSql set(String column, Object value) { if (params.size() > 0) { sql.append(","); } else { sql.append(" SET "); } sql.append("`").append(column).append("`").append(" = ? "); params.add(value); return this; } public UpdateSql setOnNotNull(String column, Object value) { if (value == null) { return this; } return set(column, value); } public UpdateSql where() { sql.append(" WHERE "); return this; } public UpdateSql whereSql(WhereSql whereSql) { sql.append(whereSql.getSQL()); params.addAll(whereSql.params()); return this; } public UpdateSql where(String condition, Object value) { sql.append(" WHERE ").append(condition); params.add(value); return this; } public UpdateSql and(String condition, Object value) { sql.append(" AND ").append(condition); params.add(value); return this; } public UpdateSql or(String condition, Object value) { sql.append(" OR ").append(condition); params.add(value); return this; } public UpdateSql and(String condition) { sql.append(" AND ").append(condition); return this; } public UpdateSql or(String condition) { sql.append(" OR ").append(condition); return this; } public UpdateSql andOnNotNull(String condition, Object value) { if (value == null) { return this; } return and(condition, value); } public UpdateSql orOnNotNull(String condition, Object value) { if (value == null) { return this; } return or(condition, value); } public UpdateSql andOnNotEmpty(String condition, String value) { if (StringUtils.isEmpty(value)) { return this; } return and(condition, value); } public UpdateSql orOnNotEmpty(String condition, String value) { if (StringUtils.isEmpty(value)) { return this; } return or(condition, value); } public UpdateSql andBetween(String column, Object start, Object end) { if (start == null && end == null) { return this; } if (start != null && end != null) { sql.append(" ADN (").append(column).append(" BETWEEN ? AND ? ").append(")"); params.add(start); params.add(end); return this; } if (start == null) { sql.append(column).append(" <= ? "); params.add(end); return this; } sql.append(column).append(" >= ? "); params.add(start); return this; } public UpdateSql orBetween(String column, Object start, Object end) { if (start == null && end == null) { return this; } if (start != null && end != null) { sql.append(" OR (").append(column).append(" BETWEEN ? AND ? ").append(")"); params.add(start); params.add(end); return this; } if (start == null) { sql.append(column).append(" <= ? "); params.add(end); return this; } sql.append(column).append(" >= ? "); params.add(start); return this; } public int doUpdate() { String finalSQL = getSQL(); try { if (LOGGER.isDebugEnabled()) { LOGGER.debug(SQLFormatter.format(finalSQL)); } return sqlTemplate.update(finalSQL, params.toArray()); } catch (SQLException e) { throw new JdbcException("Update SQL Error:" + SQLFormatter.format(finalSQL), e); } } public String getSQL() { return sql.toString(); } }