JDBI - JDBI 中的@define 和@bind 有什么区别?

JDBI - What's the difference between @define and @bind in JDBI?

这两个函数是否针对 SQL 注入进行了清理/安全?例如,考虑以下内容:

@SqlUpdate("INSERT INTO <tableName> (<columns>) VALUES (<values>)")
    public abstract void addRowToDataset(@Define("tableName") String tableName, @Define("columns") String columns, @BindIn("values") Collection<Object> values);

我目前的理解是 @define 按原样将字符串插入到查询中,但 @bind 进行清理。所以如果我们控制 columns 和 tableName parameters 并且只有 values 参数是用户输入,那么我们应该没问题。

我遇到了同样的问题,但发现答案出奇地难以找到。一位同事告诉我,这在编程时代之前只是一种常识,所以随着软件的发展,它的文档可能被遗忘了。

事实上,Oracle 的Binding and Defining 乍一看似乎很有前途,但完全是误导,因为它的"Defining" 指的是设置引用来检索结果,这在JDBI 中根本不是这个意思.

如果我的同事是正确的话,这就是他们的实际意思:

  • @Define 用于常量,并插入格式 <field>.
  • @Bind 用于变量,并插入格式 :field (a "named parameter")。你是对的:绑定的副作用是会发生清理。
  • @BindIn 用于列表,并插入格式 (element IN (<field>))。这些元素也被清理了。

我的错误是对 @Bind 参数使用 <field> 格式,这导致插值始终为空字符串。