sql预编译

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.0.17</version>
    </dependency>


package com.cosmosource.core.utils;

import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplaceStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor;


import java.util.ArrayList;
import java.util.List;

public class SqlExplain {


    public static List<SqlDto> sqlExplain(String sqls) {
        List<SqlDto> results = new ArrayList<SqlDto>();
        MySqlStatementParser parser = new MySqlStatementParser(sqls);
        List<SQLStatement> stmtList = parser.parseStatementList();

        // 将AST通过visitor输出
        StringBuilder out = new StringBuilder();
        MySqlOutputVisitor visitor = new MySqlOutputVisitor(out);

        for (SQLStatement stmt : stmtList) {
            SqlDto sqlDto = new SqlDto();

            stmt.accept(visitor);
            out.append(";");

            if (stmt instanceof SQLSelectStatement) {
                sqlDto.setSqlType(SqlType.SELECT);
                sqlDto.setSql(out.toString());
            } else if (stmt instanceof SQLInsertStatement) {
                sqlDto.setSqlType(SqlType.INSERT);
                sqlDto.setSql(out.toString());
            } else if (stmt instanceof SQLUpdateStatement) {
                sqlDto.setSqlType(SqlType.UPDATE);
                sqlDto.setSql(out.toString());
            } else if (stmt instanceof SQLDeleteStatement) {
                sqlDto.setSqlType(SqlType.DELETE);
                sqlDto.setSql(out.toString());
            } else if (stmt instanceof SQLAlterTableStatement) {
                sqlDto.setSqlType(SqlType.ALTER);
                sqlDto.setSql(out.toString());
                SQLAlterTableStatement alterStmt = (SQLAlterTableStatement) stmt;

                String tableName = alterStmt.getTableSource().toString().trim();
                int pos = tableName.indexOf('`');
                if (pos >= 0) {
                    int end = tableName.lastIndexOf('`');
                    tableName = tableName.substring(1, end);
                }
                sqlDto.setTableName(tableName);
            } else if (stmt instanceof SQLCreateTableStatement) {
                sqlDto.setSqlType(SqlType.CREATE);
                sqlDto.setSql(out.toString());
            } else if (stmt instanceof SQLExplainStatement) {
                sqlDto.setSqlType(SqlType.EXPLAIN);
                sqlDto.setSql(out.toString());
            } else if (stmt instanceof SQLDropTableStatement) {
                sqlDto.setSqlType(SqlType.DROP);
                sqlDto.setSql(out.toString());
            } else if (stmt instanceof MySqlRenameTableStatement) {
                sqlDto.setSqlType(SqlType.RENAME);
                sqlDto.setSql(out.toString());
            } else if (stmt instanceof MySqlReplaceStatement) {
                sqlDto.setSqlType(SqlType.REPLACE);
                sqlDto.setSql(out.toString());
            } else {
                sqlDto.setSqlType(SqlType.OTHER);
                sqlDto.setSql(out.toString());
            }

            results.add(sqlDto);
            out.setLength(0);
        }

        return results;
    }

    public static  String sqlExplainException(String sqls) {

        try {
            sqlExplain(sqls);
            return "true";
        } catch (Exception e) {
            return e.getMessage();
        }
    }

}

package com.cosmosource.core.utils;

public class SqlDto {
private SqlType sqlType;
private String sql;
private String tableName;

public SqlDto() {

}

public SqlDto(SqlType sqlType, String sql, String tableName) {
    this.sqlType = sqlType;
    this.sql = sql;
    this.tableName = tableName;
}

public SqlType getSqlType() {
    return sqlType;
}

public void setSqlType(SqlType sqlType) {
    this.sqlType = sqlType;
}

public String getSql() {
    return sql;
}

public void setSql(String sql) {
    this.sql = sql;
}

public String getTableName() {
    return tableName;
}

public void setTableName(String tableName) {
    this.tableName = tableName;
}

}

package com.cosmosource.core.utils;

public enum SqlType {

/**
 * 枚举 sql语句
 * */
SELECT("select"),
INSERT("insert"),
UPDATE("update"),
DELETE("delete"),
ALTER("alter"),
CREATE("create"),
EXPLAIN("explain"),
DROP("drop"),
RENAME("rename"),
REPLACE("replace"),
OTHER("other");


public String value;
private SqlType(String value) {
    this.value = value;
}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值