根据PostgreSQL文档部分:5.9.6. Caveats
约束排除仅在查询的
WHERE
子句包含时才有效 常量。参数化查询将不会被优化,因为 planner无法知道参数值可能选择哪些分区 在运行时。
是否有任何库提供某种PreparedStatement
(我的意思是只有SQL注入工具,因为我们无法从PreparedStatement
的优化性能中受益)并且还生成一个静态SQL字符串,因此我们可以从中受益来自约束排除功能?
答案 0 :(得分:1)
您可以将PostgreSQL JDBC驱动程序配置为在一定数量的调用后切换到预准备语句。请参阅Connection to the Database变量prepareThreshold
,并按照该部分中的链接进行操作。
在您的情况下,您可以尝试使用值0
或非常大的数字。我不确定0
是否意味着“立即使用准备好的陈述”或“从不使用准备好的陈述”。大量数据应该可以防止准备好的陈述。
使用此方法,您的Java代码仍然使用PreparedStatement
,驱动程序负责正确引用。驱动程序和服务器之间的协议将使用“未准备”的语句。
答案 1 :(得分:1)
Apache commons-lang有一个基本的转义方法... javadoc:
例如,
statement.executeQuery("SELECT * FROM MOVIES WHERE TITLE='" +
StringEscapeUtils.escapeSql("McHale's Navy") +
"'");
目前,这种方法只能将单引号变为双引号(“麦克海尔海军”=“麦克海尔海军”)。它不处理在LIKE子句中使用的百分比(%)或下划线(_)的情况。
HTH