首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >要在Mybatis生成器中生成即时的SQL Server类型

要在Mybatis生成器中生成即时的SQL Server类型
EN

Stack Overflow用户
提问于 2021-07-29 18:23:30
回答 2查看 113关注 0票数 0

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

我在DDL中使用了DATETIMEOFFSET类型,但我的实体被转换为Object。当然,使用DATETIME2会导致LocalDateTime,这不是我想要的。

示例DDL

代码语言:javascript
复制
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的相关片段

代码语言:javascript
复制
<?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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-29 15:26:13

还有另一种方法。

建议Mybatis使用即时

代码语言:javascript
复制
     <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作为列类型

票数 0
EN

Stack Overflow用户

发布于 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的类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68574227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档