關於數據庫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;
    }

 

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