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() + "`"; } }