Java 如何保留引号以进行适当的SQL查询

Java 如何保留引号以进行适当的SQL查询,java,Java,当我运行下面的程序时 package com.util; import java.util.ArrayList; public class Test { public static void main(String[] args) throws Exception { ArrayList<String> list_of_symbols = new ArrayList<String>(); list_of_symbols.add("A

当我运行下面的程序时

package com.util;
import java.util.ArrayList;
public class Test {
    public static void main(String[] args) throws Exception {
        ArrayList<String> list_of_symbols = new ArrayList<String>();
        list_of_symbols.add("ABB");
        list_of_symbols.add("ACC");
        list_of_symbols.add("SBIN");
        StringBuilder sb_builder = new StringBuilder();
        for (int i = 0; i < list_of_symbols.size(); i++) {
            sb_builder.append(list_of_symbols.get(i) + ",");
        }
        String sql = "Select * from data where symbol_name IN ("
                + sb_builder.deleteCharAt(sb_builder.length() - 1).toString()
                + ")";
        System.out.println(sql);
    }
}
预期结果应该在哪里

Select * from data where symbol_name IN ('ABB','ACC','SBIN')

您能告诉我如何保留引号,使其成为有效的SQL吗?不要使用字符串连接来填充SQL参数。它容易出错。相反,根据需要使用尽可能多的
构建SQL,然后使用
PreparedStatement
和尽可能多的
setString(x,theString)
来填充

在您的情况下,大致如下所示:

package com.util;
import java.util.ArrayList;
public class Test {
    public static void main(String[] args) throws Exception {
        ArrayList<String> list_of_symbols = new ArrayList<String>();
        list_of_symbols.add("ABB");
        list_of_symbols.add("ACC");
        list_of_symbols.add("SBIN");

        // Build the statement
        StringBuilder sql = new StringBuilder(200);
        sql.append("Select * from data where symbol_name IN (");
        for (int i = 0; i < list_of_symbols.size(); i++) {
            sql.append(i == 0 ? "?" : ", ?");
        }
        sql.append(')');

        // Build the PreparedStatement and fill in the parameters
        PreparedStatement ps = someConnection.prepareStatement(sql.toString());
        for (int i = 0; i < list_of_symbols.size(); i++) {
            ps.setString(i + 1, list_of_symbols.get(i));
        }

        // Do it
        ResultSet rs = ps.executeQuery();
    }
}
package com.util;
导入java.util.ArrayList;
公开课考试{
公共静态void main(字符串[]args)引发异常{
ArrayList list_of_symbols=新的ArrayList();
符号列表。添加(“ABB”);
符号列表。添加(“ACC”);
列出所有符号。添加(“SBIN”);
//构建语句
StringBuilder sql=新的StringBuilder(200);
追加(“从数据中选择*,其中符号_名称位于(”);
对于(int i=0;i
(这是未优化的,并以虚线表示。可能需要进行一些编辑。)


很好地解释了为什么对参数使用字符串concat是一个坏主意,以及如何在许多语言中正确执行操作的实际示例,包括。

不要使用字符串连接来填充SQL参数。它容易出错。相反,根据需要使用尽可能多的
构建SQL,然后使用
PreparedStatement
和尽可能多的
setString(x,theString)
来填充

在您的情况下,大致如下所示:

package com.util;
import java.util.ArrayList;
public class Test {
    public static void main(String[] args) throws Exception {
        ArrayList<String> list_of_symbols = new ArrayList<String>();
        list_of_symbols.add("ABB");
        list_of_symbols.add("ACC");
        list_of_symbols.add("SBIN");

        // Build the statement
        StringBuilder sql = new StringBuilder(200);
        sql.append("Select * from data where symbol_name IN (");
        for (int i = 0; i < list_of_symbols.size(); i++) {
            sql.append(i == 0 ? "?" : ", ?");
        }
        sql.append(')');

        // Build the PreparedStatement and fill in the parameters
        PreparedStatement ps = someConnection.prepareStatement(sql.toString());
        for (int i = 0; i < list_of_symbols.size(); i++) {
            ps.setString(i + 1, list_of_symbols.get(i));
        }

        // Do it
        ResultSet rs = ps.executeQuery();
    }
}
package com.util;
导入java.util.ArrayList;
公开课考试{
公共静态void main(字符串[]args)引发异常{
ArrayList list_of_symbols=新的ArrayList();
符号列表。添加(“ABB”);
符号列表。添加(“ACC”);
列出所有符号。添加(“SBIN”);
//构建语句
StringBuilder sql=新的StringBuilder(200);
追加(“从数据中选择*,其中符号_名称位于(”);
对于(int i=0;i
(这是未优化的,并以虚线表示。可能需要进行一些编辑。)

很好地解释了为什么使用字符串concat作为参数是一个坏主意,以及如何在许多语言中正确地执行操作的实际示例,包括。

正如您所知,我建议将列表中的值的数量放入一个?按价值计算,并将其作为一份准备好的报表

然后简单地做

 ps.setString (n, nthString);
在1..n参数的循环中,您的驱动程序将处理正确的转义

像这样:

    List<String> list_of_symbols = new ArrayList<String>();
    list_of_symbols.add("ABB");
    list_of_symbols.add("ACC");
    list_of_symbols.add("SBIN");
    StringJoiner join = new StringJoiner(",",
            "Select * from data where symbol_name IN (", ")");
    for (int i = 0; i < list_of_symbols.size(); i++) {
        join.add("?");
    }
    PreparedStatement ps = aConnection.prepareStatement(join.toString());
    for (int i = 0; i < list_of_symbols.size(); i++) {
        ps.setString(i+1, list_of_symbols.get(i));
    }
List of_symbols=new ArrayList();
符号列表。添加(“ABB”);
符号列表。添加(“ACC”);
列出所有符号。添加(“SBIN”);
细木工连接=新细木工(“,”,
“从数据中选择*,其中符号名称为(“,”);
对于(int i=0;i
正如您所知,我建议您在列表中输入多少个值?按价值计算,并将其作为一份准备好的报表

然后简单地做

 ps.setString (n, nthString);
在1..n参数的循环中,您的驱动程序将处理正确的转义

像这样:

    List<String> list_of_symbols = new ArrayList<String>();
    list_of_symbols.add("ABB");
    list_of_symbols.add("ACC");
    list_of_symbols.add("SBIN");
    StringJoiner join = new StringJoiner(",",
            "Select * from data where symbol_name IN (", ")");
    for (int i = 0; i < list_of_symbols.size(); i++) {
        join.add("?");
    }
    PreparedStatement ps = aConnection.prepareStatement(join.toString());
    for (int i = 0; i < list_of_symbols.size(); i++) {
        ps.setString(i+1, list_of_symbols.get(i));
    }
List of_symbols=new ArrayList();
符号列表。添加(“ABB”);
符号列表。添加(“ACC”);
列出所有符号。添加(“SBIN”);
细木工连接=新细木工(“,”,
“从数据中选择*,其中符号名称为(“,”);
对于(int i=0;i
制作列表时,请使用以下命令:

sb_builder.append("'"+list_of_symbols.get(i) + "',");

注意字符串上的
。这只适用于简单的情况,其中字符串没有
,您不必担心SQL注入。对于更复杂的情况,请使用
PreparedStatements
,并添加
列表。然后将
替换为要使用的字符串。

在创建列表时,请使用以下命令:

sb_builder.append("'"+list_of_symbols.get(i) + "',");

注意字符串上的
。这只适用于简单的情况,其中字符串没有
,您不必担心SQL注入。对于更复杂的情况,请使用
PreparedStatements
,并添加
列表。然后用您想要使用的字符串替换

只需将
添加到您的查询字符串中即可。
您无法保留它们,因为它们不存在。您必须添加它们。offtopic:组合字符串使SQL注入成为可能,您应该避免使用此Use prepared语句必须将
添加到查询字符串中您不能保留它们,因为它们不存在。您必须添加它们。offtopic:组合字符串使SQL注入成为可能,您应该避免使用prepared语句hanks a l