1. 程式人生 > >【Mybatis】Mybatis generator自動生成外掛如何修改Mapper.xml 的名稱空間namespace

【Mybatis】Mybatis generator自動生成外掛如何修改Mapper.xml 的名稱空間namespace

這也是在擴充套件 Mybatis generator 的時候遇到的問題,記錄一下;

在上一篇文章 如何繼承Mybatis中的Mapper.xml檔案很重要的一點就是要讓兩個Mapper.xml檔案的名稱空間相同,這樣才能夠實現繼承;
那麼既然是自動生成外掛,在生成原始 Mapper.xml的時候,我要如何去修改他的名稱空間呢?
例如SrcTestMapper.xml 的名稱空間是<mapper namespace="com.test.dao.mapper.srctest.SrcTestMapper">
那麼如何按照我的意願修改成<mapper namespace="com.test.dao.mapper.srctest.SrcTestMapperExt">

呢?

繼承DefaultCommentGenerator類,並重寫其中的方法


package com.weidai.common.plugin;

import com.weidai.common.util.StringUtil;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.xml.Attribute;
import
org.mybatis.generator.api.dom.xml.XmlElement; import org.mybatis.generator.internal.DefaultCommentGenerator; import java.util.List; import java.util.Properties; /** * 修改名稱空間 * 去除 myabtis generator生成的註釋 * Created by shirenchuang on 2018/6/25. */ public class CommentGenerator extends DefaultCommentGenerator
{
private Properties myPoperties = new Properties(); @Override public void addConfigurationProperties(Properties properties) { super.addConfigurationProperties(properties); //本地儲存一份properties this.myPoperties.putAll(properties); } @Override public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { super.addFieldComment(field, introspectedTable, introspectedColumn); if (introspectedColumn.getRemarks() != null && !"".equals(introspectedColumn.getRemarks())) { field.addJavaDocLine("/**"); field.addJavaDocLine(" * " + introspectedColumn.getRemarks()); addJavadocTag(field, false); field.addJavaDocLine(" */"); } } //將 namespace修改掉 @Override public void addRootComment(XmlElement rootElement) { super.addRootComment(rootElement); Object replaceNamespace = myPoperties.get("replaceNamespace"); if(null==replaceNamespace||replaceNamespace.toString().equals("false"))return; List<Attribute> lists = rootElement.getAttributes(); int delIndex = -1;String orginNameSpace=""; for(int i = 0;i<lists.size();i++){ if(lists.get(i).getName().equals("namespace")){ orginNameSpace = lists.get(i).getValue(); //if(orginNameSpace.endsWith("Ext"))break; delIndex = i; break; } } if(delIndex!=-1){ lists.remove(delIndex); rootElement.getAttributes().add(new Attribute("namespace", orginNameSpace+"Ext")); } } }

然後generatorConfig.xml 修改一下

    <!-- 修改名稱空間 -->
            <commentGenerator type="com.weidai.common.plugin.CommentGenerator">
                <property name="suppressAllComments" value="true" />
                <property name="suppressDate" value="true"/>
             </commentGenerator>

注意一下 這個commentGenerator放置的順序,它一定時要在 property 和 plugin 後面的;

關於上面重寫方法

    @Override
    public void addConfigurationProperties(Properties properties) {
        super.addConfigurationProperties(properties);
        //本地儲存一份properties
        this.myPoperties.putAll(properties);
    }

主要作用就是將properties儲存一份到我們的實現類裡面;然後我們可以設定屬性,來做一些事情;
比如這裡,我需要一個開關是否需要修改namespace;
只需要將配置檔案中的commentGenerator加上 <property name="replaceNamespace" value="true"/>

 <commentGenerator type="com.weidai.common.plugin.CommentGenerator">
                <property name="suppressAllComments" value="true" />
                <property name="suppressDate" value="true"/>
                 <property name="replaceNamespace" value="true"/>
 </commentGenerator>

然後做一下判斷就好了

Object replaceNamespace = myPoperties.get("replaceNamespace");
        if(null==replaceNamespace||replaceNamespace.toString().equals("false"))return;

有興趣可以下載閱讀或者直接使用我整合的
Mybatis-generator