mirror of
https://gitee.com/dromara/dbswitch.git
synced 2025-09-07 04:37:48 +00:00
SQL格式化优化
This commit is contained in:
@@ -110,12 +110,6 @@
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>druid</artifactId>
|
||||
<version>1.1.5</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
@@ -50,22 +50,22 @@ public final class Const {
|
||||
/**
|
||||
* Create Table Statement Prefix String
|
||||
*/
|
||||
public static final String CREATE_TABLE = " CREATE TABLE ";
|
||||
public static final String CREATE_TABLE = "CREATE TABLE ";
|
||||
|
||||
/**
|
||||
* Drop Table Statement Prefix String
|
||||
*/
|
||||
public static final String DROP_TABLE = " DROP TABLE ";
|
||||
public static final String DROP_TABLE = "DROP TABLE ";
|
||||
|
||||
/**
|
||||
* Constant Keyword String
|
||||
*/
|
||||
public static final String IF_NOT_EXISTS = " IF NOT EXISTS ";
|
||||
public static final String IF_NOT_EXISTS = "IF NOT EXISTS ";
|
||||
|
||||
/**
|
||||
* Constant Keyword String
|
||||
*/
|
||||
public static final String IF_EXISTS = " IF EXISTS ";
|
||||
public static final String IF_EXISTS = "IF EXISTS ";
|
||||
|
||||
/**
|
||||
* Constructor Function
|
||||
|
@@ -248,9 +248,6 @@ public abstract class AbstractDatabase implements IDatabaseInterface {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public abstract String formatSQL(String sql);
|
||||
|
||||
/**************************************
|
||||
* internal function
|
||||
**************************************/
|
||||
|
@@ -112,12 +112,4 @@ public interface IDatabaseInterface extends AutoCloseable {
|
||||
* @return 主键字段拼接串
|
||||
*/
|
||||
public String getPrimaryKeyAsString(List<String> pks);
|
||||
|
||||
/**
|
||||
* SQL语句格式化
|
||||
*
|
||||
* @param sql SQL的语句
|
||||
* @return 格式化后的SQL语句
|
||||
*/
|
||||
public String formatSQL(String sql);
|
||||
}
|
||||
|
@@ -46,11 +46,6 @@ public class DatabaseDB2Impl extends AbstractDatabase implements IDatabaseInterf
|
||||
return String.format("explain %s", sql.replace(";", ""));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String formatSQL(String sql) {
|
||||
return sql;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) {
|
||||
String fieldname = v.getName();
|
||||
|
@@ -10,7 +10,6 @@
|
||||
package com.gitee.dbswitch.core.database.impl;
|
||||
|
||||
import java.util.List;
|
||||
import com.alibaba.druid.sql.SQLUtils;
|
||||
import com.gitee.dbswitch.common.constant.DatabaseTypeEnum;
|
||||
import com.gitee.dbswitch.core.constant.Const;
|
||||
import com.gitee.dbswitch.core.database.AbstractDatabase;
|
||||
@@ -46,11 +45,6 @@ public class DatabaseDmImpl extends AbstractDatabase implements IDatabaseInterfa
|
||||
return String.format("explain %s", sql.replace(";", ""));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String formatSQL(String sql) {
|
||||
return SQLUtils.formatOracle(sql);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) {
|
||||
String fieldname = v.getName();
|
||||
|
@@ -11,7 +11,6 @@ package com.gitee.dbswitch.core.database.impl;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import com.alibaba.druid.sql.SQLUtils;
|
||||
import com.gitee.dbswitch.core.constant.Const;
|
||||
import com.gitee.dbswitch.common.constant.DatabaseTypeEnum;
|
||||
import com.gitee.dbswitch.core.database.AbstractDatabase;
|
||||
@@ -47,11 +46,6 @@ public class DatabaseGreenplumImpl extends AbstractDatabase implements IDatabase
|
||||
protected String getTestQuerySQL(String sql) {
|
||||
return String.format("explain %s", sql.replace(";", ""));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String formatSQL(String sql) {
|
||||
return SQLUtils.formatPGSql(sql, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) {
|
||||
|
@@ -10,7 +10,6 @@
|
||||
package com.gitee.dbswitch.core.database.impl;
|
||||
|
||||
import java.util.List;
|
||||
import com.alibaba.druid.sql.SQLUtils;
|
||||
import com.gitee.dbswitch.common.constant.DatabaseTypeEnum;
|
||||
import com.gitee.dbswitch.core.constant.Const;
|
||||
import com.gitee.dbswitch.core.database.AbstractDatabase;
|
||||
@@ -47,11 +46,6 @@ public class DatabaseKingbaseImpl extends AbstractDatabase implements IDatabaseI
|
||||
return String.format("explain %s", sql.replace(";", ""));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String formatSQL(String sql) {
|
||||
return SQLUtils.formatPGSql(sql, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) {
|
||||
String fieldname = v.getName();
|
||||
|
@@ -17,7 +17,6 @@ import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import com.gitee.dbswitch.core.constant.Const;
|
||||
import com.alibaba.druid.sql.SQLUtils;
|
||||
import com.gitee.dbswitch.common.constant.DatabaseTypeEnum;
|
||||
import com.gitee.dbswitch.core.database.AbstractDatabase;
|
||||
import com.gitee.dbswitch.core.database.IDatabaseInterface;
|
||||
@@ -116,11 +115,6 @@ public class DatabaseMysqlImpl extends AbstractDatabase implements IDatabaseInte
|
||||
return String.format(" `%s`.`%s` ", schemaName, tableName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String formatSQL(String sql) {
|
||||
return SQLUtils.formatMySql(sql);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) {
|
||||
String fieldname = v.getName();
|
||||
|
@@ -16,7 +16,6 @@ import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import com.alibaba.druid.sql.SQLUtils;
|
||||
import com.gitee.dbswitch.core.constant.Const;
|
||||
import com.gitee.dbswitch.common.constant.DatabaseTypeEnum;
|
||||
import com.gitee.dbswitch.core.database.AbstractDatabase;
|
||||
@@ -122,11 +121,6 @@ public class DatabaseOracleImpl extends AbstractDatabase implements IDatabaseInt
|
||||
protected String getTestQuerySQL(String sql) {
|
||||
return String.format("explain plan for %s", sql.replace(";", ""));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String formatSQL(String sql) {
|
||||
return SQLUtils.formatOracle(sql);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) {
|
||||
|
@@ -10,7 +10,6 @@
|
||||
package com.gitee.dbswitch.core.database.impl;
|
||||
|
||||
import java.util.List;
|
||||
import com.alibaba.druid.sql.SQLUtils;
|
||||
import com.gitee.dbswitch.core.constant.Const;
|
||||
import com.gitee.dbswitch.common.constant.DatabaseTypeEnum;
|
||||
import com.gitee.dbswitch.core.database.AbstractDatabase;
|
||||
@@ -46,11 +45,6 @@ public class DatabasePostgresImpl extends AbstractDatabase implements IDatabaseI
|
||||
protected String getTestQuerySQL(String sql) {
|
||||
return String.format("explain %s", sql.replace(";", ""));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String formatSQL(String sql) {
|
||||
return SQLUtils.formatPGSql(sql,null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) {
|
||||
|
@@ -17,7 +17,6 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import com.alibaba.druid.sql.SQLUtils;
|
||||
import com.gitee.dbswitch.core.constant.Const;
|
||||
import com.gitee.dbswitch.common.constant.DatabaseTypeEnum;
|
||||
import com.gitee.dbswitch.core.database.AbstractDatabase;
|
||||
@@ -198,11 +197,6 @@ public class DatabaseSqlserverImpl extends AbstractDatabase implements IDatabase
|
||||
return String.format(" [%s].[%s] ", schemaName, tableName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String formatSQL(String sql) {
|
||||
return SQLUtils.formatSQLServer(sql);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) {
|
||||
String fieldname = v.getName();
|
||||
|
@@ -0,0 +1,129 @@
|
||||
// Copyright tang. All rights reserved.
|
||||
// https://gitee.com/inrgihc/dbswitch
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style license
|
||||
//
|
||||
// Author: tang (inrgihc@126.com)
|
||||
// Data : 2020/1/2
|
||||
// Location: beijing , china
|
||||
/////////////////////////////////////////////////////////////
|
||||
package com.gitee.dbswitch.core.util;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
/**
|
||||
* DDL的SQL语句格式化(摘自hibernate)
|
||||
*
|
||||
* @author tang
|
||||
*/
|
||||
public class DDLFormatterUtils {
|
||||
|
||||
public static String format(String sql) {
|
||||
if (null == sql || 0 == sql.length()) {
|
||||
return sql;
|
||||
}
|
||||
if (sql.toLowerCase(Locale.ROOT).startsWith("create table")) {
|
||||
return formatCreateTable(sql);
|
||||
} else if (sql.toLowerCase(Locale.ROOT).startsWith("alter table")) {
|
||||
return formatAlterTable(sql);
|
||||
} else if (sql.toLowerCase(Locale.ROOT).startsWith("comment on")) {
|
||||
return formatCommentOn(sql);
|
||||
} else {
|
||||
return "\n " + sql;
|
||||
}
|
||||
}
|
||||
|
||||
private static String formatCommentOn(String sql) {
|
||||
final StringBuilder result = new StringBuilder(60).append(" ");
|
||||
final StringTokenizer tokens = new StringTokenizer(sql, " '[]\"", true);
|
||||
|
||||
boolean quoted = false;
|
||||
while (tokens.hasMoreTokens()) {
|
||||
final String token = tokens.nextToken();
|
||||
result.append(token);
|
||||
if (isQuote(token)) {
|
||||
quoted = !quoted;
|
||||
} else if (!quoted) {
|
||||
if ("is".equals(token)) {
|
||||
result.append("\n ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
private static String formatAlterTable(String sql) {
|
||||
final StringBuilder result = new StringBuilder(60).append(" ");
|
||||
final StringTokenizer tokens = new StringTokenizer(sql, " (,)'[]\"", true);
|
||||
|
||||
boolean quoted = false;
|
||||
while (tokens.hasMoreTokens()) {
|
||||
final String token = tokens.nextToken();
|
||||
if (isQuote(token)) {
|
||||
quoted = !quoted;
|
||||
} else if (!quoted) {
|
||||
if (isBreak(token)) {
|
||||
result.append("\n ");
|
||||
}
|
||||
}
|
||||
result.append(token);
|
||||
}
|
||||
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
private static String formatCreateTable(String sql) {
|
||||
final StringBuilder result = new StringBuilder(60).append(" ");
|
||||
final StringTokenizer tokens = new StringTokenizer(sql, "(,)'[]\"", true);
|
||||
|
||||
int depth = 0;
|
||||
boolean quoted = false;
|
||||
while (tokens.hasMoreTokens()) {
|
||||
final String token = tokens.nextToken();
|
||||
if (isQuote(token)) {
|
||||
quoted = !quoted;
|
||||
result.append(token);
|
||||
} else if (quoted) {
|
||||
result.append(token);
|
||||
} else {
|
||||
if (")".equals(token)) {
|
||||
depth--;
|
||||
if (depth == 0) {
|
||||
result.append("\n ");
|
||||
}
|
||||
}
|
||||
result.append(token);
|
||||
if (",".equals(token) && depth == 1) {
|
||||
result.append("\n ");
|
||||
}
|
||||
if ("(".equals(token)) {
|
||||
depth++;
|
||||
if (depth == 1) {
|
||||
result.append("\n ");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
private static boolean isBreak(String token) {
|
||||
return "drop".equals(token) ||
|
||||
"add".equals(token) ||
|
||||
"references".equals(token) ||
|
||||
"foreign".equals(token) ||
|
||||
"on".equals(token);
|
||||
}
|
||||
|
||||
private static boolean isQuote(String tok) {
|
||||
return "\"".equals(tok) ||
|
||||
"`".equals(tok) ||
|
||||
"]".equals(tok) ||
|
||||
"[".equals(tok) ||
|
||||
"'".equals(tok);
|
||||
}
|
||||
|
||||
}
|
@@ -40,8 +40,8 @@ public class GenerateSqlUtils {
|
||||
// if(ifNotExist && type!=DatabaseType.ORACLE) {
|
||||
// retval.append( Const.IF_NOT_EXISTS );
|
||||
// }
|
||||
retval.append(db.getQuotedSchemaTableCombination(schemaName, tableName) + Const.CR);
|
||||
retval.append("(").append(Const.CR);
|
||||
retval.append(db.getQuotedSchemaTableCombination(schemaName, tableName));
|
||||
retval.append("(");
|
||||
|
||||
for (int i = 0; i < fieldNames.size(); i++) {
|
||||
if (i > 0) {
|
||||
@@ -51,19 +51,19 @@ public class GenerateSqlUtils {
|
||||
}
|
||||
|
||||
ColumnMetaData v = fieldNames.get(i).getMetaData();
|
||||
retval.append(db.getFieldDefinition(v, pks, autoIncr, true));
|
||||
retval.append(db.getFieldDefinition(v, pks, autoIncr, false));
|
||||
}
|
||||
|
||||
if (!pks.isEmpty()) {
|
||||
String pk = db.getPrimaryKeyAsString(pks);
|
||||
retval.append(", PRIMARY KEY (").append(pk).append(")").append(Const.CR);
|
||||
retval.append(", PRIMARY KEY (").append(pk).append(")");
|
||||
}
|
||||
|
||||
retval.append(")").append(Const.CR);
|
||||
retval.append(")");
|
||||
if (DatabaseTypeEnum.MYSQL == type) {
|
||||
retval.append("ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin").append(Const.CR);
|
||||
retval.append("ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin");
|
||||
}
|
||||
|
||||
return db.formatSQL(retval.toString());
|
||||
return DDLFormatterUtils.format(retval.toString());
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user