druid解析的sql

public void search(String sql, Map<String, Object> conditions, String operator) {
        List<Map<String, Object>> result = new ArrayList<>();
        // SQLParserUtils.createSQLStatementParser可以將sql裝載到Parser裏面
        SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, JdbcUtils.MYSQL);
        // parseStatementList的返回值SQLStatement本身就是druid裏面的語法樹對象
        List<SQLStatement> stmtList = parser.parseStatementList();
        SQLStatement stmt = stmtList.get(0);
        if (stmt instanceof SQLSelectStatement) {
            // convert conditions to 'and' statement
            StringBuffer constraintsBuffer = new StringBuffer();
            Iterator<Map.Entry<String, Object>> entryIterator = conditions.entrySet().iterator();
            if (entryIterator.hasNext()) {
                Map.Entry<String, Object> entry = entryIterator.next();
                constraintsBuffer.append(entry.getKey()).append(" = ").append(entry.getValue());
            }
            while (entryIterator.hasNext()) {
                Map.Entry<String, Object> entry = entryIterator.next();
                constraintsBuffer.append(" "+operator+" ").append(entry.getKey()).append(" = ").append(entry.getValue());
            }
            SQLExprParser constraintsParser = SQLParserUtils.createExprParser(constraintsBuffer.toString(), JdbcUtils.MYSQL);
            SQLExpr constraintsExpr = constraintsParser.expr();
            SQLSelectStatement selectStmt = (SQLSelectStatement) stmt;
            // 拿到SQLSelect 通過在這裏打斷點看對象我們可以看出這是一個樹的結構
            SQLSelect sqlselect = selectStmt.getSelect();
            SQLSelectQueryBlock query = (SQLSelectQueryBlock) sqlselect.getQuery();
            SQLExpr whereExpr = query.getWhere();
            // 修改where表達式
            if (whereExpr == null) {
                query.setWhere(constraintsExpr);
            } else {
                SQLBinaryOperator sqlBinaryOperator = null;
                for (SQLBinaryOperator value : SQLBinaryOperator.values()) {
                    if (value.getName().equalsIgnoreCase(operator)){
                        sqlBinaryOperator = value;
                        break;
                    }
                }
                SQLBinaryOpExpr newWhereExpr = new SQLBinaryOpExpr(whereExpr, sqlBinaryOperator, constraintsExpr);
                query.setWhere(newWhereExpr);
            }
            sqlselect.setQuery(query);
            sql = sqlselect.toString();
            System.out.println(sql);
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章