基于druid解析mysql sql语句

背景介绍

  1. 公司搞了个发布系统,每次开发可以将要执行的sql填写录入然后进行审核发布,一次可以执行多条sql,系统对于多条sql用了中文;切割,然后逐条执行,但是有个问题是一般navicat在导出建表语句时,中文注释里也会存在;分隔符
    导致sql分割报错。
  2. 经查看druid源码发现其实它本身里面存在了mysql解析器,见下图代码及示例
   import com.alibaba.druid.sql.ast.SQLStatement;
   import com.alibaba.druid.sql.parser.SQLStatementParser;
   import com.alibaba.druid.wall.WallProvider.WallCommentHandler;
   import com.alibaba.druid.wall.spi.MySqlWallProvider;
   import java.util.ArrayList;
   import java.util.List;
   public static void main(String[] args) {
        MySqlWallProvider mySqlWallProvider = new MySqlWallProvider();
        SQLStatementParser parser =mySqlWallProvider.createParser("CREATE TABLE `bim5d_cost_actual_usage` ("
            + ""
            + "  `action` enum('create','update','delete') NOT NULL DEFAULT 'create' COMMENT '新增=create;更新=update;删除=delete',"
            + "  `file_id` varchar(64) DEFAULT NULL COMMENT '文件ID'"
            + ") ENGINE=InnoDB AUTO_INCREMENT=9272651926921671736 DEFAULT CHARSET=utf8 COMMENT='人工材料消耗';"
            + "alter  TABLE `bim5d_cost_project`.`bim5d_cost_geqbqitem` add column `src_id` varchar(64) DEFAULT NULL COMMENT '在企业端表中的ID';");
        parser.getLexer().setCommentHandler(WallCommentHandler.instance);
        parser.getLexer().setAllowComment(true);
        List<SQLStatement> statementList = new ArrayList<SQLStatement>();
        parser.parseStatementList(statementList);
        for (SQLStatement sqlStatement : statementList) {
            System.out.println(sqlStatement);
        }
    }
  1. 调试状态下可见解析后的sql对象见下图

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值