由于使用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;
}