Creating variable sql statements possibly with empty values?

问题描述 投票:0回答:1

我尝试对此进行研究,但找不到任何答案,可能是因为我真的不知道如何正确地说出我在寻找什么。

我正在使用 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 语句来连接字符串来制作语句,我正在寻找一种更容易做的方法。

java sql postgresql jdbc
1个回答
-1
投票

通过字符串连接来构建 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 查询通常是不好的做法,因为它会导致代码膨胀,从而更难测试。

© www.soinside.com 2019 - 2024. All rights reserved.