我尝试对此进行研究,但找不到任何答案,可能是因为我真的不知道如何正确地说出我在寻找什么。
我正在使用 Java 的 JDBC 驱动程序为 Postgresql 创建一个 PreparedStatement。
我有一张桌子
listings
,其中包含listing_title
,listing_desription
,listing_location
等列
我正在研究一个 findListings() 方法,该方法将适用于各种过滤器,使用
String title
、String description
等变量声明。这些变量可能是 null
,在那些情况下我不想使用过滤器sql语句中的那些行。
为此,我现在有一个很长的 if-else 语句意大利面条,这些语句不断检查过滤器以放置
WHERE .... = ...
和 AND
语句并连接字符串以获得语句。
我想知道是否有更简单的方法,比如预先将所有可能的过滤器放入语句中,而不是将它们与
ANY
之类的关键字一起使用(我知道任何关键字都没有帮助,只是在这种情况下使用它作为示例)
一个可能的陈述是:
SELECT * FROM listings WHERE listing_title = 'title', listing description = ANY, ORDER BY ANY
这个有关键字吗?非常感谢
我用了很多 if else 语句来连接字符串来制作语句,我正在寻找一种更容易做的方法。
通过字符串连接来构建 SQL 查询不是一个好的解决方案。你是对的。相反,您可以使用 IS NULL 检查 SQL 调用中的每个过滤属性。
SELECT * FROM listings
WHERE
(title_param IS NULL OR listings.listing_title = title_param)
AND (description_param IS NULL OR listings.listing_description = description_param)
此 SQL 调用将检查是否提供了过滤器参数值(title_param、description_param),如果没有(在本例中为空),则不会将它们用作过滤条件。
Java 代码看起来像:
String query = "SELECT * FROM listings WHERE (? IS NULL OR listings.listing_title = ?) AND (? IS NULL OR listings.listing_description = ?);";
stmt = conn.prepareStatement(query);
stmt.setString(1, titleParam);
stmt.setString(2, titleParam);
stmt.setString(3, descriptionParam);
stmt.setString(4, descriptionParam);
ResultSet rs = stmt.executeQuery();
注意这里使用PreparedStatement,而不是流行的Statement。这使得代码可以安全地抵御 SQL 注入攻击。另请注意,使用字符串连接构建 SQL 查询通常是不好的做法,因为它会导致代码膨胀,从而更难测试。