jsqlparser:对SQL查询语句进行处理,如获取表名数据库名等

834 阅读1分钟

jsqlparser

对SQL查询语句进行处理,如获取表名数据库名等

  • 导入依赖
<dependency>
    <groupId>com.github.jsqlparser</groupId>
    <artifactId>jsqlparser</artifactId>
    <version>4.2</version>
</dependency>
  • 测试使用
public class SqlTest {
    public static void main(String[] args) throws JSQLParserException {
        //1、获取原始sql输入
        String sql = "SELECT u.username, u.age,u.sex FROM das.user_ittr as u where u.id=1 and u.age in (1,2,3) ;";
        //构建解析器
        Select select = (Select) CCJSqlParserUtil.parse(sql);
        //获取select对象
        SelectBody selectBody = select.getSelectBody();
        System.err.println(selectBody.toString());

        //解析sql
        PlainSelect plainSelect = (PlainSelect) selectBody;
        //解析表对象
        Table table = (Table) plainSelect.getFromItem();
        // 库名
        System.out.println(table.getSchemaName());
        //表名称
        System.out.println(table.getName());
        //别名
        System.out.println(table.getAlias().getName());

        //查询列
        List<SelectItem> selectItems = plainSelect.getSelectItems();
        selectItems.stream().forEach(selectItem -> {
            System.out.println(selectItem.toString());
        });

        System.out.println(SqlValidUtil.validSqlTableName(sql, "ittr$"));

        System.out.println(SqlValidUtil.getSchemaTable(sql));
    }
}
  • 工具类
public class SqlValidUtil {

    /**
     * 检查sql是否正确
     * @param sql
     * @return
     */
    public static boolean validSql(String sql) {
        try {
            CCJSqlParserUtil.parse(sql);
            return true;
        } catch (JSQLParserException e) {
            return false;
        }
    }

    /**
     * 校验表名是否正确
     * @param sql
     * @param pattern 正则表达式
     * @example SqlValidUtil.validSqlTableName(sql, " ittr$ ")  校验表名是否以ittr结尾
     */
    public static boolean validSqlTableName(String sql, String pattern) {
        PlainSelect plainSelect = getPlainSelect(sql);
        Table table = (Table) plainSelect.getFromItem();

        Pattern regex = Pattern.compile(pattern);
        Matcher matcher = regex.matcher(table.getName());
        return matcher.find();
    }

    /**
     * 校验sql是否包含指定列名
     * @param sql
     * @param validColumns 必须包含的列
     */
    public static boolean validSqlColumn(String sql, List<String> validColumns) {
        try {
            PlainSelect plainSelect = getPlainSelect(sql);
            List<SelectItem> selectItems = plainSelect.getSelectItems();
            // 去除别名后的列名
            List<String> selectColumns = selectItems.stream()
                    .map(item -> item.toString().substring(item.toString().lastIndexOf(".") + 1))
                    .collect(Collectors.toList());

            return selectColumns.containsAll(validColumns);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 获得数据库和表
     * @param sql
     * @return [数据库, 数据表]
     */
    public static List<String> getSchemaTable(String sql) {
        PlainSelect plainSelect = getPlainSelect(sql);
        Table table = (Table) plainSelect.getFromItem();
        return new ArrayList<>(Arrays.asList(table.getSchemaName(), table.getName()));
    }


    /**
     * 解析Sql对象
     * @param sql
     * @return
     */
    private static PlainSelect getPlainSelect(String sql) {
        try {
            if (validSql(sql)) {
                Select select = (Select) CCJSqlParserUtil.parse(sql);
                SelectBody selectBody = select.getSelectBody();
                PlainSelect plainSelect = (PlainSelect) selectBody;
                return plainSelect;
            }
        } catch (JSQLParserException e) {
            e.printStackTrace();
        }
        return null;
    }
}