开发者社区> 问答> 正文

mybaits中使用动态表名${tableName}时,SQLUtils.parseStatemen

使用druid1.0.14版本时输出{}, 使用druid1.1.10版本时直接报错了。 测试代码如下: ` @test public void test() { String sql = "select name, age from ${t_user} where id = 1"; String dbType = JdbcConstants.MYSQL; List stmtList = SQLUtils.parseStatements(sql, dbType); SQLStatement stmt = stmtList.get(0);

SchemaStatVisitor statVisitor = SQLUtils.createSchemaStatVisitor(dbType);
stmt.accept(statVisitor);

System.out.println(statVisitor.getTables());

}`

报错信息如下:

com.alibaba.druid.sql.parser.ParserException: syntax error, expect CALL, actual IDENTIFIER, pos 30, line 1, column 25, token IDENTIFIER t_user at com.alibaba.druid.sql.parser.SQLParser.acceptIdentifier(SQLParser.java:60) at com.alibaba.druid.sql.parser.SQLStatementParser.parseCall(SQLStatementParser.java:1967) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:324) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:72) at com.alibaba.druid.sql.SQLUtils.parseStatements(SQLUtils.java:464) at com.deppon.demoTest.test(demoTest.java:32)

原提问者GitHub用户woai425

展开
收起
山海行 2023-07-05 19:52:21 114 0
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    MyBatis中,使用${tableName}动态表名时,可以将表名动态地传入SQL语句中,以便于在运行时根据实际情况来确定表名。但是,在使用MyBatis的SQL解析工具 SQLUtils.parseStatements 解析SQL语句时,需要将${tableName}替换为实际的表名,否则会抛出异常。

    2023-07-30 15:08:00
    赞同 展开评论 打赏
  • 这个好像是在mybatis层解析时就缺少了表名,和druid数据解析没有关系 builder.append(src, offset, start - offset); offset = start + openToken.length(); String content = new String(src, offset, end - offset); builder.append(handler.handleToken(content)); offset = end + closeToken.length(); builder.append(src, offset, src.length - offset);

    handleToken方法如下:返回“” public String handleToken(String content) { Object parameter = context.getBindings().get("_parameter"); if (parameter == null) { context.getBindings().put("value", null); } else if (SimpleTypeRegistry.isSimpleType(parameter.getClass())) { context.getBindings().put("value", parameter); } Object value = OgnlCache.getValue(content, context.getBindings()); return (value == null ? "" : String.valueOf(value)); // issue #274 return "" instead of "null" }

    原回答者GitHub用户woai425

    2023-07-06 11:13:51
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载