package cn.org.rapid_framework.jdbc.sqlgenerator;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import cn.org.rapid_framework.jdbc.sqlgenerator.metadata.Column;
import cn.org.rapid_framework.jdbc.sqlgenerator.metadata.Table;
/**
* spring的命名参数sql生成工具类
* @see Table
* @author badqiu
*
*/
public class SpringNamedSqlGenerator implements SqlGenerator{
Table table;
public SpringNamedSqlGenerator(Table table) {
super();
this.table = table;
}
public List<Column> getColumns() {
return table.getColumns();
}
public String getTableName() {
return table.getTableName();
}
public List<Column> getPrimaryKeyColumns() {
return table.getPrimaryKeyColumns();
}
public Table getTable() {
return table;
}
public boolean isMultiPrimaryKey() {
return getPrimaryKeyColumns().size() > 1;
}
public boolean isSinglePrimaryKey() {
return getPrimaryKeyColumns().size() == 1;
}
public String getInsertSql() {
StringBuilder sb = new StringBuilder("INSERT INTO ").append(getTableName()).append(" (");
List<String> insertColumns = new ArrayList(getColumns().size());
List<String> insertPlaceholderColumns = new ArrayList(getColumns().size());
for(int i = 0; i < getColumns().size(); i++) {
Column c = getColumns().get(i);
if(c.isInsertable()) {
insertColumns.add(c.getSqlName());
insertPlaceholderColumns.add(getColumnPlaceholder(c));
}
}
sb.append(StringUtils.join(insertColumns.iterator(), ","));
sb.append(" ) VALUES ( ");
sb.append(StringUtils.join(insertPlaceholderColumns.iterator(), ","));
sb.append(" ) ");
return sb.toString();
}
public String getDeleteByPkSql() {
if(isMultiPrimaryKey()) {
return getDeleteByMultiPkSql();
}else if(isSinglePrimaryKey()) {
return getDeleteBySinglePkSql();
}
throw new IllegalStateException("not found primary key config on table:"+table.getTableName());
}
public String getSelectByPkSql() {
if(isMultiPrimaryKey()) {
return getSelectByMultiPkSql();
}else if(isSinglePrimaryKey()) {
return getSelectBySinglePkSql();
}
throw new IllegalStateException("not found primary key config on table:"+table.getTableName());
}
public String getUpdateByPkSql() {
if(getPrimaryKeyColumns().size() == 0) {
throw new IllegalStateException("not found primary key config on table:"+table.getTableName());
}
StringBuilder sb = new StringBuilder("UPDATE ").append(getTableName()).append(" SET ");
sb.append(StringUtils.join(getUpdateColumns().iterator(), ","));
sb.append(" WHERE ");
for(int i = 0; i < getPrimaryKeyColumns().size(); i++) {
Column c = getPrimaryKeyColumns().get(i);
sb.append(c.getSqlName()+" = "+getColumnPlaceholder(c));
if(i < getPrimaryKeyColumns().size() - 1)
sb.append(" AND ");
}
return sb.toString();
}
private List getUpdateColumns() {
List<Column> columns = getColumns();
List updateColumns = new ArrayList(columns.size());
for(int i = 0; i < columns.size(); i++) {
Column c = columns.get(i);
if(c.isUpdatable() && !c.isPrimaryKey()) {
updateColumns.add(c.getSqlName() + " = "+getColumnPlaceholder(c));
}
}
return updateColumns;
}
public String getDeleteByMultiPkSql() {
StringBuilder sb = new StringBuilder("DELETE FROM ").append(getTableName());
sb.append(" WHERE ");
List<Column> primaryKeyColumns = getPrimaryKeyColumns();
for(int i = 0; i < primaryKeyColumns.size(); i++) {
Column c = primaryKeyColumns.get(i);
sb.append(c.getSqlName()+" = "+getColumnPlaceholder(c));
if(i < primaryKeyColumns.size() - 1)
sb.append(" AND ");
}
return sb.toString();
}
public String getDeleteBySinglePkSql() {
checkIsSinglePrimaryKey();
List<Column> primaryKeyColumns = getPrimaryKeyColumns();
StringBuilder sb = new StringBuilder("DELETE FROM ").append(getTableName());
sb.append(" WHERE ");
sb.append(getSinglePrimaryKeyWhere());
return sb.toString();
}
public String getSelectByMultiPkSql() {
StringBuilder sb = new StringBuilder("SELECT "+getColumnsSql()+" FROM " + getTableName()+" WHERE ");
List<Column> primaryKeyColumns = getPrimaryKeyColumns();
for(int i = 0; i < primaryKeyColumns.size(); i++) {
Column c = primaryKeyColumns.get(i);
sb.append(c.getSqlName()+" = "+getColumnPlaceholder(c));
if(i < primaryKeyColumns.size() - 1)
sb.append(" AND ");
}
return sb.toString();
}
public String getSelectBySinglePkSql() {
checkIsSinglePrimaryKey();
List<Column> primaryKeyColumns = getPrimaryKeyColumns();
StringBuilder sb = new StringBuilder("SELECT "+getColumnsSql()+" FROM " + getTableName()+" WHERE ");
sb.append(getSinglePrimaryKeyWhere());
return sb.toString();
}
public String getColumnsSql() {
return getColumnsSql(null);
}
public String getColumnsSql(String columnPrefix) {
String realPrefix = StringUtils.isEmpty(columnPrefix) ? "" : columnPrefix+".";
StringBuilder sb = new StringBuilder();
for(int i = 0; i < getColumns().size(); i++) {
Column c = getColumns().get(i);
sb.append(realPrefix+c.getSqlName()+" " + c.getPropertyName());
if(i < getColumns().size() - 1)
sb.append(",");
}
return sb.toString();
}
protected String getColumnPlaceholder(Column c) {
return ":"+c.getPropertyName();
}
protected String getSinglePrimaryKeyWhere() {
Column c = getPrimaryKeyColumns().get(0);
return c.getSqlName()+" = ?";
}
private void checkIsSinglePrimaryKey() {
if(getPrimaryKeyColumns().size() != 1) {
throw new IllegalStateException("expected single primary key on table:"+getTableName()+",but was primary keys:"+getPrimaryKeyColumns());
}
}
}