关于数据库Oracle表字段为NVARCHAR2 与Mybatis Generator运用问题

由于使用mybatis框架,自然而然就需要生成对应mapper.xml文件,由于工作量太多且容易出错,就借由Mybatis Generator插件来自动生成model层 dao层 和mapper.xml文件。发现数据库oracle的字段如果是NVARCHAR2类型,那么model层对应的字段则为Object类型 (应该和NVARCHAR类型一样对应String类型),xml文件中jdbcType为NVARCHAR2(mybatis不支持NVARCHAR2类型,项目启动时会报错。),这都不是想要的结果,如果一个一个改,那也是很大的工作量。在这里提供一个本人试验成功的方法。

修改model层:

查看源码,发现generatorConfig.xml配置文件中的<javaTypeResolver> 作用即为生成对应model层字段。JavaTypeResolver接口的实现类为org.mybatis.generator.internal.types包下的JavaTypeResolverDefaultImpl。可以看到NVARCHAR2相当于Types.OTHER 被解析成OTHER类型(如下图)。

 

 

 

解决方法:

首先 我们在项目中新建org.mybatis.generator.internal.types包,然后在包中新建MyJavaTypeResolverDefaultImpl类 

如图  主要作用是把NVARCHAR2转换成String类型

 

package org.mybatis.generator.internal.types;

import java.sql.Types;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl;

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

 


接着在generatorConfig.xml配置文件中的javaTypeResolver标签 添加属性type去引用我们上面实现的类

 

		<!--指定生成的类型为java类型,避免数据库中number等类型字段 -->

		<javaTypeResolver
			type="org.mybatis.generator.internal.types.MyJavaTypeResolverDefaultImpl">
			<property name="forceBigDecimals" value="false" />
		</javaTypeResolver>

 

最后就是把我们新建的类放入到mybatis-generator-core jar包中  找到MyJavaTypeResolverDefaultImpl类对应的class文件

(如果是Maven项目 则在项目的target\classes目录下 )

找到mybatis-generator-core jar包 右击选择用winRAR打开 进入org.mybatis.generator.internal.types目录

右键选择添加文件到压缩文件中,把MyJavaTypeResolverDefaultImpl.class放入到目录即可

然后在项目中右击generatorConfig.xml ->Run As ->Run Configurations进入下图

在Goals输入mybatis-generator:generate命令 点击Run

运行完成后在model类中看到NVARCHAR2字段不再是Object型,变成了String类型。

(备注:如果使用的是Eclipse在线安装的Mybatis Generator插件发现无法覆盖源码 也就是mapper.xml文件无法更改)

 

 

 

修改mapper.xml

 

在org.mybatis.generator.codegen.mybatis3.xmlmapper包下的XMLMapperGenerator类的方法getSqlMapElement

即为生成mapper.xml文件 下图能看到这些方法对应生成的是xml的配置,我们可以通过注释代码 ,不去生成不需要的标签。

        addResultMapWithoutBLOBsElement(answer);
        addResultMapWithBLOBsElement(answer);
        addExampleWhereClauseElement(answer);
        addMyBatis3UpdateByExampleWhereClauseElement(answer);
        addBaseColumnListElement(answer);
        addBlobColumnListElement(answer);
        addSelectByExampleWithBLOBsElement(answer);
        addSelectByExampleWithoutBLOBsElement(answer);
        addSelectByPrimaryKeyElement(answer);
        addDeleteByPrimaryKeyElement(answer);
        addDeleteByExampleElement(answer);
        addInsertElement(answer);
        addInsertSelectiveElement(answer);
        addCountByExampleElement(answer);
        addUpdateByExampleSelectiveElement(answer);
        addUpdateByExampleWithBLOBsElement(answer);
        addUpdateByExampleWithoutBLOBsElement(answer);
        addUpdateByPrimaryKeySelectiveElement(answer);
        addUpdateByPrimaryKeyWithBLOBsElement(answer);
        addUpdateByPrimaryKeyWithoutBLOBsElement(answer);

在org.mybatis.generator.api包下的IntrospectedColumn类就是我们需要更改的类 

更改getJdbcTypeName()方法 修改成如下 至于更改完成后放到jar包中做法与修改model层是一样 就不复述了(先在项目中建org.mybatis.generator.api包,接着创建IntrospectedColumn类,把源码复制到新建的这个类中,接着修改getJdbcTypeName方法,最后找到项目中的IntrospectedColumn.class去覆盖jar包的IntrospectedColumn.class即可,然后就能在xml文件中看到NVARCHAR2类型对应的是jdbcType="OTHER"

这里需要反编译工具,不然无法看到源码。

    public String getJdbcTypeName() {
        if (jdbcTypeName == null||jdbcTypeName.equalsIgnoreCase("NVARCHAR2")) {
            return "OTHER"; //$NON-NLS-1$
        }

        return jdbcTypeName;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章