我想在SQL Server中定义列,以便Mybatis Generator生成java.time.Instant
或java.time.OffsetDateTime
。根据Mybatis Generator Core,当useJSR310Types
为true
时,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
作为列类型