Package cn.org.rapid_framework.jdbc.sqlgenerator

Source Code of cn.org.rapid_framework.jdbc.sqlgenerator.SpringNamedSqlGenerator

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 on table:"+table.getTableName());
  }

  public String getSelectByPkSql() {
    if(isMultiPrimaryKey()) {
      return getSelectByMultiPkSql();
    }else if(isSinglePrimaryKey()) {
      return getSelectBySinglePkSql();
    }
    throw new IllegalStateException("not found primary key on table:"+table.getTableName());
  }

  public String getUpdateByPkSql() {
    if(getPrimaryKeyColumns().size() == 0) {
      throw new IllegalStateException("not found primary key 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());
    }
  }


}
TOP

Related Classes of cn.org.rapid_framework.jdbc.sqlgenerator.SpringNamedSqlGenerator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.