You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将包含AES_ENCRYPT的MariaDB DDL转换为可正常运行的jOOQ代码

jOOQ实现MariaDB AES_ENCRYPT插入的正确写法

你原有代码运行无效果的核心问题有三个:

  1. 大概率遗漏了调用.execute()方法,jOOQ构造的SQL对象只有执行execute才会真正提交到数据库运行
  2. 给description字段赋值时额外加了.toString().getBytes(),会导致jOOQ将AES_ENCRYPT函数调用转为客户端本地序列化,不会作为SQL函数传递到数据库执行
  3. 如果你需要密钥在数据库端做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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:57:01