MyBatis Generator系列(二)----自定义CommentGenerator实现中文注释

本文主要是介绍MyBatis Generator系列(二)----自定义CommentGenerator实现中文注释,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介


由于MyBatis Generator自带了生成注释的功能,但是,是英文的而且生成的根本无法理解,所以可以通过,修改他的源码来实现生成中文的注释,具体方式有以下几种:


1) 自定义CommentGenerator

2) 修改源码

3) PluginAdapter插件的形式


二、自定义CommentGenerator实现中文注释


2.1、先创建Maven项目




然后右键项目->new->source folder,输入src/main/resources,建好resources目录




然后在POM.XML中加入以下依赖:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.fendo</groupId><artifactId>mybatis-generator-plus</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>mybatis-generator-plus</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.5</version></dependency><dependency><groupId>com.oracle</groupId><artifactId>ojdbc6</artifactId><version>6.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.9</version></dependency></dependencies><build><finalName>mybatis-generator-plus</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build></project>


引入了mybatis-generator-core1.3.5和mysql,oracle。


注意: 


ojdbc6需要自己手动进行安装,下载ojdbc6之后,通过以下命令进行安装:


mvn install:install-file -Dfile=C:/Users/fendo/Downloads/ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=6.0 -Dpackaging=jar -DgeneratePom=true


2.2、创建MyCommentGenerator类实现CommentGenerator接口


package org.mybatis.generator;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.TopLevelClass;
import org.mybatis.generator.api.dom.xml.TextElement;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.api.dom.java.Parameter;
import org.mybatis.generator.config.MergeConstants;
import org.mybatis.generator.config.PropertyRegistry;/**   * @Title: MyCommentGenerator.java * @Package com.fendo.mybatis_generator_plus * @Description:  mybatis generator 自定义comment生成器.*                基于MBG 1.3.5* @author fendo* @date 2017年10月5日 下午3:07:26 * @version V1.0   
*/
public class MyCommentGenerator implements CommentGenerator{/*** properties配置文件*/private Properties 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());}/*** Java类的类注释*/@Overridepublic 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().replace("\n", " "));innerClass.addJavaDocLine(" */");}/*** 为类添加注释*/@Overridepublic void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {if (suppressAllComments) {return;}StringBuilder sb = new StringBuilder();innerClass.addJavaDocLine("/**");sb.append(" * ");sb.append(" * ");sb.append(introspectedTable.getFullyQualifiedTable());innerClass.addJavaDocLine(sb.toString().replace("\n", " "));sb.setLength(0);sb.append(" * @author ");sb.append(systemPro.getProperty("user.name"));sb.append(" ");sb.append(currentDateStr);innerClass.addJavaDocLine(" */");}/*** Mybatis的Mapper.xml文件里面的注释*/@Overridepublic void addComment(XmlElement xmlElement) {}/*** *@Title addConfigurationProperties *@Description: 从该配置中的任何属性添加此实例的属性CommentGenerator配置。*              这个方法将在任何其他方法之前被调用。*@Author fendo*@Date 2017年10月5日 下午3:45:58*@return*@throws*/@Overridepublic 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));}/*** *@Title getDateString *@Description: 此方法返回格式化的日期字符串以包含在Javadoc标记中和XML注释。 如果您不想要日期,则可以返回null在这些文档元素中。*@Author fendo*@Date 2017年10月5日 下午3:45:58*@return*@throws*/protected String getDateString() {String result = null;if (!suppressDate) {result = currentDateStr;}return result;}/*** *@Title addJavadocTag *@Description: 此方法为其添加了自定义javadoc标签。*@Author fendo*@Date 2017年10月5日 下午3:49:05*@param javaElement*@param markAsDoNotDelete*@throws*/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());}/*** 为枚举添加注释*/@Overridepublic void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {if (suppressAllComments) {return;}StringBuilder sb = new StringBuilder();innerEnum.addJavaDocLine("/**");sb.append(" * ");sb.append(introspectedTable.getFullyQualifiedTable());innerEnum.addJavaDocLine(sb.toString().replace("\n", " "));innerEnum.addJavaDocLine(" */");}/*** Java属性注释*/@Overridepublic 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().replace("\n", " "));field.addJavaDocLine(" */");}/*** 为字段添加注释*/@Overridepublic 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().replace("\n", " "));field.addJavaDocLine(" */");}/*** 普通方法的注释,这里主要是XXXMapper.java里面的接口方法的注释*/@Overridepublic void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {if (suppressAllComments) {return;}method.addJavaDocLine("/**");addJavadocTag(method, false);method.addJavaDocLine(" */");}/*** 给getter方法加注释*/@Overridepublic 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().replace("\n", " "));sb.setLength(0);sb.append(" * @return ");sb.append(introspectedColumn.getActualColumnName());sb.append(" ");sb.append(introspectedColumn.getRemarks());method.addJavaDocLine(sb.toString().replace("\n", " "));method.addJavaDocLine(" */");}/*** 给Java文件加注释,这个注释是在文件的顶部,也就是package上面。*/@Overridepublic void addJavaFileComment(CompilationUnit compilationUnit) {SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");compilationUnit.addFileCommentLine("/*");compilationUnit.addFileCommentLine("*");compilationUnit.addFileCommentLine("* "+compilationUnit.getType().getShortName()+".java");compilationUnit.addFileCommentLine("* Copyright(C) 2017-2020 fendo公司");compilationUnit.addFileCommentLine("* @date "+sdf.format(new Date())+"");compilationUnit.addFileCommentLine("*/");}/*** 为模型类添加注释*/@Overridepublic void addModelClassComment(TopLevelClass arg0, IntrospectedTable arg1) {}/*** 为调用此方法作为根元素的第一个子节点添加注释。*/@Overridepublic void addRootComment(XmlElement arg0) {}/*** 给setter方法加注释*/@Overridepublic 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().replace("\n", " "));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().replace("\n", " "));method.addJavaDocLine(" */");}}

配置generator.xml,修改其中的<commentGenerator>为如下形式:


<commentGenerator type="package org.mybatis.generator.MyCommentGenerator">
</commentGenerator>

注意type的值为MyCommentGenerator类的全路径,完整文件如下:

<?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_1_0.dtd">
<generatorConfiguration>  
<!-- 数据库驱动-->  <classPathEntry  location="D:\MavenRepository\mysql\mysql-connector-java\5.1.38\mysql-connector-java-5.1.38.jar"/>  <context id="DB2Tables"  targetRuntime="MyBatis3">  <!-- 指定生成的java文件的编码,没有直接生成到项目时中文可能会乱码 --><property name="javaFileEncoding" value="UTF-8"/><!-- 这里的type里写的是你的实现类的类全路径 --><commentGenerator type="com.fendo.generatorplus.MyCommentGenerator"></commentGenerator><!--数据库链接URL,用户名、密码 -->   <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test" userId="root" password="root">  </jdbcConnection>  <javaTypeResolver>  <property name="forceBigDecimals" value="false"/>  </javaTypeResolver>  <!-- 生成模型的包名和位置-->  <javaModelGenerator targetPackage="com.fendo.generatorplus.entity" targetProject="src/main/java">  <property name="enableSubPackages" value="true"/>  <property name="trimStrings" value="true"/>  </javaModelGenerator>  <!-- 生成映射文件的包名和位置-->  <sqlMapGenerator targetPackage="com.fendo.generatorplus.dao" targetProject="src/main/java">  <property name="enableSubPackages" value="true"/>  </sqlMapGenerator>  <!-- 生成DAO的包名和位置-->  <javaClientGenerator type="XMLMAPPER" targetPackage="com.fendo.generatorplus.dao" targetProject="src/main/java">  <property name="enableSubPackages" value="true"/>  </javaClientGenerator>  <!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->  <table tableName="test" domainObjectName="Test" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table></context>  
</generatorConfiguration>  


2.3、测试代码生成


新建StartUp测试类

package org.mybatis.generator;import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;/**   * @Title: StartUp.java * @Package com.fendo.mybatis_generator_plus * @Description: TODO* @author fendo* @date 2017年10月5日 下午3:53:17 * @version V1.0   
*/
public class StartUp {public static void main(String[] args) throws URISyntaxException {try {System.out.println("--------------------start generator-------------------");List<String> warnings = new ArrayList<String>();boolean overwrite = true;ClassLoader classloader = Thread.currentThread().getContextClassLoader();InputStream is = classloader.getResourceAsStream("generatorConfig.xml");ConfigurationParser cp = new ConfigurationParser(warnings);Configuration config = cp.parseConfiguration(is);DefaultShellCallback callback = new DefaultShellCallback(overwrite);MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);myBatisGenerator.generate(null);System.out.println("--------------------end generator-------------------");} 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();}}
}


然后运行StartUp文件,就会自动生成代码了,生成的bean代码如下:




生成的Mapper如下




能生成中文注释了,但是好像类的注释并没有生成,而且mapper中的注释生成的有点无视。。。这些问题,在修改源码实现中文注释中,得以解决,下一步,就是,把这个项目,打包成JAR,这样才好使用,要使依赖包被打包到最后的jar包中,要在pom.xml中进行相应的配置:


	    <plugin><!-- 因为项目中使用了依赖包,所以要使用maven-assembly-plugin来构建,会把依赖包同时打进jar包中 --><artifactId>maven-assembly-plugin</artifactId><version>2.6</version><configuration><!-- 这里不指定为false打包会生成两个jar包,我们要用的那个jar包命名很乱,后面加了jar-with-dependencies,不喜欢,直接禁用掉 --><appendAssemblyId>false</appendAssemblyId><archive><manifest><!-- 指定类的全路径  否则运行会报找不到main class的错误--><mainClass>org.mybatis.generator.api.ShellRunner</mainClass></manifest></archive><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin>


由于使用了Generator的ShellRunner,所以在打包JAR的时候,可以删了StartUp和generatorConfig.xml文件,然后在项目根路径使用打包命令


mvn clean package


来打包成jar文件,生成如下的jar包



然后把mybatis-generator-plus.jar复制到一个目录下,同时新建一个generatorConfig.xml配置文件,以及一个cmd文件




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_1_0.dtd">
<generatorConfiguration>  
<!-- 数据库驱动-->  <classPathEntry  location="D:\MavenRepository\mysql\mysql-connector-java\5.1.38\mysql-connector-java-5.1.38.jar"/>  <context id="DB2Tables"  targetRuntime="MyBatis3">  <!-- 指定生成的java文件的编码,没有直接生成到项目时中文可能会乱码 --><property name="javaFileEncoding" value="UTF-8"/><!-- 这里的type里写的是你的实现类的类全路径 --><commentGenerator type="org.mybatis.generator.MyCommentGenerator"></commentGenerator><!--数据库链接URL,用户名、密码 -->   <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test" userId="root" password="root">  </jdbcConnection>  <javaTypeResolver>  <property name="forceBigDecimals" value="false"/>  </javaTypeResolver>  <!-- 生成模型的包名和位置-->  <javaModelGenerator targetPackage="com.fendo.generatorplus.entity" targetProject="src/main/java">  <property name="enableSubPackages" value="true"/>  <property name="trimStrings" value="true"/>  </javaModelGenerator>  <!-- 生成映射文件的包名和位置-->  <sqlMapGenerator targetPackage="com.fendo.generatorplus.dao" targetProject="src/main/java">  <property name="enableSubPackages" value="true"/>  </sqlMapGenerator>  <!-- 生成DAO的包名和位置-->  <javaClientGenerator type="XMLMAPPER" targetPackage="com.fendo.generatorplus.dao" targetProject="src/main/java">  <property name="enableSubPackages" value="true"/>  </javaClientGenerator>  <!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->  <table tableName="test" domainObjectName="Test" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table></context>  
</generatorConfiguration>  

cmd内容如下:

echo off
set JAVA_HOME=C:\work\java\jdk1.8.0_102
set M2_HOME=C:\work\Java\apache-maven-3.0.3set PATHP=%PATH%
set PATH=%PATH%;%M2_HOME%\bin;%ANT_HOME%\binJava -jar mybatis-generator-plus.jar -configfile generatorConfig.xml -overwriteset PATHP=%PATH%

然后一运行就cmd文件就会自动生成代码了。


完整项目:http://download.csdn.net/download/u011781521/10008156

这篇关于MyBatis Generator系列(二)----自定义CommentGenerator实现中文注释的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068614

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima