首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将值(运行时已知的“多少”)传递给SQL查询

如何将值(运行时已知的“多少”)传递给SQL查询
EN

Stack Overflow用户
提问于 2017-04-27 12:15:58
回答 2查看 83关注 0票数 0

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

代码语言:javascript
复制
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());

一种方法是将后续查询封装在一个循环中,这使得查询不止一次地执行,哪一个循环会影响性能。

代码语言:javascript
复制
String SQL = "select * from Table_name where col_1 IN ("+list[i]+")";

在哪里i=1,2,3,4...n。欢迎所有答复,并预先感谢:)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-27 12:25:06

因此,我了解您的查询处于如下for循环中:

代码语言:javascript
复制
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());
}

为什么不这样做呢?

代码语言:javascript
复制
    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());
票数 0
EN

Stack Overflow用户

发布于 2017-04-27 12:25:31

首先,您应该使用PreparedStatement来避免使用SQL注入。

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

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43657556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档