<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.17</version>
</dependency>
package com.cosmosource.core.utils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplaceStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor;
import java.util.ArrayList;
import java.util.List;
public class SqlExplain {
public static List<SqlDto> sqlExplain(String sqls) {
List<SqlDto> results = new ArrayList<SqlDto>();
MySqlStatementParser parser = new MySqlStatementParser(sqls);
List<SQLStatement> stmtList = parser.parseStatementList();
// 将AST通过visitor输出
StringBuilder out = new StringBuilder();
MySqlOutputVisitor visitor = new MySqlOutputVisitor(out);
for (SQLStatement stmt : stmtList) {
SqlDto sqlDto = new SqlDto();
stmt.accept(visitor);
out.append(";");
if (stmt instanceof SQLSelectStatement) {
sqlDto.setSqlType(SqlType.SELECT);
sqlDto.setSql(out.toString());
} else if (stmt instanceof SQLInsertStatement) {
sqlDto.setSqlType(SqlType.INSERT);
sqlDto.setSql(out.toString());
} else if (stmt instanceof SQLUpdateStatement) {
sqlDto.setSqlType(SqlType.UPDATE);
sqlDto.setSql(out.toString());
} else if (stmt instanceof SQLDeleteStatement) {
sqlDto.setSqlType(SqlType.DELETE);
sqlDto.setSql(out.toString());
} else if (stmt instanceof SQLAlterTableStatement) {
sqlDto.setSqlType(SqlType.ALTER);
sqlDto.setSql(out.toString());
SQLAlterTableStatement alterStmt = (SQLAlterTableStatement) stmt;
String tableName = alterStmt.getTableSource().toString().trim();
int pos = tableName.indexOf('`');
if (pos >= 0) {
int end = tableName.lastIndexOf('`');
tableName = tableName.substring(1, end);
}
sqlDto.setTableName(tableName);
} else if (stmt instanceof SQLCreateTableStatement) {
sqlDto.setSqlType(SqlType.CREATE);
sqlDto.setSql(out.toString());
} else if (stmt instanceof SQLExplainStatement) {
sqlDto.setSqlType(SqlType.EXPLAIN);
sqlDto.setSql(out.toString());
} else if (stmt instanceof SQLDropTableStatement) {
sqlDto.setSqlType(SqlType.DROP);
sqlDto.setSql(out.toString());
} else if (stmt instanceof MySqlRenameTableStatement) {
sqlDto.setSqlType(SqlType.RENAME);
sqlDto.setSql(out.toString());
} else if (stmt instanceof MySqlReplaceStatement) {
sqlDto.setSqlType(SqlType.REPLACE);
sqlDto.setSql(out.toString());
} else {
sqlDto.setSqlType(SqlType.OTHER);
sqlDto.setSql(out.toString());
}
results.add(sqlDto);
out.setLength(0);
}
return results;
}
public static String sqlExplainException(String sqls) {
try {
sqlExplain(sqls);
return "true";
} catch (Exception e) {
return e.getMessage();
}
}
}
package com.cosmosource.core.utils;
public class SqlDto {
private SqlType sqlType;
private String sql;
private String tableName;
public SqlDto() {
}
public SqlDto(SqlType sqlType, String sql, String tableName) {
this.sqlType = sqlType;
this.sql = sql;
this.tableName = tableName;
}
public SqlType getSqlType() {
return sqlType;
}
public void setSqlType(SqlType sqlType) {
this.sqlType = sqlType;
}
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
}
package com.cosmosource.core.utils;
public enum SqlType {
/**
* 枚举 sql语句
* */
SELECT("select"),
INSERT("insert"),
UPDATE("update"),
DELETE("delete"),
ALTER("alter"),
CREATE("create"),
EXPLAIN("explain"),
DROP("drop"),
RENAME("rename"),
REPLACE("replace"),
OTHER("other");
public String value;
private SqlType(String value) {
this.value = value;
}
}