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