背景介绍
- 公司搞了个发布系统,每次开发可以将要执行的sql填写录入然后进行审核发布,一次可以执行多条sql,系统对于多条sql用了中文;切割,然后逐条执行,但是有个问题是一般navicat在导出建表语句时,中文注释里也会存在;分隔符
导致sql分割报错。 - 经查看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);
}
}
- 调试状态下可见解析后的sql对象见下图