SQL格式化优化

This commit is contained in:
inrgihc
2021-06-10 16:04:07 +08:00
parent 0fce588c54
commit cec486285b
14 changed files with 140 additions and 75 deletions

View File

@@ -110,12 +110,6 @@
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.5</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -50,22 +50,22 @@ public final class Const {
/** /**
* Create Table Statement Prefix String * 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 * Drop Table Statement Prefix String
*/ */
public static final String DROP_TABLE = " DROP TABLE "; public static final String DROP_TABLE = "DROP TABLE ";
/** /**
* Constant Keyword String * 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 * Constant Keyword String
*/ */
public static final String IF_EXISTS = " IF EXISTS "; public static final String IF_EXISTS = "IF EXISTS ";
/** /**
* Constructor Function * Constructor Function

View File

@@ -248,9 +248,6 @@ public abstract class AbstractDatabase implements IDatabaseInterface {
return ""; return "";
} }
@Override
public abstract String formatSQL(String sql);
/************************************** /**************************************
* internal function * internal function
**************************************/ **************************************/

View File

@@ -112,12 +112,4 @@ public interface IDatabaseInterface extends AutoCloseable {
* @return 主键字段拼接串 * @return 主键字段拼接串
*/ */
public String getPrimaryKeyAsString(List<String> pks); public String getPrimaryKeyAsString(List<String> pks);
/**
* SQL语句格式化
*
* @param sql SQL的语句
* @return 格式化后的SQL语句
*/
public String formatSQL(String sql);
} }

View File

@@ -46,11 +46,6 @@ public class DatabaseDB2Impl extends AbstractDatabase implements IDatabaseInterf
return String.format("explain %s", sql.replace(";", "")); return String.format("explain %s", sql.replace(";", ""));
} }
@Override
public String formatSQL(String sql) {
return sql;
}
@Override @Override
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) { public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) {
String fieldname = v.getName(); String fieldname = v.getName();

View File

@@ -10,7 +10,6 @@
package com.gitee.dbswitch.core.database.impl; package com.gitee.dbswitch.core.database.impl;
import java.util.List; import java.util.List;
import com.alibaba.druid.sql.SQLUtils;
import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; import com.gitee.dbswitch.common.constant.DatabaseTypeEnum;
import com.gitee.dbswitch.core.constant.Const; import com.gitee.dbswitch.core.constant.Const;
import com.gitee.dbswitch.core.database.AbstractDatabase; 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(";", "")); return String.format("explain %s", sql.replace(";", ""));
} }
@Override
public String formatSQL(String sql) {
return SQLUtils.formatOracle(sql);
}
@Override @Override
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) { public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) {
String fieldname = v.getName(); String fieldname = v.getName();

View File

@@ -11,7 +11,6 @@ package com.gitee.dbswitch.core.database.impl;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import com.alibaba.druid.sql.SQLUtils;
import com.gitee.dbswitch.core.constant.Const; import com.gitee.dbswitch.core.constant.Const;
import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; import com.gitee.dbswitch.common.constant.DatabaseTypeEnum;
import com.gitee.dbswitch.core.database.AbstractDatabase; import com.gitee.dbswitch.core.database.AbstractDatabase;
@@ -47,11 +46,6 @@ public class DatabaseGreenplumImpl extends AbstractDatabase implements IDatabase
protected String getTestQuerySQL(String sql) { protected String getTestQuerySQL(String sql) {
return String.format("explain %s", sql.replace(";", "")); return String.format("explain %s", sql.replace(";", ""));
} }
@Override
public String formatSQL(String sql) {
return SQLUtils.formatPGSql(sql, null);
}
@Override @Override
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) { public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) {

View File

@@ -10,7 +10,6 @@
package com.gitee.dbswitch.core.database.impl; package com.gitee.dbswitch.core.database.impl;
import java.util.List; import java.util.List;
import com.alibaba.druid.sql.SQLUtils;
import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; import com.gitee.dbswitch.common.constant.DatabaseTypeEnum;
import com.gitee.dbswitch.core.constant.Const; import com.gitee.dbswitch.core.constant.Const;
import com.gitee.dbswitch.core.database.AbstractDatabase; 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(";", "")); return String.format("explain %s", sql.replace(";", ""));
} }
@Override
public String formatSQL(String sql) {
return SQLUtils.formatPGSql(sql, null);
}
@Override @Override
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) { public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) {
String fieldname = v.getName(); String fieldname = v.getName();

View File

@@ -17,7 +17,6 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import com.gitee.dbswitch.core.constant.Const; import com.gitee.dbswitch.core.constant.Const;
import com.alibaba.druid.sql.SQLUtils;
import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; import com.gitee.dbswitch.common.constant.DatabaseTypeEnum;
import com.gitee.dbswitch.core.database.AbstractDatabase; import com.gitee.dbswitch.core.database.AbstractDatabase;
import com.gitee.dbswitch.core.database.IDatabaseInterface; 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); return String.format(" `%s`.`%s` ", schemaName, tableName);
} }
@Override
public String formatSQL(String sql) {
return SQLUtils.formatMySql(sql);
}
@Override @Override
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) { public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) {
String fieldname = v.getName(); String fieldname = v.getName();

View File

@@ -16,7 +16,6 @@ import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import com.alibaba.druid.sql.SQLUtils;
import com.gitee.dbswitch.core.constant.Const; import com.gitee.dbswitch.core.constant.Const;
import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; import com.gitee.dbswitch.common.constant.DatabaseTypeEnum;
import com.gitee.dbswitch.core.database.AbstractDatabase; import com.gitee.dbswitch.core.database.AbstractDatabase;
@@ -122,11 +121,6 @@ public class DatabaseOracleImpl extends AbstractDatabase implements IDatabaseInt
protected String getTestQuerySQL(String sql) { protected String getTestQuerySQL(String sql) {
return String.format("explain plan for %s", sql.replace(";", "")); return String.format("explain plan for %s", sql.replace(";", ""));
} }
@Override
public String formatSQL(String sql) {
return SQLUtils.formatOracle(sql);
}
@Override @Override
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) { public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) {

View File

@@ -10,7 +10,6 @@
package com.gitee.dbswitch.core.database.impl; package com.gitee.dbswitch.core.database.impl;
import java.util.List; import java.util.List;
import com.alibaba.druid.sql.SQLUtils;
import com.gitee.dbswitch.core.constant.Const; import com.gitee.dbswitch.core.constant.Const;
import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; import com.gitee.dbswitch.common.constant.DatabaseTypeEnum;
import com.gitee.dbswitch.core.database.AbstractDatabase; import com.gitee.dbswitch.core.database.AbstractDatabase;
@@ -46,11 +45,6 @@ public class DatabasePostgresImpl extends AbstractDatabase implements IDatabaseI
protected String getTestQuerySQL(String sql) { protected String getTestQuerySQL(String sql) {
return String.format("explain %s", sql.replace(";", "")); return String.format("explain %s", sql.replace(";", ""));
} }
@Override
public String formatSQL(String sql) {
return SQLUtils.formatPGSql(sql,null);
}
@Override @Override
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) { public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) {

View File

@@ -17,7 +17,6 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import com.alibaba.druid.sql.SQLUtils;
import com.gitee.dbswitch.core.constant.Const; import com.gitee.dbswitch.core.constant.Const;
import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; import com.gitee.dbswitch.common.constant.DatabaseTypeEnum;
import com.gitee.dbswitch.core.database.AbstractDatabase; 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); return String.format(" [%s].[%s] ", schemaName, tableName);
} }
@Override
public String formatSQL(String sql) {
return SQLUtils.formatSQLServer(sql);
}
@Override @Override
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) { public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc, boolean addCr) {
String fieldname = v.getName(); String fieldname = v.getName();

View File

@@ -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);
}
}

View File

@@ -40,8 +40,8 @@ public class GenerateSqlUtils {
// if(ifNotExist && type!=DatabaseType.ORACLE) { // if(ifNotExist && type!=DatabaseType.ORACLE) {
// retval.append( Const.IF_NOT_EXISTS ); // retval.append( Const.IF_NOT_EXISTS );
// } // }
retval.append(db.getQuotedSchemaTableCombination(schemaName, tableName) + Const.CR); retval.append(db.getQuotedSchemaTableCombination(schemaName, tableName));
retval.append("(").append(Const.CR); retval.append("(");
for (int i = 0; i < fieldNames.size(); i++) { for (int i = 0; i < fieldNames.size(); i++) {
if (i > 0) { if (i > 0) {
@@ -51,19 +51,19 @@ public class GenerateSqlUtils {
} }
ColumnMetaData v = fieldNames.get(i).getMetaData(); 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()) { if (!pks.isEmpty()) {
String pk = db.getPrimaryKeyAsString(pks); 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) { 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());
} }
} }