这也是在扩展 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;