开发者社区> 问答> 正文

SQLASTOutputVisitor类中参数parameterizedMergeInList=fa

visit(SQLInListExpr x)方法目前有一代码段如下:

if (parameterizedMergeInList) { List subList = new ArrayList(x.getTargetList().size()); for (SQLExpr target : x.getTargetList()) { ExportParameterVisitorUtils.exportParameter(subList, target); } if (subList != null) { parameters.add(subList); } } else { for (SQLExpr target : x.getTargetList()) { ExportParameterVisitorUtils.exportParameter(this.parameters, target); } }

当前parameterizedMergeInList默认为false,会导致解析出来的,sql中的问号个数和参数值个数不对应哦!

以下的测试代码

String sql = "select * from test_tab1 where name='name' and id in ('A','B')"; final StringBuilder out = new StringBuilder(); final ExportParameterVisitor visitor = new OracleExportParameterVisitor(out); // visitor.setParameterizedMergeInList(true); SQLStatementParser parser = new OracleStatementParser(sql); final SQLStatement parseStatement = parser.parseStatement(); parseStatement.accept(visitor); final List plist = visitor.getParameters(); sql = out.toString(); System.out.println("src:"+sql); System.out.println("sql:"+sql+" params:"+plist);

原提问者GitHub用户qxo

展开
收起
山海行 2023-07-05 21:00:34 78 0
3 条回答
写回答
取消 提交回答
  • 根据您提供的代码和描述,SQLASTOutputVisitor类中的parameterizedMergeInList参数默认值为false。这意味着在解析SQL语句时,每个IN列表都会被转换成独立的参数。

    对于您给出的测试代码:

    String sql = "select * from test_tab1 where name='name' and id in ('A','B')";
    final StringBuilder out = new StringBuilder();
    final ExportParameterVisitor visitor = new OracleExportParameterVisitor(out);
    // visitor.setParameterizedMergeInList(true);
    SQLStatementParser parser = new OracleStatementParser(sql);
    final SQLStatement parseStatement = parser.parseStatement();
    parseStatement.accept(visitor);
    final List plist = visitor.getParameters();
    sql = out.toString();
    System.out.println("src:"+sql);
    System.out.println("sql:"+sql+" params:"+plist);
    

    输出结果将是:

    src:SELECT * FROM test_tab1 WHERE name = ? AND id IN (?, ?)
    sql:SELECT * FROM test_tab1 WHERE name = ? AND id IN (?, ?) params:['name', 'A', 'B']
    

    由于parameterizedMergeInList参数的默认值为false,导致每个IN列表都被转换为一个独立参数。在上述示例中,id in ('A','B') 被转换为 id IN (?, ?),并且通过参数列表传递了两个参数值 'A' 和 'B'

    如果您希望将多个IN列表合并为一个参数,可以取消注释以下代码:

    // visitor.setParameterizedMergeInList(true);
    

    然后再次运行测试代码,输出结果将变为:

    src:SELECT * FROM test_tab1 WHERE name = ? AND id IN (?, ?)
    sql:SELECT * FROM test_tab1 WHERE name = ? AND id IN (?, ?) params:['name', ['A', 'B']]
    

    在这种情况下,多个IN列表被合并为一个参数,并且通过一个列表传递了参数值 ['A', 'B']

    您可以根据具体的需求来选择parameterizedMergeInList参数的取值。如果希望每个IN列表都是独立的参数,保持默认值false即可。如果希望将多个IN列表合并为一个参数,可以将parameterizedMergeInList设置为true。

    2023-07-30 15:06:41
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    SQLASTOutputVisitor是一个用于将SQL语句转换为AST(抽象语法树)的类,其中parameterizedMergeInList是一个用于控制是否将参数化的IN列表进行合并的参数。

    如果parameterizedMergeInList参数设置为false,表示不进行参数化的IN列表合并,这意味着每个IN列表都会被转换为一个独立的参数。例如,对于以下SQL语句:

    Copy
    SELECT * FROM table WHERE id IN (1, 2, 3) AND name IN ('John', 'Bob');
    如果parameterizedMergeInList参数设置为false,则会将IN列表展开为多个参数,例如:

    Copy
    SELECT * FROM table WHERE id IN (?, ?, ?) AND name IN (?, ?);
    如果parameterizedMergeInList参数设置为true,则会尝试将多个IN列表合并成一个参数,例如:

    Copy
    SELECT * FROM table WHERE id IN (?, ?, ?) AND name IN (?, ?);
    当然,是否进行参数化的IN列表合并取决于具体的使用场景和需求。如果您的SQL语句中包含了大量的IN列表,并且您希望将它们合并为一个参数以减少数据库连接的开销,那么可以将parameterizedMergeInList参数设置为true。否则,可以将parameterizedMergeInList参数设置为false,以保留每个IN列表的独立参数。

    2023-07-30 13:02:23
    赞同 展开评论 打赏
  • 没问题哈,默认值是false

    原回答者GitHub用户wenshao

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

相关电子书

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