在Mybatis Generator中生成Instant的SQL Server类型



我想在SQL Server中定义列,以便Mybatis Generator生成java.time.Instantjava.time.OffsetDateTime。根据Mybatis Generator Core,当useJSR310Typestrue时,TIMESTAMP_WITH_TIMEZONE类型的列映射为OffsetDateTime

我在DDL中使用DATETIMEOFFSET类型,但我的实体被翻译为Object。当然,使用DATETIME2的结果是LocalDateTime,这不是我想要的。

示例DDL

CREATE TABLE Users
(
UserId        Int IDENTITY (1,1) NOT NULL,
UserFirstName Nvarchar(50)       NOT NULL,
UserLastName  Nvarchar(50)       NOT NULL,
UserEmail     Nvarchar(100)      NOT NULL,
Created DATETIME2 NOT NULL,
Creator INT NOT NULL,
Modified DATETIME2 NOT NULL,
Modifier INT NOT NULL
);

generatorConfig.xml相关片段

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"https://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<contexttargetRuntime="MyBatis3DynamicSql" defaultModelType="hierarchical">
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="${jdbcDriverClass}"
connectionURL="${jdbcUrl}"
userId="${jdbcUsername}"
password="${jdbcPassword}"
>
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">
<property name="useJSR310Types" value="true"/>
</javaTypeResolver>
<javaModelGenerator targetPackage=""
targetProject="${workingDir}/src/main/java"/>
<javaClientGenerator targetPackage=""
targetProject="${workingDir}/src/main/java" type="ANNOTATEDMAPPER"/>

<table tableName="Users" domainObjectName="User" mapperName="UserBaseMapper">
<property name="rootInterface" value=""/>
<generatedKey column="UserId" identity="true" sqlStatement="JDBC"/>
</table>
</context>
</generatorConfiguration>

MyBatis Generator依赖于JDBC驱动程序进行类型解析。您可以在这里看到SQL Server如何进行类型映射:https://learn.microsoft.com/en-us/sql/connect/jdbc/using-basic-data-types?view=sql-server-ver15

根据该页,DATETIMEOFFSET被映射到一个非标准JDBC类型microsoft.sql.Types.DATETIMEOFFSET。生成器对该类型一无所知(MyBatis本身也不知道)。这就是为什么生成器将列解析为Object

如果你想在SQL Server中使用DATETIMEOFFSET列,那么你可以在生成器中使用重写将Java类型映射到microsoft.sql.DateTimeOffset。您还需要编写一个类型处理程序,以便MyBatis可以使用该类型。

遗憾的是,看起来SQL Server没有直接映射到TIMESTAMP_WITH_TIMEZONE的类型。

还有别的办法。

建议Mybatis使用Instant

<table tableName="Users" domainObjectName="User" mapperName="UserBaseMapper">
<property name="rootInterface" value=""/>
<generatedKey column="UserId" identity="true" sqlStatement="JDBC"/>
<columnOverride column="Created" jdbcType="TIMESTAMP_WITH_TIMEZONE" javaType="java.time.Instant"/>
<columnOverride column="Modified" jdbcType="TIMESTAMP_WITH_TIMEZONE" javaType="java.time.Instant"/>
</table>

也许(也许)JDBC类型是多余的,但它该死的工作在SQL Server和H2 DB,其中H2使用TIMESTAMP WITH TIME ZONE作为列类型

相关内容

  • 没有找到相关文章

最新更新