MybatisGenerator扩展:自定义注释生成器
相信大家对MybatisGenerator有了一定了解,我是对它又爱又恨,mybatisGenerator插件生成的代码会产生注释,而这些注释又全部是对我们没有用的,虽然可以阻止生成注释,但是没有注释也不好,但是MybatisGenerator插件提供自定义注释生成器,让我们来写一个根据字段备注来生成字段注释,和自定义类注释吧
1、首先编写自定义的注释生成器,首先继承CommentGenerator接口
package javaDIYFree.generator;
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.*;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.config.PropertyRegistry;
import org.mybatis.generator.internal.util.StringUtility;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import static org.mybatis.generator.internal.util.StringUtility.isTrue;
/**
* @author Hearts
* @date 2019/4/16
* @desc
*/
public class SimpleCommentGenerator implements CommentGenerator {
private boolean suppressDate = false;
private boolean suppressAllComments = false;
private boolean addRemarkComments = false;
private SimpleDateFormat dateFormat;
private StringBuffer classCommentBanner;
private String delimiter = "\n";
//我们可以通过官方默认的DefaultCommentGenerator来观察学习,编写我们自己的注释生成器
public void addConfigurationProperties(Properties properties) {
//初始化classCommentBanner
classCommentBanner = new StringBuffer();
//获取是否阻止生成时间注释,默认为true
suppressDate = isTrue(properties
.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_DATE));
//获取是否阻止生成所有注释
suppressAllComments = isTrue(properties
.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS));
//获取是否生成备注注释
addRemarkComments = isTrue(properties
.getProperty(PropertyRegistry.COMMENT_GENERATOR_ADD_REMARK_COMMENTS));
//自定义字段,在xml中配置delimiter属性可以自定义注释的分隔符
if (properties.getProperty("delimiter") != null){
delimiter = properties.getProperty("delimiter");
}
//获取时间格式化的字符串
String dateFormatString = properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_DATE_FORMAT);
if (StringUtility.stringHasValue(dateFormatString)) {
dateFormat = new SimpleDateFormat(dateFormatString);
}
//获取自定义的类注释横幅
if (properties.getProperty("classCommentBanner") != null){
String baseClassCommentBanner = properties.getProperty("classCommentBanner");
//替换${date}字符串为当前格式化时间
baseClassCommentBanner = baseClassCommentBanner.replace("${date}",getDateString());
classCommentBanner.append(baseClassCommentBanner);
}
}
/**
* 获得格式化时间
* @return
*/
private String getDateString(){
if (suppressDate) {
return null;
} else if (dateFormat != null) {
return dateFormat.format(new Date());
} else {
return new Date().toString();
}
}
/**
* 添加字段注释
* @param field
* @param introspectedTable
* @param introspectedColumn
*/
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
generatorComment(introspectedColumn.getRemarks(),field);
}
public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
}
/**
* 添加实体类注释
* @param topLevelClass
* @param introspectedTable
*/
public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
classCommentBanner.append(introspectedTable.getRemarks());
generatorComment(classCommentBanner.toString(),topLevelClass);
}
/**
* 添加内部类注释
* @param innerClass
* @param introspectedTable
*/
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {
}
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean b) {
}
/**
* 添加枚举注释
* @param innerEnum
* @param introspectedTable
*/
public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {
}
/**
* 添加getter方法注释
* @param method
* @param introspectedTable
* @param introspectedColumn
*/
public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
}
/**
* 添加setter方法注释
* @param method
* @param introspectedTable
* @param introspectedColumn
*/
public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
}
/**
* 添加普通方法注释
* @param method
* @param introspectedTable
*/
public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
}
/**
* 添加java文件注释
* @param compilationUnit
*/
public void addJavaFileComment(CompilationUnit compilationUnit) {
}
/**
* 添加mapper.xml注释
* @param xmlElement
*/
public void addComment(XmlElement xmlElement) {
}
public void addRootComment(XmlElement xmlElement) {
}
/**
* 生成备注注释
* @param remark
* @param field
*/
private void generatorComment(String remark,JavaElement field) {
//如果阻止生成注释
if (suppressAllComments){
return;
}
final boolean validRemark = StringUtility.stringHasValue(remark);
//根据参数和备注信息判断是否添加备注
if (validRemark && addRemarkComments){
final String[] remarkLine = remark.split(delimiter);
//开始注释
field.addJavaDocLine("/**");
for (String s : remarkLine) {
field.addJavaDocLine(" * "+s);
}
//结束注释
field.addJavaDocLine(" */");
}
}
}
2、在generatorContext.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>
<context id="Mysql" defaultModelType="flat" targetRuntime="MyBatis3Simple">
<!--自动设置分隔符-->
<!--<property name="autoDelimitKeywords" value="true"/>-->
<!-- 手动设置分隔符 -->
<property name="autoDelimitKeywords" value="true"/>
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
<!--设置要使用java文件的字符编码-->
<!--<property name="javaFileEncoding" value="UTF-8"/>-->
<!--
注释生成标签
type属性:默认不需要写,不写的话就是用系统默认的注释生成器,自定义扩展,将自定义类的全限定类名填进去
-->
<commentGenerator type="javaDIYFree.generator.SimpleCommentGenerator">
<!--阻止生成注释,默认为false-->
<property name="suppressAllComments" value="false"/>
<!--阻止生成的注释包含时间戳,默认为false-->
<!--<property name="suppressDate" value="true"/>-->
<property name="dateFormat" value="yyyy-MM-dd"/>
<!--注释是否添加表的备注信息,默认为false-->
<property name="addRemarkComments" value="true"/>
<!--设置自定义类横幅注释-->
<property name="classCommentBanner" value="@author: hearts,@date: ${date},@desc: "/>
<!--自定义注释之间用逗号分隔-->
<property name="delimiter" value=","/>
</commentGenerator>
<!--jdbc连接-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/test"
userId="root"
password="abcdef"
>
</jdbcConnection>
<!--配置jdbc类型和java类型如何转化-->
<!--forceBigDecimals属性可以控制是否强制将 DECIMAL 和 NUMERIC 类型的 JDBC 字段转换为 Java 类型的-->
<!--java.math . BigDecimal ,默认值为 false,一般不需要配置-->
<!--<javaTypeResolver>-->
<!--<property name="forceBigDecimals" value="false" />-->
<!--</javaTypeResolver>-->
<!--控制生成的实体类-->
<!--targetPackage 生成实体类存放的报名
targetProject 生成实体类的项目路径-->
<javaModelGenerator targetPackage="javaDIYFree.model" targetProject="src\main\java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="mapper" targetProject="src\main\resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="javaDIYFree.dao" targetProject="src\main\java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<table modelType="" tableName="user" domainObjectName="User">
</table>
</context>
</generatorConfiguration>
测试
运行MybatisGenerator程序,如果有疑问可去MybatisGenerator 教程,
注意:必须在数据库中对字段有注释,才会有字段注释,数据库表的注释不知道为什么无法获得
项目结构图
结束
如果有什么意见欢迎一起讨论