Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java中连接SQL字符串移动到PreparedStatement_Java_Sql_Jdbc - Fatal编程技术网

从Java中连接SQL字符串移动到PreparedStatement

从Java中连接SQL字符串移动到PreparedStatement,java,sql,jdbc,Java,Sql,Jdbc,假设我有一个表单,根据用户在表单中填写的字段,我在Java代码中创建SQL语句,使用Java字符串和“field1='a'和field2='B'和field3='C'等子句的连接,等等。如果字段没有填写,我只跳过这一部分,不将其添加到我的Java SQL字符串中,从而接受数据库表中该字段中的任何值。我被告知连接SQL字符串是一种不好的做法,我应该使用PreparedStatement而不是direct executeQuery。在这种情况下,如果不为表单中当前字段的每个组合创建单独的Prepar

假设我有一个表单,根据用户在表单中填写的字段,我在Java代码中创建SQL语句,使用Java字符串和“field1='a'和field2='B'和field3='C'等子句的连接,等等。如果字段没有填写,我只跳过这一部分,不将其添加到我的Java SQL字符串中,从而接受数据库表中该字段中的任何值。我被告知连接SQL字符串是一种不好的做法,我应该使用PreparedStatement而不是direct executeQuery。在这种情况下,如果不为表单中当前字段的每个组合创建单独的PreparedStatement,我将如何执行此操作?

首先,在避免将字符串与字段值连接起来方面做得很好。您刚刚从一次恶劣的SQL注入攻击中拯救了自己

您希望使用与以前相同的逻辑—相同的
if
语句集,并且只在存在字段的SQL中添加一个子句。您可能需要一个
StringBuilder
来构建SQL,以及一个
ArrayList
来存储参数值,直到您准备好使用它们为止。你可能会得到很多看起来像这样的积木

if (! field1Text.equals("")) {
    sql.append(" and field1 = ?");
    params.add(field1Text);
}

最后,在您完成
PreparedStatement
之后,您将遍历参数列表,为每个参数调用
setString

考虑使用QueryDSL或JOOQ之类的框架。

David,非常感谢您的快速响应和宝贵建议。不过,在跟踪位置方面似乎还有很多工作要做。但你是对的,现在每个四岁的孩子都知道如何进行SQL注入,我们应该保持警惕。而且我根本无法搜索像“O'Connor”这样的姓氏。再次感谢,谢谢,斯蒂芬。实际上,我正计划在Android SQLite环境中实现这一点。这些东西能用吗?在这一点上,我甚至不知道PreparedStatement是否能与SQLite一起工作,但我有点希望它能工作。在Android中,你应该使用ContentProvider,也可以使用SQLiteQueryBuilder。谢谢,Stefan。但是如果我在SQLIteQueryBuilder中通过将我的条件与appendWhere()关联来创建where子句,它会不会对SQL注入免疫,并且允许在搜索中使用撇号?奇怪的是,appendWhere不会处理这些“and”情况;您必须发明跟踪这是否是第一个附加子句的方法。也许,有更好的方法,我错过了一些东西。