我如何在何处创建动态
public interface ThingDAO {
@SqlQuery("SELECT * FROM things <where>)
List<Thing> findThingsWhere(@Define("where") String where);
}
Run Code Online (Sandbox Code Playgroud)
JDBI 如何在防止 SQL 注入的同时动态创建 WHERE 子句?
但它实际上并不适用于 JDBI3
在查询中实现动态过滤有两种主要方法:
WHERE子句,并使NULL参数表示“不对这个参数进行过滤”。我建议您始终先尝试这种方法。WHERE子句不适用于您的用例,或者您想消除多个查询之间的重复时,请使用此选项。WHERE子句方法:SELECT * FROM things
WHERE (:foo IS NULL OR foo_column = :foo)
AND (:bar IS NULL or bar_column = :bar)
Run Code Online (Sandbox Code Playgroud)
:foo为 null,则things不会在 上过滤行foo_column。否则,只会:foo返回具有指定值的行。:bar为 null,则things不会在 上过滤行bar_column。否则,只会:bar返回具有指定值的行。开箱即用,Jdbi 3 只提供简单的模板,例如<where>用您的@Define("where")参数替换。
这个默认模板引擎可以用你喜欢的任何东西覆盖。Jdbi 为 StringTemplate 4 和 Freemarker 提供了额外的模板引擎。
StringTemplate 4 不再积极维护,因此我将仅向您展示 Freemarker 的示例。
添加依赖:
<dependency>
<groupId>org.jdbi</groupId>
<artifactId>jdbi3-freemarker</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
所述@UseFreemarkerEngine注释可以在SQL对象,这将导致第一呈现为Freemarker模板查询上使用。
该@UseFreemarkerSqlLocator像@UseFreemarkerEngine,但装载的SQL从classpath文件额外的奖励。这允许将常用的 SQL 模式重构为可重用的文件,这些文件可以通过#include指令引用。
<#include "/org/jdbi/v3/freemarker/util.ftl">
<#include "util2.ftl">
select name from something
where id in (<#list somethings as something>${something.id}<#sep>, </#list>)
<@groupBy field="name" />
<@orderBy field="name" />
Run Code Online (Sandbox Code Playgroud)
util.ftl:
<#macro orderBy field order="ASC">
ORDER BY ${field} ${order}
</#macro>
Run Code Online (Sandbox Code Playgroud)
util2.ftl:
<#macro groupBy field>
GROUP BY ${field}
</#macro>
Run Code Online (Sandbox Code Playgroud)