String sql = "SELECT id FROM test WHERE type = 9 AND name = ? AND orderId in (1, 2, 3);"; MySqlStatementParser parser = new MySqlStatementParser(sql); SQLStatement s = parser.parseStatement(); StringWriter out = new StringWriter(); MySqlExportParameterVisitor v = new MySqlExportParameterVisitor(out); v.setParameterized(true); v.setShardingSupport(false); v.setPrettyFormat(false); s.accept(v);
System.out.println(v.getParameters());
System.out.println(v.getTables());
assertEquals("SELECT id FROM test WHERE type = ? AND name = ? AND orderId IN (?)", out.toString());
但实际上得到的结果是:
org.junit.ComparisonFailure: Expected :SELECT id FROM test WHERE type = ? AND name = ? AND orderId IN (?) Actual :SELECT id FROM test WHERE type = ? AND name = 9 AND orderId IN (?)
分析了下,在解析type = 9时放到了parameters这个内部变量中去了,再解析name = ?中遇到了?时,又把9输出了。
但如果sql是:SELECT id FROM test WHERE name = ? AND type = 9 AND orderId in (1, 2, 3)的话就能全部做参数化输出了。
原提问者GitHub用户wangyeweikuer
根据你提供的代码,可能是由于 MySqlExportParameterVisitor
的设置不正确导致参数化输出问题。
在创建 MySqlExportParameterVisitor
对象时,将 parameterized
属性设置为 true
,以启用参数化输出。但是,你将 setShardingSupport
属性设置为 false
,这可能会影响参数化输出的结果。
另外,你可以将 setPrettyFormat
属性设置为 true
,以便更好地查看输出结果。
要解决这个问题,你可以尝试以下方法:
1. 将 setShardingSupport
属性设置为 true
,如果你需要支持分片查询。
v.setShardingSupport(true);
2. 确保你使用的是 Druid 的最新版本。在最新版本中,可能已经修复了参数化输出的问题。
3. 如果问题仍然存在,你可能需要查阅 Druid 的文档或咨询相关技术支持,以获取更具体的帮助和解决方案。
希望这些信息对你有所帮助!
根据你提供的代码,可能是由于 MySqlExportParameterVisitor 的设置不正确导致的参数化输出问题。
你在创建 MySqlExportParameterVisitor 对象时,将 parameterized 属性设置为 true,这会启用参数化输出。但是你将 setShardingSupport 属性设置为 false,这可能会影响参数化输出的结果。
另外,你可以将 setPrettyFormat 属性设置为 true,以便更好的查看输出结果。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。