使用 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 执行的绑定变量分配。
我有一个正在设置敏感信息的 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 执行的绑定变量分配。