# The use of Druid Sql parser

The use of Druid Sql parser

Import Druid dependencies
<!-- druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.23</version>
</dependency>
Application of factory pattern

Insert picture description here

Java code
  • SqlParseService:The interface for specific parsing statements
public interface SqlParseService {
    
    

    /**
     * 解析创建语句
     * @param sql
     * @param dbtype
     * @return
     */
    List<ParseItem> parseCreateSql(String sql,String dbtype);

    /**
     * 解析查询Sql
     * @param sql
     * @param dbtype
     * @return
     */
    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() {
    
    

    }

    /**
     * 线程同步
     * @return
     */
    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.
    Insert picture description here

Guess you like

Origin blog.csdn.net/qq_37248504/article/details/114803190