您的位置:首页 > 产品设计 > UI/UE

使用alibaba Druid 对sql 语句进行校验

2017-10-18 17:12 633 查看
使用到了 Druid中的 实现了 访问者模式的 各类visitor 对 sql 进行读取与解析

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.17</version>
</dependency>


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.setType(SqlType.SELECT);
sqlDto.setSql(out.toString());
} else if (stmt instanceof SQLInsertStatement) {
sqlDto.setType(SqlType.INSERT);
sqlDto.setSql(out.toString());
} else if (stmt instanceof SQLUpdateStatement) {
sqlDto.setType(SqlType.UPDATE);
sqlDto.setSql(out.toString());
} else if (stmt instanceof SQLDeleteStatement) {
sqlDto.setType(SqlType.DELETE);
sqlDto.setSql(out.toString());
} else if (stmt instanceof SQLAlterTableStatement) {
sqlDto.setType(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.setType(SqlType.CREATE);
sqlDto.setSql(out.toString());
} else if (stmt instanceof SQLExplainStatement) {
sqlDto.setType(SqlType.EXPLAIN);
sqlDto.setSql(out.toString());
} else if (stmt instanceof SQLDropTableStatement) {
sqlDto.setType(SqlType.DROP);
sqlDto.setSql(out.toString());
} else if (stmt instanceof MySqlRenameTableStatement) {
sqlDto.setType(SqlType.RENAME);
sqlDto.setSql(out.toString());
} else if (stmt instanceof MySqlReplaceStatement) {
sqlDto.setType(SqlType.REPLACE);
sqlDto.setSql(out.toString());
} else {
sqlDto.setType(SqlType.OTHER);
sqlDto.setSql(out.toString());
}

results.add(sqlDto);
out.setLength(0);
}

return results;

public class SqlExplain {

public static void main(String[] args){
String sqls = "select ID from BCP_Prize; sel2ect name from BCP_Prize";
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) {
stmt.accept(visitor);
System.out.println(out + ";");
out.setLength(0);
}

}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: