MybatisGenerator扩展:自定义注释生成器

本文介绍如何通过自定义注释生成器扩展MybatisGenerator功能,实现根据字段备注生成注释,以及如何在配置文件中进行相应设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 教程
注意:必须在数据库中对字段有注释,才会有字段注释,数据库表的注释不知道为什么无法获得

项目结构图

在这里插入图片描述

结束

如果有什么意见欢迎一起讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值