如何将包含AES_ENCRYPT的MariaDB DDL转换为可正常运行的jOOQ代码
jOOQ实现MariaDB AES_ENCRYPT插入的正确写法
你原有代码运行无效果的核心问题有三个:
- 大概率遗漏了调用
.execute()方法,jOOQ构造的SQL对象只有执行execute才会真正提交到数据库运行 - 给description字段赋值时额外加了
.toString().getBytes(),会导致jOOQ将AES_ENCRYPT函数调用转为客户端本地序列化,不会作为SQL函数传递到数据库执行 - 如果你需要密钥在数据库端做sha1、拼接计算,不要在客户端做toString转换,直接使用jOOQ内置的DSL函数完成计算
对应示例SQL的正确jOOQ代码
首先静态导入DSL相关工具方法:
import static org.jooq.impl.DSL.*;
插入逻辑实现:
rwDsl.insertInto(table) .columns(table.TITLE, table.DESCRIPTION) .values( aesEncrypt(val("title_test"), val("11111")), aesEncrypt(val("description_test"), val("11111")) ) // 必须调用execute才会真正执行插入 .execute();
你原有业务逻辑的修正版
如果你的密钥需要动态拼接created参数并做sha1处理,正确写法如下:
import static org.jooq.impl.DSL.*; // ...... String createdStr = Long.toString(created); rwDsl.insertInto(table) .columns(table.TITLE, table.DESCRIPTION) .values( aesEncrypt( val(x.getTitle()), sha1(concat(val(""), val(createdStr))) ), aesEncrypt( val(x.getDescription()), concat(val(""), val(createdStr)) ) ) .execute();
注意事项
- 表的TITLE、DESCRIPTION字段需要定义为VARBINARY、BLOB等二进制类型,AES_ENCRYPT返回值为二进制串,用字符串类型存储会出现编码丢失,导致后续解密失败
- 如果需要用字符串类型存储加密结果,可以在外层套
hex()函数转十六进制字符串存储,解密时先用unhex()转回二进制再做解密 - 所有业务字面量都要用
val()包装,jOOQ会自动做参数绑定,避免SQL注入风险同时保证语法正确性
内容的提问来源于stack exchange,提问作者JoneNa
相关产品推荐
相关产品推荐

