Druid中sql解析

基于druid解析查询sql,在JDBC API基础上进行插件开发的时候需要。

import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.alibaba.druid.util.JdbcUtils;

public class SQLParseTest {

    public static void main(String args[]){
        String sql = " select eventId,eventKey,eventName,flag from event where eventId = ? and eventKey = ? and eventName = ?";
        //使用mysql解析
        MySqlStatementParser sqlStatementParser = new MySqlStatementParser(sql) ;
        //解析select查询
        SQLSelectStatement sqlStatement = sqlStatementParser.parseSelect() ;
        SQLSelect sqlSelect = sqlStatement.getSelect() ;
        //获取sql查询块
        SQLSelectQueryBlock sqlSelectQuery = (SQLSelectQueryBlock)sqlSelect.getQuery() ;

        StringBuffer out = new StringBuffer() ;
        //创建sql解析的标准化输出
        SQLASTOutputVisitor sqlastOutputVisitor = SQLUtils.createFormatOutputVisitor(out , null , JdbcUtils.MYSQL) ;

        //解析select项
        out.delete(0, out.length()) ;
        for (SQLSelectItem sqlSelectItem : sqlSelectQuery.getSelectList()) {
            if(out.length()>1){
                out.append(",") ;
            }
            sqlSelectItem.accept(sqlastOutputVisitor);
        }
        System.out.println("SELECT "+out) ;

        //解析from
        out.delete(0, out.length()) ;
        sqlSelectQuery.getFrom().accept(sqlastOutputVisitor) ;
        System.out.println("FROM "+out) ;

        //解析where
        out.delete(0, out.length()) ;
        sqlSelectQuery.getWhere().accept(sqlastOutputVisitor) ;
        System.out.println("WHERE "+out);

    }

}

猜你喜欢

转载自lpyyn.iteye.com/blog/2271952