【问题标题】:How to pass values('how many' are known at runtime) to SQL query如何将值(“多少”在运行时已知)传递给 SQL 查询
【发布时间】:2017-09-25 05:39:03
【问题描述】:

我有以下 java 代码,其中字符串数组,即列表,它是运行时已知的动态值。我需要将此值传递给字符串变量中提到的查询,即 SQL。

List[] list = new Arraylist();

String SQL = "select * from Table_name where col_1 IN ("+list[1]+")" OR
"col_1 IN("+list[2]+")" ....... OR "col_1 IN("+list[n]+")";

List <Class_Name> systemtails = jdbcTemplateObject.query(SQL, new 
Class_Name_Mapper());

一种方法是将以下查询包含在一个循环中,这会使查询执行多次,进而影响性能。

String SQL = "select * from Table_name where col_1 IN ("+list[i]+")";

其中 i=1,2,3,4...n。欢迎所有答案,并提前感谢您:)。

PS : 查询只是为现实中的问题视角构建的,相信我它非常复杂和庞大。

【问题讨论】:

    标签: java mysql arrays list arraylist


    【解决方案1】:

    所以我知道您的查询是在这样的 for 循环中:

    For int I = 0; I  < list.size; I++ {
    String SQL = "select * from Table_name where col_1 IN ("+list[i]+")";
    List <Class_Name> systemtails = jdbcTemplateObject.query(SQL, new 
    Class_Name_Mapper());
    }
    

    为什么不这样做呢:

        String SQL = "select * from Table_name where col_1 IN (";
        For int I = 0; I  < list.size; I++ {
          SQL+=list[I];
          If(I != list.size -1){
            SQL+=","; 
          }else{
            SQL +=")";
          }
        }
        List <Class_Name> systemtails = jdbcTemplateObject.query(SQL, new 
        Class_Name_Mapper());
    

    【讨论】:

    • 非常有帮助的 tnx :)
    • 某些数据库对“in”集大小有限制。例如。在 Oracle 中,您可以传递 1000 个值。
    • @wumpz 是的,你是对的,这就是我在下面使用“OR”的查询的原因。 String SQL = "select * from Table_name where col_1 IN ("+list[1]+")" OR "col_1 IN("+list[2]+")" .... OR "col_1 IN(" +list[n]+")";
    • SQL 长度也有限制。所以为了克服这个问题,你可以引入一个包含所有这些值的临时表,然后对这个表进行内部连接。使用临时表,它只对实际会话可见。
    【解决方案2】:

    首先,您应该使用PreparedStatement 以避免容易发生SQL Injection。

    为此,我将使用 for 循环来构建 IN 条件

    boolean first = true;
    String inCondition = "(";
    for(int i = 0; i < list.length; i++){
        if(first){
            first = false;
        } else {
            inCondition += ", ";
        }
        inCondition += ?;
    }
    inCondition += ")";
    
    PreparedStatement ps = "select * from Table_name where col_1 IN " + inCondition;
    
    int index = 1;
    for(String val : list) {
        ps.setString(index++, val);
    }
    

    【讨论】:

    • 非常有帮助的 tnx :)
    猜你喜欢
    • 2018-06-16
    • 2010-10-10
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 2022-12-02
    • 2023-01-08
    相关资源
    最近更新 更多