iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >mybatis-generator如何自定义注释生成
  • 427
分享到

mybatis-generator如何自定义注释生成

2024-04-02 19:04:59 427人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录前言正文1.实现CommentGenerator接口2.配置generator.xml3.运行方法1. java方式(个人推荐)方法2. Maven方式4.可能出现的问题4.1

前言

本文写于2016.2,是基于mybatis-generator 1.3.2版本来完成的.

目前正式版的mybatis-generator已更新至1.3.5版本,本文同样适用于1.3.3~1.3.5,不过CommentGenerator接口中新增一些方法需要额外实现,这点在使用本文提供的代码示例时需要注意下,毕竟本文是实现的1.3.2的接口.

理论上以后mybatis-generator即便是再有更新,只要接口不变架构不变,那么本文依旧适用,毕竟原理是一样的.

需要注意的是,从1.3.3版本开始在commentGenerator标签下新增了addRemarkComments属性(详情请见commentGenerator),某种程度下可替代本文的一些功能,可以先试下效果再来决定是否来自己实现注释生成.

-- 2016.08.27

完善了一些细节.对4.1出现的问题补充了新的解决方案.感谢评论区@Armeng 的提示.

-- 2016.09.28

之前第三步提供的运行方法只有maven方式,而java方式的放在了4.1中,对很多读者造成了不便,主要对此进行了调整(调整后3.1为java方式、3.2为maven方式),顺带完善了下java方式运行的示例代码.

-- 2018.12.26

正文

mybatis-generator 自动生成的代码注释是很反人类的,通常我们在使用的时候都是按照如下设置关闭注释:


<commentGenerator>
 <!--  关闭自动生成的注释  -->
 <property name="suppressAllComments" value="true" />
</commentGenerator>

不过在mybatis-generator官方文档中commentGenerator一节中有这么一段说明:

The default implementation is org.mybatis.generator.internal.DefaultCommentGenerator. The default implementation is designed for extensibility if you only want to modify certain behaviors.

既然是可扩展的,那么该如何做呢?文档中也有说明,只需要实现 org.mybatis.generator.api.CommentGenerator接口,同时有一个public的构造函数,然后为commentGenerator添加属性type,并将其值设置为实现类的全路径即可.

好吧,文档里面是这么说明的,来看看具体怎么做吧.

事先声明我用的是Eclipse+Maven来构建的.

1.实现CommentGenerator接口

当然首先你的工程中要有mybatis-generator-core这个jar包.相关pom如下:


<dependency>
 <groupId>org.mybatis.generator</groupId>
 <artifactId>mybatis-generator-core</artifactId>
 <!-- 注意版本.示例代码使用的是1.3.2.采用更高版本自行再实现下新加的接口即可. -->
 <version>1.3.2</version>
</dependency>

正文,实现CommentGenerator接口,当然继承默认的实现DefaultCommentGenerator也行.然后实现或者是重写自己需要的方法.过程中最好是参照着DefaultCommentGenerator里面的代码来做.

没什么要多说的,下文是我的实现.


import static org.mybatis.generator.internal.util.StringUtility.isTrue;
import java.text.SimpleDateFORMat;
import java.util.Date;
import java.util.Properties;
import org.mybatis.generator.api.CommentGenerator;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.CompilationUnit;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.InnerClass;
import org.mybatis.generator.api.dom.java.InnerEnum;
import org.mybatis.generator.api.dom.java.JavaElement;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.Parameter;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.config.MergeConstants;
import org.mybatis.generator.config.PropertyReGIStry;

public class MyCommentGenerator implements CommentGenerator {
private Properties properties;
private Properties systemPro;
private boolean suppressDate;
private boolean suppressAllComments;
private String currentDateStr;
public MyCommentGenerator() {
	super();
	properties = new Properties();
	systemPro = System.getProperties();
	suppressDate = false;
	suppressAllComments = false;
	currentDateStr = (new SimpleDateFormat("yyyy-MM-dd")).format(new Date());
}
public void addJavaFileComment(CompilationUnit compilationUnit) {
	// add no file level comments by default
	return;
}

public void addComment(XmlElement xmlElement) {
	return;
}
public void addRootComment(XmlElement rootElement) {
	// add no document level comments by default
	return;
}
public void addConfigurationProperties(Properties properties) {
	this.properties.putAll(properties);
	suppressDate = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_DATE));
	suppressAllComments = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS));
}

protected void addJavadocTag(JavaElement javaElement, boolean markAsDoNotDelete) {
	javaElement.addJavaDocLine(" *");
	StringBuilder sb = new StringBuilder();
	sb.append(" * ");
	sb.append(MergeConstants.NEW_ELEMENT_TAG);
	if (markAsDoNotDelete) {
		sb.append(" do_not_delete_during_merge");
	}
	String s = getDateString();
	if (s != null) {
		sb.append(' ');
		sb.append(s);
	}
	javaElement.addJavaDocLine(sb.toString());
}

protected String getDateString() {
	String result = null;
	if (!suppressDate) {
		result = currentDateStr;
	}
	return result;
}
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {
	if (suppressAllComments) {
		return;
	}
	StringBuilder sb = new StringBuilder();
	innerClass.addJavaDocLine("");
}
public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {
	if (suppressAllComments) {
		return;
	}
	
	StringBuilder sb = new StringBuilder();
	
	innerEnum.addJavaDocLine("");
}
public void addFieldComment(Field field, IntrospectedTable introspectedTable,
		IntrospectedColumn introspectedColumn) {
	if (suppressAllComments) {
		return;
	}
	StringBuilder sb = new StringBuilder();
	field.addJavaDocLine("");
}
public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
	if (suppressAllComments) {
		return;
	}
	
	StringBuilder sb = new StringBuilder();
	
	field.addJavaDocLine("");
}
public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
	if (suppressAllComments) {
		return;
	}
	//		method.addJavaDocLine("");
}
public void addGetterComment(Method method, IntrospectedTable introspectedTable,
		IntrospectedColumn introspectedColumn) {
	if (suppressAllComments) {
		return;
	}
	method.addJavaDocLine("");
}
public void addSetterComment(Method method, IntrospectedTable introspectedTable,
		IntrospectedColumn introspectedColumn) {
	if (suppressAllComments) {
		return;
	}
	method.addJavaDocLine("");
}
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {
	if (suppressAllComments) {
		return;
	}
	StringBuilder sb = new StringBuilder();
	innerClass.addJavaDocLine("");
}

2.配置generator.xml

按照如下配置即可,注意type的值为 MyCommentGenerator类的全路径.


<commentGenerator type="MyCommentGenerator">
</commentGenerator>

3.运行

MBG(注: 即 MyBatis Generator 的英文缩写)支持多种方式运行,本文只罗列两种(java方式及maven方式)

如果需要以命令行或其他方式运行参照官网文档:

方法1. java方式(个人推荐)

直接以main方法运行,主要是省事不易出错.代码如下:


public static void main(String[] args) {
 // 执行中的异常信息会保存在warnings中 
 List<String> warnings = new ArrayList<String>();
    try {
        // true:生成的文件覆盖之前的
        boolean overwrite = true;
        // 读取配置,构造 Configuration 对象.  
        // 如果不想使用配置文件的话,也可以直接来 new Configuration(),然后给相应属性赋值.
        File configFile = new File("generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultshellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    } catch (sqlException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (InvalidConfigurationException e) {
        e.printStackTrace();
    } catch (XMLParserException e) {
        e.printStackTrace();
    }
    
    for (String warning : warnings){
        System.out.println(warning);
    }
}

方法2. maven方式

将MyCommentGenerator类打包生成jar,添加到maven库中,类似如下:


 <dependency>
  <groupId>com.saddestmoon</groupId>
  <artifactId>MyCommentGenerator</artifactId>
  <version>0.1.SNAPSHOT</version>
 </dependency>

mybatis-generator-maven-plugin插件添加相关依赖:


 <plugin>
  <groupId>org.mybatis.generator</groupId>
  <artifactId>mybatis-generator-maven-plugin</artifactId>
  <version>1.3.2</version>
  <dependencies>
   <dependency>
    <groupId>com.saddestmoon</groupId>
    <artifactId>MyCommentGenerator</artifactId>
    <version>0.1.SNAPSHOT</version>
   </dependency>
  </dependencies>
 </plugin>

然后工程右键,run as -->maven,填写相关参数,运行mybatis generator.

最后自动生成的代码应该是类似如下:


 
private String fileCd;

public String getFileCd() {
    return fileCd;
}

public void setFileCd(String fileCd) {
    this.fileCd = fileCd;
}

4.可能出现的问题

大多数情况下,到第三步就算是结束了.下面的,都是踩的坑.

4.1 提示找不到MyCommentGenerator

这个一般是使用Maven命令运行MBG时才会出现的错误.

原因是mybatis-generator-core与MyCommentGenerator不在同一个ClassPath下,解决方法如下:

参照第3.2,一定要打包生成jar,然后在pom文件mybatis-generator-maven-plugin插件中添加相关依赖.

使用Java方式(参照3.1)运行MBG可以避免该问题,也不用打包成jar:

4.2 获取不到字段注释

没错,就是introspectedColumn.getRemarks()获取不到字段的注释,生成的javabean里面应该显示字段注释的地方显示的是null.

配置文件中我们对<jdbcConnection>做如下修改即可:


<jdbcConnection driverClass="${driver}"
 connectionURL="{url}" userId="${username}" passWord="${password}">
 <!-- 针对oracle数据库 -->
 <property name="remarksReporting" value="true"></property>
 <!-- 针对Mysql数据库 -->
    <property name="useInformationSchema" value="true"></property>
</jdbcConnection>

问题解决

关于此问题的详细解决思路,参见另一篇文章 Mybatis Generator 获取不到字段注释.如果你用的不是Oracle或mysql,那么最好看下.

4.3生成的javabean中字段注释中文乱码

这个需要手动设置生成文件的编码.

在官方文档<context>一节中<Property >有相关说明,如下.

javaFileEncoding Use this property to specify an encoding to use when working with Java files. Newly generated Java files will be written to the file system in this encoding, and existing Java files will be read with this encoding when performing a merge. If not specified, then the platform default encoding will be used.

所以在配置文件<context>中添加如下子元素即可:


<property name="javaFileEncoding" value="UTF-8"/>

注意:<context>下的子元素是必须按照规定顺序来的,否则运行会报错!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: mybatis-generator如何自定义注释生成

本文链接: http://www.lsjlt.com/news/135064.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作