package com.taobao.yugong.common.db.sql;
import java.util.List;
import com.taobao.yugong.common.db.meta.ColumnMeta;
/**
* sql构造
*
* @author agapple 2013-9-10 下午6:10:10
* @since 1.0.0
*/
public class SqlTemplate {
private static final String DOT = ".";
/**
* 根据字段的列表顺序,拼写以 col1,col2,col3,....
*/
public String makeColumn(List<ColumnMeta> columns) {
StringBuilder str = new StringBuilder();
int size = columns.size();
for (int i = 0; i < size; i++) {
str.append(getColumnName(columns.get(i)));
if (i < (size - 1)) {
str.append(",");
}
}
return str.toString();
}
/**
* 根据字段的列表顺序,拼写以 ?,?,?,....
*/
public String makeInsert(List<ColumnMeta> columns) {
StringBuilder str = new StringBuilder();
int size = columns.size();
for (int i = 0; i < size; i++) {
str.append('?');
if (i < (size - 1)) {
str.append(",");
}
}
return str.toString();
}
/**
* 根据字段的列表顺序,拼写 column1=?,column2=?,column3=?,...
*/
public String makeUpdate(List<ColumnMeta> columns) {
StringBuilder str = new StringBuilder();
int size = columns.size();
for (int i = 0; i < size; i++) {
str.append(getColumnName(columns.get(i)));
str.append("=?");
if (i < (size - 1)) {
str.append(",");
}
}
return str.toString();
}
/**
* 根据字段列表,拼写column=? and column=? and ...字符串
*/
public String makeWhere(List<ColumnMeta> columns) {
StringBuilder sb = new StringBuilder("");
int size = columns.size();
for (int i = 0; i < size; i++) {
sb.append(getColumnName(columns.get(i)));
sb.append("=?");
if (i != (size - 1)) {
sb.append(" and ");
}
}
return sb.toString();
}
/**
* 根据字段列表,拼写column >= ? and column < ?
*/
public String makeRange(ColumnMeta column) {
return makeRange(column.getName());
}
/**
* 根据字段列表,拼写 column >= ? and column < ?
*/
public String makeRange(String columnName) {
StringBuilder sb = new StringBuilder("");
sb.append(getColumnName(columnName));
sb.append(" >= ? and ");
sb.append(getColumnName(columnName));
sb.append(" <= ?");
return sb.toString();
}
/**
* 根据字段名和参数个数,拼写 column in (?,?,...) 字符串
*/
public String makeIn(ColumnMeta column, int size) {
return makeIn(column.getName(), size);
}
/**
* 根据字段名和参数个数,拼写 column in (?,?,...) 字符串
*/
public String makeIn(String columnName, int size) {
StringBuilder sb = new StringBuilder("");
sb.append(getColumnName(columnName));
sb.append(" in (");
for (int i = 0; i < size; i++) {
sb.append("?");
if (i != (size - 1)) {
sb.append(",");
}
}
sb.append(")");
return sb.toString();
}
public String getSelectSql(String schemaName, String tableName, String[] pkNames, String[] colNames) {
StringBuilder sql = new StringBuilder();
sql.append("select ");
String[] allColumns = buildAllColumns(pkNames, colNames);
int size = allColumns.length;
for (int i = 0; i < size; i++) {
sql.append(getColumnName(allColumns[i])).append(splitCommea(size, i));
}
sql.append(" from ").append(makeFullName(schemaName, tableName)).append(" where ( ");
if (pkNames.length > 0) { // 可能没有主键
makeColumnEquals(sql, pkNames, "and");
} else {
makeColumnEquals(sql, colNames, "and");
}
sql.append(" ) ");
return sql.toString().intern();
}
public String getSelectInSql(String schemaName, String tableName, String[] pkNames, String[] columnNames, int inSize) {
StringBuilder sql = new StringBuilder("select ");
String[] allColumns = buildAllColumns(pkNames, columnNames);
int size = allColumns.length;
for (int i = 0; i < size; i++) {
sql.append(getColumnName(allColumns[i])).append(splitCommea(size, i));
}
sql.append(" from ").append(makeFullName(schemaName, tableName)).append(" where ( ");
size = pkNames.length;
if (size == 0) {
size = columnNames.length;
}
for (int i = 0; i < size; i++) {
if (pkNames.length > 0) {
sql.append(getColumnName(pkNames[i])).append(splitCommea(size, i));
} else {
sql.append(getColumnName(columnNames[i])).append(splitCommea(size, i));
}
}
sql.append(") in (");
size = pkNames.length;
if (size == 0) {
size = columnNames.length;
}
for (int i = 0; i < inSize; i++) {
sql.append('(');
for (int j = 0; j < size; j++) {
sql.append('?').append((j + 1 < size) ? " , " : "");
}
sql.append(')').append((i + 1 < inSize) ? " , " : "");
}
sql.append(")");
return sql.toString();
}
public String getInsertSql(String schemaName, String tableName, String[] pkNames, String[] columnNames) {
StringBuilder sql = new StringBuilder();
sql.append("insert into ").append(makeFullName(schemaName, tableName)).append("(");
String[] allColumns = buildAllColumns(pkNames, columnNames);
int size = allColumns.length;
for (int i = 0; i < size; i++) {
sql.append(getColumnName(allColumns[i])).append(splitCommea(size, i));
}
sql.append(") values (");
makeColumnQuestions(sql, allColumns);
sql.append(")");
return sql.toString().intern();
}
public String getUpdateSql(String schemaName, String tableName, String[] pkNames, String[] columnNames) {
StringBuilder sql = new StringBuilder();
sql.append("update ").append(makeFullName(schemaName, tableName)).append(" set ");
makeColumnEquals(sql, columnNames, ",");
sql.append(" where (");
makeColumnEquals(sql, pkNames, "and");
sql.append(")");
return sql.toString().intern();
}
public String getDeleteSql(String schemaName, String tableName, String[] pkNames) {
StringBuilder sql = new StringBuilder();
sql.append("delete from ").append(makeFullName(schemaName, tableName)).append(" where ");
makeColumnEquals(sql, pkNames, "and");
// intern优化,避免出现大量相同的字符串
return sql.toString().intern();
}
protected String makeFullName(String schemaName, String tableName) {
String full = schemaName + DOT + tableName;
return full.intern();
}
protected void makeColumnEquals(StringBuilder sql, String[] columns, String separator) {
int size = columns.length;
for (int i = 0; i < size; i++) {
sql.append(" ").append(getColumnName(columns[i])).append(" = ").append("? ");
if (i != size - 1) {
sql.append(separator);
}
}
}
protected void makeColumnQuestions(StringBuilder sql, String[] columns) {
int size = columns.length;
for (int i = 0; i < size; i++) {
sql.append("?").append(splitCommea(size, i));
}
}
protected String getColumnName(String columName) {
return columName;
}
protected String getColumnName(ColumnMeta column) {
return column.getName();
}
protected String splitCommea(int size, int i) {
return (i + 1 < size) ? " , " : "";
}
protected String[] buildAllColumns(String[] pkNames, String[] colNames) {
String[] allColumns = new String[pkNames.length + colNames.length];
System.arraycopy(colNames, 0, allColumns, 0, colNames.length);
System.arraycopy(pkNames, 0, allColumns, colNames.length, pkNames.length);
return allColumns;
}
}