2024-07-31
不合理的事物,未必都是显而易见的 --- 《惊悚乐园》 · 2879824237
JOOQ
在 JOOQ 中,数据库的时间类型会自动映射到相应的 Java 类型。具体映射关系如下:
- DATE:数据库中的
DATE
类型映射到 Java 的java.sql.Date
或java.time.LocalDate
。 - TIME:数据库中的
TIME
类型映射到 Java 的java.sql.Time
或java.time.LocalTime
。 - TIMESTAMP:数据库中的
TIMESTAMP
类型映射到 Java 的java.sql.Timestamp
或java.time.LocalDateTime
。 - TIMESTAMP WITH TIME ZONE:数据库中的
TIMESTAMP WITH TIME ZONE
类型映射到 Java 的java.time.OffsetDateTime
或java.time.ZonedDateTime
。 - TIME WITH TIME ZONE:数据库中的
TIME WITH TIME ZONE
类型映射到 Java 的java.time.OffsetTime
。
可以通过配置 JOOQ 来选择是使用 java.sql
包下的类还是 java.time
包下的类。例如,在 JOOQ 配置文件中,可以这样指定:
<configuration>
<generator>
<database>
<dateAsTimestamp>true</dateAsTimestamp>
</database>
<generate>
<javaTimeTypes>true</javaTimeTypes>
</generate>
</generator>
</configuration>
其中 javaTimeTypes
属性设置为 true
时,JOOQ 会使用 java.time
包下的类。如果设置为 false
,则会使用 java.sql
包下的类。
要在 Gradle 项目中配置 JOOQ,使其生成的代码可以使用自定义的 dateConverter
类来处理 SQL 时间类型到 Java 时间类型的转换,可以按照以下步骤进行配置:
-
定义 DateConverter 类: 首先,确保你的
DateConverter
类已定义,并且实现了 JOOQ 的Converter
接口。例如:import org.jooq.Converter;
import java.sql.Date;
import java.time.LocalDate;
public class DateConverter implements Converter<Date, LocalDate> {
@Override
public LocalDate from(Date databaseObject) {
return databaseObject == null ? null : databaseObject.toLocalDate();
}
@Override
public Date to(LocalDate userObject) {
return userObject == null ? null : Date.valueOf(userObject);
}
@Override
public Class<Date> fromType() {
return Date.class;
}
@Override
public Class<LocalDate> toType() {
return LocalDate.class;
}
} -
配置 JOOQ 代 码生成器: 在
build.gradle
文件中配置 JOOQ,使其使用自定义的DateConverter
。你需要在 JOOQ 的生成配置中指定转换器。plugins {
id 'nu.studer.jooq' version '8.0'
id 'java'
}
dependencies {
implementation 'org.jooq:jooq'
jooqGenerator 'org.jooq:jooq-meta'
jooqGenerator 'org.jooq:jooq-codegen'
jooqGenerator 'com.h2database:h2' // 根据你使用的数据库替换
}
jooq {
version = '3.15.4' // 替换为你使用的 JOOQ 版本
configurations {
main {
generateSchemaSourceOnCompilation = true
generator {
name = 'org.jooq.codegen.DefaultGenerator'
database {
name = 'org.jooq.meta.h2.H2Database' // 根据你使用的数据库替换
inputSchema = 'PUBLIC'
}
target {
packageName = 'com.example.jooq'
directory = 'src/generated/java'
}
strategy {
name = 'org.jooq.codegen.DefaultGeneratorStrategy'
converters {
converter {
fromTypes = ['java.sql.Date']
toTypes = ['java.time.LocalDate']
converter = 'com.example.DateConverter'
}
// 添加其他转换器配置
}
}
}
}
}
}
// 其他配置 -
确保 DateConverter 在类路径上: 确保你的
DateConverter
类被正确编译,并且在生成 JOOQ 类时能够被找到。你可以将DateConverter
类放在src/main/java/com/example
目录下。 -
运行代码生成: 运行以下命令生成 JOOQ 代码:
./gradlew generateMainJooqSchemaSource
这将生成包含自定义转换器的 JOOQ 代码,你的数据库时间类型将自动使用 DateConverter
进行转换。
在 JOOQ 中,默认情况下会使用 JOOQ 自带的转换类来处理 SQL 时间类型到 Java 时间类型的转换。这些默认的转换类主要是针对 java.sql
和 java.time
包下的时间类型。具体来说,JOOQ 默认的转换类包括:
-
Date to LocalDate:
- 使用
org.jooq.impl.DefaultConverterProvider
提供的默认转换器。 - 具体实现为:
org.jooq.impl.DateToLocalDateConverter
。
- 使用
-
Time to LocalTime:
- 使用
org.jooq.impl.DefaultConverterProvider
提供的默认转换器。 - 具体实现为:
org.jooq.impl.TimeToLocalTimeConverter
。
- 使用
-
Timestamp to LocalDateTime:
- 使用
org.jooq.impl.DefaultConverterProvider
提供的默认转换器。 - 具体实现为:
org.jooq.impl.TimestampToLocalDateTimeConverter
。
- 使用
-
Timestamp with Time Zone to OffsetDateTime:
- 使用
org.jooq.impl.DefaultConverterProvider
提供的默认转换器。 - 具体实现为:
org.jooq.impl.TimestampWithTimeZoneToOffsetDateTimeConverter
。
- 使用
-
Time with Time Zone to OffsetTime:
- 使用
org.jooq.impl.DefaultConverterProvider
提供的默认转换器。 - 具体实现为:
org.jooq.impl.TimeWithTimeZoneToOffsetTimeConverter
。
- 使用
这些默认转换器位于 org.jooq.impl
包下,JOOQ 会根据配置自动选择合适的转换器。例如,当你在 JOOQ 配置中设置 javaTimeTypes
为 true
时,JOOQ 会使用这些默认的 Java 8 时间类型转换器。
如果你希望使用这些默认的转换器,只需确保在 JOOQ 配置中启用 javaTimeTypes
选项即可。例如:
<configuration>
<generator>
<database>
<dateAsTimestamp>true</dateAsTimestamp>
</database>
<generate>
<javaTimeTypes>true</javaTimeTypes>
</generate>
</generator>
</configuration>
这样,JOOQ 生成的代码将自动使用 java.time
包下的时间类型,并应用默认的转换器。
要在 Gradle 项目中配置 JOOQ,使其使用默认的转换器将 TIMESTAMPTZ
类型转换为 Instant
,可以通过配置 forcedType
来实现。以下是一个具体的配置示例:
-
配置 JOOQ 代码生成器: 在
build.gradle
文件中配置 JOOQ,使其使用默认的转换器将TIMESTAMPTZ
类型映射到Instant
。plugins {
id 'nu.studer.jooq' version '8.0'
id 'java'
}
dependencies {
implementation 'org.jooq:jooq'
jooqGenerator 'org.jooq:jooq-meta'
jooqGenerator 'org.jooq:jooq-codegen'
jooqGenerator 'com.h2database:h2' // 根据你使用的数据库替换
}
jooq {
version = '3.15.4' // 替换为你使用的 JOOQ 版本
configurations {
main {
generateSchemaSourceOnCompilation = true
generator {
name = 'org.jooq.codegen.DefaultGenerator'
database {
name = 'org.jooq.meta.h2.H2Database' // 根据你使用的数据库替换
inputSchema = 'PUBLIC'
forcedTypes {
forcedType {
name = 'INSTANT'
includeTypes = 'TIMESTAMPTZ'
}
}
}
target {
packageName = 'com.example.jooq'
directory = 'src/generated/java'
}
generate {
javaTimeTypes = true
}
}
}
}
}
// 其他配置 -
强制类型映射: 在上面的配置中,
forcedTypes
部分强制将数据库中的TIMESTAMPTZ
类型映射为INSTANT
。JOOQ 将会使用默认的转换器将TIMESTAMPTZ
类型转换为java.time.Instant
。 -
运行代码生成: 运行以下命令生成 JOOQ 代码:
./gradlew generateMainJooqSchemaSource
这将生成包含自定义类型映射的 JOOQ 代码,数据库中的 TIMESTAMPTZ
类型将自动使用默认的转换器转换为 Instant
。
在 JOOQ 中,forcedType
和 strategy.converter
都可以用来处理数据库类型到 Java 类型的转换,但它们的用法和目的有所不同。以下是它们的区别: