现有特殊需求,获取 mysql 创建表的ddl,普通使用可以,但是通过项目中访问不行,得知 mybatis-plus 使用了 jsqlparser,但是不知为什么出现了这个异常。
Caused by: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Failed to process, Error SQL: show create table `data_announcement`
at com.baomidou.mybatisplus.core.toolkit.ExceptionUtils.mpe(ExceptionUtils.java:39)
at com.baomidou.mybatisplus.extension.parser.JsqlParserSupport.parserSingle(JsqlParserSupport.java:52)
at com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor.beforeQuery(TenantLineInnerInterceptor.java:65)
at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:78)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62)
at com.sun.proxy.$Proxy373.query(Unknown Source)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151)
... 134 more
Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "table" "TABLE"
at line 1, column 13.
Was expecting one of:
";"
<EOF>
at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:31234)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:31067)
at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:163)
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatement(CCJSqlParserUtil.java:188)
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:63)
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:38)
at com.baomidou.mybatisplus.extension.parser.JsqlParserSupport.parserSingle(JsqlParserSupport.java:49)
... 139 more
网上搜到了如下链接
https://www.cnblogs.com/cndarren/p/13218290.html
得知使用了多租户功能导致数据访问问题,屏蔽此方法即可。
需要看引用的 jar 版本,项目中引用的是 3.5.1,官网文档修改了位置,文档如下
mapper 方法声明
@InterceptorIgnore(tenantLine = "true")
Map getDdlTable(@Param(value = "catalog") String catalog, @Param(value = "tableName") String tableName);
xml 声明
<select id="getDdlTable" resultType="java.util.Map">
show create table `${tableName}`
</select>
返回的数据有一行两列,需要指定返回类型为 map,不然的话返回数据有问题。