【Mybatis】Mybatis generator自動生成外掛如何修改Mapper.xml 的名稱空間namespace
阿新 • • 發佈:2018-11-19
這也是在擴充套件 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