我想在SQL Server中定义列,以便Mybatis Generator生成java.time.Instant或java.time.OffsetDateTime。根据Mybatis Generator Core,当TIMESTAMP_WITH_TIMEZONE为OffsetDateTime时,类型为useJSR310Types的列将映射到true
我在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>发布于 2021-07-29 15:26:13
还有另一种方法。
建议Mybatis使用即时
<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作为列类型
发布于 2021-07-29 11:05:16
JDBC生成器依赖于MyBatis驱动程序进行类型解析。您可以在以下位置看到SQL Server如何进行类型映射:https://docs.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的类型。
https://stackoverflow.com/questions/68574227
复制相似问题