我如何能创造动态
public interface ThingDAO {
@SqlQuery("SELECT * FROM things <where>)
List<Thing> findThingsWhere(@Define("where") String where);
}
JDBI How can I dynamically create a WHERE clause while preventing SQL Injection?
但它实际上并不适用于JDBI3
我如何能创造动态
public interface ThingDAO {
@SqlQuery("SELECT * FROM things <where>)
List<Thing> findThingsWhere(@Define("where") String where);
}
JDBI How can I dynamically create a WHERE clause while preventing SQL Injection?
但它实际上并不适用于JDBI3
2条答案
按热度按时间klsxnrf11#
在查询中实现动态过滤有两种主要方法:
WHERE
子句,并使一个NULL
参数表示“在这个参数上没有过滤”。WHERE
子句不适用于您的用例时,或者您希望消除多个查询之间的重复时,请使用此选项。静态
WHERE
子句方式::foo
为null,则things
行将不会在foo_column
上过滤。否则,将只返回具有指定:foo
值的行。:bar
为null,则things
行将不会在bar_column
上过滤。否则,将只返回具有指定:bar
值的行。模板引擎方式
开箱即用,Jdbi 3只提供了简单的模板,取代了例如
<where>
和@Define("where")
参数。这个默认的模板引擎可以用你喜欢的任何东西覆盖。Jdbi为StringTemplate 4和Freemarker提供了额外的模板引擎。
StringTemplate 4不再被积极维护,所以我将只向您展示Freemarker的示例。
FreeMarker
添加依赖项:
@UseFreemarkerEngine
注解可以在SQL对象上使用,这会导致查询首先呈现为Freemarker模板。@UseFreemarkerSqlLocator
类似于@UseFreemarkerEngine
,但增加了从类路径上的文件加载SQL的额外好处。这允许将常用的SQL模式重构为可重用的文件,这些文件可以通过#include
指令引用。util.ftl:
util2.ftl:
ijnw1ujt2#
一个有点不同但相关的用例,我发现
IN
子句有点奇怪,imo实现这一点的一种简单方法是使用UseStringTemplateEngine
,如下所示: