如何在JOOQ中添加全局自定义转换器并关联两类配置
解决jOOQ代码生成配置与运行时配置关联及自定义转换器生效问题
首先明确两个Configuration的核心区别:
org.jooq.meta.jaxb.Configuration:代码生成专用,用来定义生成Java实体、DAO等代码时的规则,比如字段与Java类型的映射、绑定自定义转换器。org.jooq.Configuration:运行时专用,控制jOOQ执行SQL时的连接、事务、类型转换等行为。
第一步:代码生成阶段绑定转换器
不管用XML还是编程式配置代码生成,都要把自定义转换器关联到目标字段,这样生成的代码会自动带上转换器绑定:
XML配置方式(常用)
在代码生成的XML配置里,给对应字段/类型添加转换器:
<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.18.0.xsd"> <!-- 其他配置:数据库连接、生成路径等 --> <generator> <database> <!-- 给特定字段绑定转换器 --> <forcedTypes> <forcedType> <userType>java.lang.String</userType> <converter>com.yourpackage.YourCustomStringConverter</converter> <!-- 指定要应用的字段,支持正则匹配表名+字段名 --> <includeExpression>YOUR_TABLE\.YOUR_STRING_FIELD</includeExpression> </forcedType> </forcedTypes> </database> </generator> </configuration>
编程式配置方式
如果用代码编写生成逻辑,直接构建org.jooq.meta.jaxb.Configuration并添加转换器:
Configuration codegenConfig = new Configuration() .withGenerator(new Generator() .withDatabase(new Database() .withForcedTypes(new ForcedType() .withUserType("java.lang.String") .withConverter("com.yourpackage.YourCustomStringConverter") .withIncludeExpression("YOUR_TABLE\\.YOUR_STRING_FIELD") ) ) ); // 执行代码生成 GenerationTool.generate(codegenConfig);
第二步:运行时配置关联转换器
代码生成后,生成的字段会自动关联你的转换器,只需确保运行时的org.jooq.Configuration能加载到该转换器:
方式1:全局注册转换器到运行时配置
用DefaultConfiguration注册全局转换器,或针对特定类型注册:
// 实例化自定义转换器 YourCustomStringConverter converter = new YourCustomStringConverter(); // 构建运行时配置 DefaultConfiguration runtimeConfig = new DefaultConfiguration(); // 配置数据库方言、数据源等基础信息 runtimeConfig.set(SQLDialect.MYSQL); runtimeConfig.set(dataSource); // 注册全局转换器 runtimeConfig.setConverters(converter); // 或者针对特定DataType单独注册 runtimeConfig.dataType(String.class).converter(converter);
方式2:利用代码生成的绑定类
如果代码生成时已给字段绑定转换器,生成的TableField会自带converter()方法,只要转换器类在运行时类路径中,jOOQ会自动调用该转换器,无需额外全局注册。
确保自定义转换器在插入/更新时被调用
只要完成上述两步:
- 代码生成时将转换器绑定到目标字段;
- 运行时配置能正确加载该转换器;
jOOQ在执行INSERT/UPDATE语句时,会自动对绑定了转换器的字段执行转换逻辑——写入数据库时调用转换器的to()方法,读取时调用from()方法,无需手动触发。
内容的提问来源于stack exchange,提问作者XMitya
相关产品推荐
相关产品推荐

