使用 Jooq 设置字符数组而不是字符串

Using Jooq to set a Character Array instead of String

我有一个正在设置敏感信息的 Jooq 更新查询。敏感信息是一个 char[],然后我用 Arrays.fill(characterArray, '0') 将其清零。

为了通过 Jooq 设置该值,我必须将该字符数组转换为字符串,这首先会破坏字符数组的目的,因为它会在内存中创建一个不可变的字符串,其中我会任由垃圾收集器摆布。

有没有办法让 Jooq 将该值设置为字符数组而不先将其转换为字符串?

此处适当的方法是为您的 VARCHAR 列(jOOQ 将其视为 String)和您的 "user-defined type" char[] 创建一个 data type binding .实施将遵循:

public class CharArrayBinding implements Binding<String, char[]> {
    //                                           ^^^^^^  ^^^^^^
    // JDBC / database type ------------------------+       |
    // user facing type     --------------------------------+

    @Override
    public void set(BindingSetStatementContext<char[]> ctx) {
        ctx.statement().setCharacterStream(
            ctx.index(), 
            new java.io.CharArrayReader(ctx.value())
        );
    }

    ...
}

That binding could then be associated with your relevant columns by the code generator.

现在,有更多的方法可以实现,但是上面已经显示了您可以如何继续这里的想法。

一些注意事项:

我不完全理解您的需求,所以我选择的 CharArrayReader 可能仍然不适合您的需求。此外,无法保证您的 JDBC 驱动程序可能不会执行一些额外的分配,这可能会或可能不会影响您的要求。我个人更喜欢将加密用于这些目的,但同样,这可能不符合您的需求。

然而,通过使用数据类型绑定,您可以覆盖 jOOQ 的内部结构,并且不会有任何 String 由 jOOQ 执行的绑定变量分配。