代码之家  ›  专栏  ›  技术社区  ›  Vy Do

MyBatis Generator 1.3.7为Oracle数据库12c生成数据类型错误的实体

  •  0
  • Vy Do  · 技术社区  · 7 年前

    我正在使用MyBatis生成器1.3.7,Oracle数据库12c(由Docker运行 https://hub.docker.com/r/sath89/oracle-12c/ ),JDK 10.0.2版。

    这是文件 generatorConfig.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    <generatorConfiguration>
        <classPathEntry location="/Users/foo/Documents/mybatis/ojdbc7-12.1.0.1.jar"/>
        <context id="context1">
            <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
            <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"/>
            <plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin"/>
            <plugin type="org.mybatis.generator.plugins.RenameExampleClassPlugin">
                <property name="searchString" value="Example$"/>
                <property name="replaceString" value="Criteria"/>
            </plugin>
            <commentGenerator>
                <property name="suppressAllComments" value="true"/>
            </commentGenerator>
            <jdbcConnection connectionURL="jdbc:oracle:thin:dbuser/password@localhost:1521:xe" driverClass="oracle.jdbc.driver.OracleDriver">
            <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
            <sqlMapGenerator targetPackage="com.example.repository" targetProject="src/main/resources"/>
            <javaClientGenerator targetPackage="com.example.repository" targetProject="src/main/java" type="XMLMAPPER"/>
            <table tableName="CCY"/>
        </context>
    </generatorConfiguration>
    

    我的数据库架构

      CREATE TABLE "CCY" 
       (    "CURRENCY_ID" NUMBER(11,0), 
        "CURRENCY_NAME" NVARCHAR2(128), 
        "EXCHANGE_RATE" NUMBER(18,4), 
        "EXCHANGE_RATE_OPERATOR" NUMBER(1,0), 
        "IS_ACTIVE" NUMBER(1,0), 
        "CA_ACCOUNT" NVARCHAR2(32), 
        "BA_ACCOUNT" NVARCHAR2(32), 
        "PREFIX" NVARCHAR2(20), 
        "CCY_NAME" NVARCHAR2(128), 
        "DECIMAL_SEPERATE" NVARCHAR2(32), 
        "AFTER_DECIMAL" NVARCHAR2(20), 
        "SUBFIX" NVARCHAR2(20), 
        "CONVERT_RATE" NUMBER(18,4), 
        "PREFIX_ENG" NVARCHAR2(32), 
        "CCY_NAME_ENG" NVARCHAR2(32), 
        "DECIMAL_SEPERATE_ENG" NVARCHAR2(32), 
        "AFTER_DECIMAL_ENG" NVARCHAR2(32), 
        "SUBFIX_ENG" NVARCHAR2(32), 
        "CONVERT_RATE_ENG" NUMBER(18,4), 
        "PREFIX_DEFAULT" NVARCHAR2(20), 
        "CCY_NAME_DEFAULT" NVARCHAR2(20), 
        "DECIMAL_SEPERATE_DEFAULT" NVARCHAR2(32), 
        "AFTER_DECIMAL_DEFAULT" NVARCHAR2(32), 
        "SUBFIX_DEFAULT" NVARCHAR2(20), 
        "CONVERT_RATE_DEFAULT" NUMBER(18,4), 
        "PREFIX_DEFAULT_ENG" NVARCHAR2(32), 
        "CCY_NAME_DEFAULT_ENG" NVARCHAR2(32), 
        "DECIMAL_SEPERATE_DEFAULT_ENG" NVARCHAR2(32), 
        "AFTER_DECIMAL_DEFAULT_ENG" NVARCHAR2(32), 
        "SUBFIX_DEFAULT_ENG" NVARCHAR2(32), 
        "CONVERT_RATE_DEFAULT_ENG" NUMBER(18,4), 
        "EXAMPLE_AMOUNT" NUMBER(18,4), 
        "SORT_ORDER" NUMBER(*,0), 
        "VALUE_OF_MONEY" VARCHAR2(2048 BYTE), 
        "CREATED_DATE" TIMESTAMP (6) WITH TIME ZONE, 
        "CREATED_BY" NVARCHAR2(64), 
        "MODIFIED_DATE" TIMESTAMP (6) WITH TIME ZONE, 
        "MODIFIED_BY" NVARCHAR2(64)
       ) SEGMENT CREATION IMMEDIATE 
      PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
     NOCOMPRESS LOGGING
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
      BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
      TABLESPACE "USERS" ;
    
       COMMENT ON COLUMN "CCY"."CURRENCY_ID" IS 'Currency identity number';
    REM INSERTING into CCY
    SET DEFINE OFF;
    Insert into CCY (CURRENCY_ID,CURRENCY_NAME,EXCHANGE_RATE,EXCHANGE_RATE_OPERATOR,IS_ACTIVE,CA_ACCOUNT,BA_ACCOUNT,PREFIX,CCY_NAME,DECIMAL_SEPERATE,AFTER_DECIMAL,SUBFIX,CONVERT_RATE,PREFIX_ENG,CCY_NAME_ENG,DECIMAL_SEPERATE_ENG,AFTER_DECIMAL_ENG,SUBFIX_ENG,CONVERT_RATE_ENG,PREFIX_DEFAULT,CCY_NAME_DEFAULT,DECIMAL_SEPERATE_DEFAULT,AFTER_DECIMAL_DEFAULT,SUBFIX_DEFAULT,CONVERT_RATE_DEFAULT,PREFIX_DEFAULT_ENG,CCY_NAME_DEFAULT_ENG,DECIMAL_SEPERATE_DEFAULT_ENG,AFTER_DECIMAL_DEFAULT_ENG,SUBFIX_DEFAULT_ENG,CONVERT_RATE_DEFAULT_ENG,EXAMPLE_AMOUNT,SORT_ORDER,VALUE_OF_MONEY,CREATED_DATE,CREATED_BY,MODIFIED_DATE,MODIFIED_BY) values ('91','LYD','16082,71','0','0','1112','1122',null,'Libyan Dinar',null,null,null,'0',null,null,null,null,null,'0',null,null,null,null,null,'0',null,null,null,null,null,'0','0','130',null,to_timestamp_tz('14-02-2018 18:00:41,370000000 ASIA/HO_CHI_MINH','DD-MM-RRRR HH24:MI:SSXFF TZR'),'ADMIN',to_timestamp_tz('14-02-2018 18:00:41,370000000 ASIA/HO_CHI_MINH','DD-MM-RRRR HH24:MI:SSXFF TZR'),'ADMIN');
    Insert into CCY (CURRENCY_ID,CURRENCY_NAME,EXCHANGE_RATE,EXCHANGE_RATE_OPERATOR,IS_ACTIVE,CA_ACCOUNT,BA_ACCOUNT,PREFIX,CCY_NAME,DECIMAL_SEPERATE,AFTER_DECIMAL,SUBFIX,CONVERT_RATE,PREFIX_ENG,CCY_NAME_ENG,DECIMAL_SEPERATE_ENG,AFTER_DECIMAL_ENG,SUBFIX_ENG,CONVERT_RATE_ENG,PREFIX_DEFAULT,CCY_NAME_DEFAULT,DECIMAL_SEPERATE_DEFAULT,AFTER_DECIMAL_DEFAULT,SUBFIX_DEFAULT,CONVERT_RATE_DEFAULT,PREFIX_DEFAULT_ENG,CCY_NAME_DEFAULT_ENG,DECIMAL_SEPERATE_DEFAULT_ENG,AFTER_DECIMAL_DEFAULT_ENG,SUBFIX_DEFAULT_ENG,CONVERT_RATE_DEFAULT_ENG,EXAMPLE_AMOUNT,SORT_ORDER,VALUE_OF_MONEY,CREATED_DATE,CREATED_BY,MODIFIED_DATE,MODIFIED_BY) values ('92','MAD','2254,55','0','0','1112','1122',null,'Moroccan Dirham',null,null,null,'0',null,null,null,null,null,'0',null,null,null,null,null,'0',null,null,null,null,null,'0','0','134',null,to_timestamp_tz('14-02-2018 18:00:41,370000000 ASIA/HO_CHI_MINH','DD-MM-RRRR HH24:MI:SSXFF TZR'),'ADMIN',to_timestamp_tz('14-02-2018 18:00:41,370000000 ASIA/HO_CHI_MINH','DD-MM-RRRR HH24:MI:SSXFF TZR'),'ADMIN');
    

    java -jar /Users/foo/Documents/mybatis/mybatis-generator-core-1.3.7.jar -configfile generatorConfig.xml -overwrite
    

    结果是

    package com.example.model;
    
    import java.io.Serializable;
    import java.math.BigDecimal;
    
    public class Ccy implements Serializable {
        private Long currencyId;
        private Object currencyName;
        private BigDecimal exchangeRate;
        private Short exchangeRateOperator;
        private Short isActive;
        private Object caAccount;
        private Object baAccount;
        private Object prefix;
        private Object ccyName;
        private Object decimalSeperate;
        private Object afterDecimal;
        private Object subfix;
        private BigDecimal convertRate;
        private Object prefixEng;
        private Object ccyNameEng;
        private Object decimalSeperateEng;
        private Object afterDecimalEng;
        private Object subfixEng;
        private BigDecimal convertRateEng;
        private Object prefixDefault;
        private Object ccyNameDefault;
        private Object decimalSeperateDefault;
        private Object afterDecimalDefault;
        private Object subfixDefault;
        private BigDecimal convertRateDefault;
        private Object prefixDefaultEng;
        private Object ccyNameDefaultEng;
        private Object decimalSeperateDefaultEng;
        private Object afterDecimalDefaultEng;
        private Object subfixDefaultEng;
        private BigDecimal convertRateDefaultEng;
        private BigDecimal exampleAmount;
        private BigDecimal sortOrder;
        private String valueOfMoney;
        private Object createdDate;
        private Object createdBy;
        private Object modifiedDate;
        private Object modifiedBy;
    
        private static final long serialVersionUID = 1L;
    
        public Long getCurrencyId() {
            return currencyId;
        }
    
        public void setCurrencyId(Long currencyId) {
            this.currencyId = currencyId;
        }
    
        //... more getter, setter...
    

    我早料到了

    private Object currencyName;
    

    变成

    private String currencyName;
    

    因为这个字段有数据类型 NVARCHAR2(128) ,其他字段相同。怎么解决?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Roman-Stop RU aggression in UA    7 年前

    Mybatis生成器不知道类型 NVARCHAR2 仅此而已 knows NVARCHAR 键入。

    你可以自己创造 JavaTypeResolver 可以延长违约 JavaTypeResolverDefaultImpl 并将其他类型添加到 typeMap

    推荐文章