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>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.5</version>
</dependency>
</dependencies>
</project>

View File

@@ -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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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) {

View File

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

View File

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

View File

@@ -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) {

View File

@@ -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) {

View File

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

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) {
// 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());
}
}