java使用druid解析器解析SQL语句

    @Test
    public void testSqlParser() throws SQLSyntaxErrorException {
        String sql = "select t.name, t.id, (select p.name from post p where p.id = t.post_id)" +
                "from acct t where t.id = 10 and exists (select r.id from role r where r.id = t.role_id) ";
        String dbType = "mysql";
        System.out.println("原始SQL 为 : " + sql);
        String result = SQLUtils.format(sql, dbType);
        System.out.println(result);
        SQLSelectStatement statement = (SQLSelectStatement) parser(sql, dbType);
        SQLSelect select = statement.getSelect();
        SQLSelectQueryBlock query = (SQLSelectQueryBlock) select.getQuery();

        // 这里新增的条件,如果语法不正确会报错。如果条件不正确,需要执行了sql后才会报错。
        query.addCondition("name like 'admin%'");

        SQLExprTableSource tableSource = (SQLExprTableSource) query.getFrom();
        String tableName = tableSource.getExpr().toString();
        System.out.println("获取的表名为  tableName :" + tableName);
        //修改表名为acct_1
        tableSource.setExpr("acct_1");
        System.out.println("修改表名后的SQL 为 : [" + statement.toString() + "]");
    }

    public SQLStatement parser(String sql, String dbType) throws SQLSyntaxErrorException {
        List<SQLStatement> list = SQLUtils.parseStatements(sql, dbType);
        if (list.size() > 1) {
            throw new SQLSyntaxErrorException("MultiQueries is not supported,use single query instead ");
        }
        return list.get(0);
    }

 

posted @ 2020-12-11 21:28  Se7end  阅读(5092)  评论(1编辑  收藏  举报