使用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
MyBatis中,使用${tableName}动态表名时,可以将表名动态地传入SQL语句中,以便于在运行时根据实际情况来确定表名。但是,在使用MyBatis的SQL解析工具 SQLUtils.parseStatements 解析SQL语句时,需要将${tableName}替换为实际的表名,否则会抛出异常。
这个好像是在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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。