关于Oracle的NVARCHAR2在mybatis-generator中的使用

现象描述:

      笔者在使用mybatis作为ORM时,遇到了从oracle到javaType的类型转化问题,发现实体类应该为string类型的,结果转化为Object类型。


思考问题:

      之前有较多次使用过mybatis和mybatis-generator,知道在 generatorConfig.xml 文件配置对应项的属性就行

    <!-- 指定数据库表 -->  
    <!--<table tableName="items"></table> -->  
    <table schema="????" tableName="????">
      <!-- <columnOverride column="???" javaType="String" property="???" /> -->
    </table>

但是看到oracle数据库字段这么多,一个一个修改还是很不情愿,所以在考虑彻底解决。

解决问题:

        查阅相关文档 mybatis-generator中文文档 ,发现 标签 javaTypeResolver 可以对字段属性转换起作用。可以考虑用该字段配置,发现默认 type = org.mybatis.generator.api.JavaTypeResolver。

        在eclipse的plugins中找到mybatis-generator的文件(路径:D:\eclipse-jee-oxygen-2-win32-x86_64\eclipse\plugins),在其中找到对应core


       这个是jar文件,可以用压缩软件打开,进到对应目录


发现是class文件,不能直接修改。

考虑修改源码来编译。到github下载 源码 ,用maven来install。


找到java文件,在红笔处修改(前面自己注释的地方错误,错误原因为java.sql.Types 不支持 NVARCHAR2)


修改为

        typeMap.put(Types.OTHER, new JdbcTypeInformation("OTHER", //$NON-NLS-1$
                new FullyQualifiedJavaType(String.class.getName())));

然后在core目录下编译生成class文件,将新的class文件替换之前jar中的class文件

然后再用mybatis-generator再次生成pojo和mapper,结果如下


感想:

       这算是自己第二次修改源码(第一次mysql),为了自己认为的简单方式还是忙活了半天,可能实际使用上不如直接在xml的table中添加override的方式这种方法来的快,但是还是很高兴能够找到一个通用的解决方案。当然,最后写完的时候,突然想起来应该用继承的方式来实现class,这样可以不用修改原来的代码,比较合适。


写完以后再补充的:

            继承的实现过程,编译后,修改
<javaTypeResolver type="org.mybatis.generator.internal.types.MyJavaTypeResolverDefaultImpl">  

最后结果证实可行。

package org.mybatis.generator.internal.types;

import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;

import java.sql.Types;

public class MyJavaTypeResolverDefaultImpl extends JavaTypeResolverDefaultImpl {

    public MyJavaTypeResolverDefaultImpl() {
        super();
        //把数据库的 NVARCHAR2 映射成 String
        super.typeMap.put(Types.OTHER, new JdbcTypeInformation("NVARCHAR2", new FullyQualifiedJavaType(String.class.getName())));
    }
}

猜你喜欢

转载自blog.csdn.net/u014418725/article/details/79526262