使用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); } } }
相关文章推荐
- 使用Jmeter对Mysql进行压力测试无法执行多条sql语句问题
- 使用WHERE语句对SQL进行基础性的优化
- 使用SQL语句对数据进行简单报表汇总
- 使用SQL-DMO备份数据库并进行校验
- 使用SQL语句进行数据比对
- ASP.NET基础教程-使用CommandBuilder对象自动生成SQL语句对数据进行批量更新
- 使用SQL语句对Access数据库进行备份
- 使用SQL语句对表进行分页查询
- 如何使用SQL语句将行和列进行转换
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-使用UDA操纵SQL语句
- 使用SQL语句来进行分页处理
- Oracle使用SQL语句进行递归查询
- 使用SQL语句来进行分页处理
- 在Hibernate中使用HibernateTemplate来进行包含sql语句的查询
- ASP.NET基础教程-使用CommandBuilder对象自动生成SQL语句对数据进行批量更新
- 使用参数化SQL语句进行模糊查找
- 使用SQL-DMO备份并进行校验
- 如何使用SQL语句将行和列进行转换?
- C#中使用SQL的BULK语句,进行大数据量操作
- 使用SQL语句进行数据库恢复时数据库已被占用的解决方法