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

目录
  • 前言
  • 正文
    • 1.实现CommentGenerator接口
    • 2.配置generator.xml
    • 3.运行
      • 方法1. java方式(个人推荐)
      • 方法2. maven方式
    • 4.可能出现的问题
      • 4.1 提示找不到MyCommentGenerator
      • 4.2 获取不到字段注释
      • 4.3生成的javabean中字段注释中文乱码

前言

本文写于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;
/**
 * mybatis generator 自定义comment生成器.
 * 基于MBG 1.3.2.
 * @author ZhangAY 2016-02-19
 *
 */
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;
}
/**
 * Adds a suitable comment to warn users that the element was generated, and
 * when it was generated.
 */
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));
}
/**
 * This method adds the custom javadoc tag for. You may do nothing if you do
 * not wish to include the Javadoc tag - however, if you do not include the
 * Javadoc tag then the Java merge capability of the eclipse plugin will
 * break.
 *
 * @param javaElement
 *            the java element
 */
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());
}
/**
 * This method returns a formated date string to include in the Javadoc tag
 * and XML comments. You may return null if you do not want the date in
 * these documentation elements.
 *
 * @return a string representing the current timestamp, or null
 */
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("/**");
	sb.append(" * ");
	sb.append(introspectedTable.getFullyQualifiedTable());
	sb.append(" ");
	sb.append(getDateString());
	innerClass.addJavaDocLine(sb.toString());
	innerClass.addJavaDocLine(" */");
}
public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {
	if (suppressAllComments) {
		return;
	}

	StringBuilder sb = new StringBuilder();

	innerEnum.addJavaDocLine("/**");
	//		addJavadocTag(innerEnum, false);
	sb.append(" * ");
	sb.append(introspectedTable.getFullyQualifiedTable());
	innerEnum.addJavaDocLine(sb.toString());
	innerEnum.addJavaDocLine(" */");
}
public void addFieldComment(Field field, IntrospectedTable introspectedTable,
		IntrospectedColumn introspectedColumn) {
	if (suppressAllComments) {
		return;
	}
	StringBuilder sb = new StringBuilder();
	field.addJavaDocLine("/**");
	sb.append(" * ");
	sb.append(introspectedColumn.getRemarks());
	field.addJavaDocLine(sb.toString());
	//		addJavadocTag(field, false);
	field.addJavaDocLine(" */");
}
public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
	if (suppressAllComments) {
		return;
	}

	StringBuilder sb = new StringBuilder();

	field.addJavaDocLine("/**");
	sb.append(" * ");
	sb.append(introspectedTable.getFullyQualifiedTable());
	field.addJavaDocLine(sb.toString());
	field.addJavaDocLine(" */");
}
public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
	if (suppressAllComments) {
		return;
	}
	//		method.addJavaDocLine("/**");
	//		addJavadocTag(method, false);
	//		method.addJavaDocLine(" */");
}
public void addGetterComment(Method method, IntrospectedTable introspectedTable,
		IntrospectedColumn introspectedColumn) {
	if (suppressAllComments) {
		return;
	}
	method.addJavaDocLine("/**");
	StringBuilder sb = new StringBuilder();
	sb.append(" * ");
	sb.append(introspectedColumn.getRemarks());
	method.addJavaDocLine(sb.toString());

	sb.setLength(0);
	sb.append(" * @return ");
	sb.append(introspectedColumn.getActualColumnName());
	sb.append(" ");
	sb.append(introspectedColumn.getRemarks());
	method.addJavaDocLine(sb.toString());
	//		addJavadocTag(method, false);
	method.addJavaDocLine(" */");
}
public void addSetterComment(Method method, IntrospectedTable introspectedTable,
		IntrospectedColumn introspectedColumn) {
	if (suppressAllComments) {
		return;
	}
	method.addJavaDocLine("/**");
	StringBuilder sb = new StringBuilder();
	sb.append(" * ");
	sb.append(introspectedColumn.getRemarks());
	method.addJavaDocLine(sb.toString());
	Parameter parm = method.getParameters().get(0);
	sb.setLength(0);
	sb.append(" * @param ");
	sb.append(parm.getName());
	sb.append(" ");
	sb.append(introspectedColumn.getRemarks());
	method.addJavaDocLine(sb.toString());
	//		addJavadocTag(method, false);
	method.addJavaDocLine(" */");
}
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {
	if (suppressAllComments) {
		return;
	}
	StringBuilder sb = new StringBuilder();
	innerClass.addJavaDocLine("/**");
	sb.append(" * ");
	sb.append(introspectedTable.getFullyQualifiedTable());
	innerClass.addJavaDocLine(sb.toString());

	sb.setLength(0);
	sb.append(" * @author ");
	sb.append(systemPro.getProperty("user.name"));
	sb.append(" ");
	sb.append(currentDateStr);
	//		addJavadocTag(innerClass, markAsDoNotDelete);
	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;
/**
 * 文件代码
 * @return FILE_CD 文件代码
 */
public String getFileCd() {
    return fileCd;
}
/**
 * 文件代码
 * @param 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>下的子元素是必须按照规定顺序来的,否则运行会报错!

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

(0)

相关推荐

  • MyBatis Generator 自定义生成注释的方法

    最近做项目,ORM 使用的是 MyBatis,为了偷懒,我自然而然的想到了使用 MyBatis Generator(MBG)来生成数据库表对应的实体代码和 Mapper 代码.于是做了如下的配置(对 MBG 配置不熟悉的同学可以参考 Mybatis Generator最完整配置详解): <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC &qu

  • mybatis generator 使用方法教程(生成带注释的实体类)

    引言: 最近的一个项目,由于数据库表巨多,导致需要创建N多个java实体.dao.mapper.xml映射文件,如果均使用纯手工编写,无疑需要耗费大量时间和精力.于是上网学习了mybatis generator的使用. 现在项目写完了,闲暇之余把干货奉上,供大家直接使用. 需求场景: 当你的java 项目数据库有N张表需要使用mybatis进行数据库操作时,建议使用mybatis generator 自动生成工具.可以自动帮助你生成java实体类.dao.mapper.xml等. 首先给大家分享

  • 解决mybatis-generator生成器添加类注释方法无效的问题

    遇到的问题! 注:自定义CommentGenerator的都知道 通过实现CommentGenerator接口的一些不足,毕竟只是实现了CommentGenerator接口,在里面的方法再怎么改,有效的也只是针对model类,并且使用的人大概也发现了,里面的addClassComment方法都知道是在类文件上面生成注释,但是无论我们在这个方法实现里写什么都没有效果,其实因为MGB默认是没有调用这个方法的,这个时候如果有需求希望生成的类文件自动加了类文档说明就办不到了,而如果在源代码的基础上修改,

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

    目录 前言 正文 1.实现CommentGenerator接口 2.配置generator.xml 3.运行 方法1. java方式(个人推荐) 方法2. maven方式 4.可能出现的问题 4.1 提示找不到MyCommentGenerator 4.2 获取不到字段注释 4.3生成的javabean中字段注释中文乱码 前言 本文写于2016.2,是基于mybatis-generator 1.3.2版本来完成的. 目前正式版的mybatis-generator已更新至1.3.5版本,本文同样适用

  • Mybatis Generator 获取不到字段注释的解决

    目录 Mybatis Generator 获取不到字段注释 解决方法 Oracle 数据库 MySql 数据库 详解 mybatis-generator生成数据表中注释 1.克隆项目 2.修改pom文件 3.配置对应的解析生成包 Mybatis Generator 获取不到字段注释 环境限制,暂时只提供Oracle和Mysql的解决方法,其它数据库如果遇到同样问题,原理是一样的,具体就看该数据库应当去配置哪个属性. 解决方法 下面的配置均指的是Mybatis Generator 的配置文件(一般

  • SpringBoot整合Mybatis Generator自动生成代码

    目录 1.创建SpringBoot项目 2. mybatis-generator-maven插件的配置 3. 项目结构构建 4. application.yml配置 5. generatorConfig.xml配置 7. 选择 Mybatis Generator 启动,自动在dao.entity.mapper包下生成代码 Mybatis是目前主流的ORM框架,相比于hibernate的全自动,它是半自动化需要手写sql语句.接口.实体对象,后来推出的Generator自动生成代码,可以帮我们提高

  • Mybatis Generator具体使用小技巧

    目录 1.问题描述 2.解决方案 2.1 pom中指定mybatis generator 插件 2.2 generatorConfig.xml 2.3 执行 2.4 总结 1.问题描述 mybatis generator 简单说就是生成一些mybatis的公共方法,用了好多年了,一直也没记录过,最近使用稍微有了点变话,简单记录下,方便下次使用,也希望可以帮到其他人. 2.解决方案 最近使用主要有两点变化: (1)以前使用,指定了本地数据库驱动jar包,本次直接用maven,dependency指

  • Mybatis Generator Plugin悲观锁实现示例

    目录 前言 实现背景: 实现Mybatis悲观锁 完整代码 前言 Mybatis Generator插件可以快速的实现基础的数据库CRUD操作,它同时支持JAVA语言和Kotlin语言,将程序员从重复的Mapper和Dao层代码编写中释放出来.Mybatis Generator可以自动生成大部分的SQL代码,如update,updateSelectively,insert,insertSelectively,select语句等.但是,当程序中需要SQL不在自动生成的SQL范围内时,就需要使用自定

  • Mybatis generator mapper文件覆盖原文件的示例代码

    generatorConfig.xml编写 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config

  • mybatis generator 配置 反向生成Entity简单增删改查(推荐)

    mybatis generator 配置 反向生成Entity简单增删改查实例代码如下所示: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd

  • Mybatis generator自动生成代码插件实例解析

    mybatis自动生成代码(实体类.Dao接口等)是很成熟的了,就是使用mybatis-generator插件. 它是一个开源的插件,使用maven构建最好,可以很方便的执行 插件官方简介: http://www.mybatis.org/generator/index.html 插件的GitHub地址: https://github.com/mybatis/generator 如何使用mybatis-generator插件呢?只需要三步: 1.修改pom.xml配置文件 网上大部分说法都要添加依

随机推荐