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