The use of Druid Sql parser
Import Druid dependencies
< dependency>
< groupId> com.alibaba</ groupId>
< artifactId> druid</ artifactId>
< version> 1.1.23</ version>
</ dependency>
Application of factory pattern
Java code
SqlParseService
:The interface for specific parsing statements
public interface SqlParseService {
List< ParseItem> parseCreateSql ( String sql, String dbtype) ;
List< ParseItem> parseQuerySql ( String sql, String dbtype) ;
}
SqlParseFactory
: Get different parsers according to dbtype: Mysql, Oracle
public class SqlParseFactory {
private static final Logger log = Logger. getLogger ( String. valueOf ( SqlParseFactory. class ) ) ;
private static volatile SqlParseFactory sqlParseFactory = null;
private SqlParseFactory ( ) {
}
public static synchronized SqlParseFactory getInstance ( ) {
if ( Objects. isNull ( sqlParseFactory) ) {
return new SqlParseFactory ( ) ;
}
return sqlParseFactory;
}
public SqlParseService getService ( String dbType) {
if ( SqlParseConstant. MYSQL. equalsIgnoreCase ( dbType) ) {
return new MysqlSqlParse ( ) ;
}
return new OracleSqlParse ( ) ;
}
}
MysqlSqlParse inherits into the abstract class AbstractSqlParse, some common attributes can be encapsulated in the abstract class, and the abstract class implements SqlParseService
public class MysqlSqlParse extends AbstractSqlParse {
private static final Logger log = Logger. getLogger ( String. valueOf ( MysqlSqlParse. class ) ) ;
@Override
public List< ParseItem> parseCreateSql ( String sql, String dbtype) {
List< ParseItem> list = new LinkedList < > ( ) ;
ParseItem parseItem = new ParseItem ( ) ;
List< Map< String, String> > column = new LinkedList < > ( ) ;
SQLStatementParser statementParser = SQLParserUtils. createSQLStatementParser ( sql, SqlParseConstant. MYSQL) ;
SQLCreateTableParser sqlCreateTableParser = statementParser. getSQLCreateTableParser ( ) ;
SQLCreateTableStatement sqlCreateTableStatement = sqlCreateTableParser. parseCreateTable ( ) ;
SQLName name = sqlCreateTableStatement. getName ( ) ;
List< SQLTableElement> tableElementList = sqlCreateTableStatement. getTableElementList ( ) ;
for ( SQLTableElement sqlTableElement : tableElementList) {
Map< String, String> map = new HashMap < > ( ) ;
if ( sqlTableElement instanceof SQLColumnDefinition ) {
SQLColumnDefinition sqlColumnDefinition = ( SQLColumnDefinition) sqlTableElement;
String columnName = ( ( SQLColumnDefinition) sqlTableElement) . getColumnName ( ) ;
SQLDataType dataType = sqlColumnDefinition. getDataType ( ) ;
map. put ( "column" , columnName) ;
map. put ( "datatype" , String. valueOf ( dataType) ) ;
}
column. add ( map) ;
}
parseItem. setDbtype ( dbtype) ;
parseItem. setColumn ( column) ;
parseItem. setTable ( String. valueOf ( name) ) ;
list. add ( parseItem) ;
return list;
}
@Override
public List< ParseItem> parseQuerySql ( String sql, String dbtype) {
return super . parseQuerySql ( sql, dbtype) ;
}
}
The ASC abstract syntax tree is parsed. There are various APIs in Druid, and you can parse various SQLs and use them directly.