package com.taobao.yugong.common.db.sql;
import com.taobao.yugong.common.db.meta.ColumnMeta;
/**
* mysql特定的sql构造
*
* @author agapple 2013-9-10 下午6:11:16
* @since 3.0.0
*/
public class MysqlSqlTemplate extends SqlTemplate {
public String getMergeSql(String schemaName, String tableName, String[] pkNames, String[] colNames,
boolean mergeUpdatePk) {
StringBuilder sql = new StringBuilder();
sql.append("insert into ").append(makeFullName(schemaName, tableName)).append("(");
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(") values (");
for (int i = 0; i < size; i++) {
sql.append("?").append(splitCommea(size, i));
}
sql.append(") on duplicate key update ");
// mysql merge sql匹配了uniqe / primary key时都会执行update,所以需要更新pk信息
if (mergeUpdatePk) {
for (int i = 0; i < size; i++) {
sql.append(getColumnName(allColumns[i]))
.append("=values(")
.append(getColumnName(allColumns[i]))
.append(")");
sql.append(splitCommea(size, i));
}
} else {
// merge sql不更新主键信息, 规避drds情况下的分区键变更
for (int i = 0; i < colNames.length; i++) {
sql.append(getColumnName(colNames[i]))
.append("=values(")
.append(getColumnName(colNames[i]))
.append(")");
sql.append(splitCommea(colNames.length, i));
}
}
// intern优化,避免出现大量相同的字符串
return sql.toString().intern();
}
public String getInsertSql(String schemaName, String tableName, String[] pkNames, String[] columnNames) {
StringBuilder sql = new StringBuilder();
sql.append("insert ignore 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();// intern优化,避免出现大量相同的字符串
}
public String getInsertNomalSql(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();// intern优化,避免出现大量相同的字符串
}
protected String getColumnName(String columName) {
return "`" + columName + "`";
}
protected String getColumnName(ColumnMeta column) {
return "`" + column.getName() + "`";
}
}