0
点赞
收藏
分享

微信扫一扫

【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;



举报

相关推荐

0 条评论