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

来源:互联网 发布:淘宝装修图片加热点 编辑:程序博客网 时间:2024/05/18 12:02

使用到了 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);        }    }}


原创粉丝点击