我是靠谱客的博主 隐形芹菜,最近开发中收集的这篇文章主要介绍Mybatis代码生成器如何自定义注释,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我们在使用Mybatis代码生成器生成mapper、po以及xml文件的时候,mapper中的方法和po的字段上一般会自动生成一些“无用”的注释,使得代码看起来很乱。为了解决这个问题,一般有三种方式:第一种就是通过配置generatorConfig.xml文件来精简注释,第二种就是通过实现CommentGenerator中的方法,让代码生成器生成我们自己想要的注释效果,第三种既可以做到自定义注释,还能省去get、set方法。

修改generatorConfig.xml中的配置

context

<context id="myContext" targetRuntime="MyBatis3" defaultModelType="flat">

</context>
  • id:可以随便填,保证多个context标签的id不重复就可以;
  • defaultModelType:可以不填,默认值为conditional,flat表示一张表对应一个po;
  • targetRuntime:可以不填,默认值MyBatis3,常用的还有MyBatis3Simple,这个配置会影响生成的mapper和mapper.xml文件中方法的数量。设置为MyBatis3Simple,自动生成的接口会比较少,只包含最最常用的方法。

context子标签

commentGenerator

commentGenerator子标签是用来配置生成的注释的。默认是会生成注释的,并且会生成时间戳。

如果你不想保留时间戳,可以在commentGenerator标签中进行如下配置

<commentGenerator>
    <!-- 不希望生成的注释中包含时间戳 -->
    <property name="suppressDate" value="true"/>
</commentGenerator>

如果你想知道每个字段在数据库中的含义(前提是你已经在数据库对应表的字段中加了注释),也可以在commentGenerator标签中进行如下配置

<commentGenerator>
    <!-- 添加 db 表中字段的注释 -->
    <property name="addRemarkComments" value="true"/>
</commentGenerator>

同样,我们也可以通过配置commentGenerator标签不生成任何注释

<commentGenerator>
    <!-- 是否不生成注释 -->
    <property name="suppressAllComments" value="true"/>
</commentGenerator>

对于其他子标签,大家可以参考参考文章中的第一篇。

自定义commentGenerator

为了更好的生成我们所期望的注释,我们还可以通过实现CommentGenerator类来编写我们自定义的commentGenerator。

首先,我们需要在pom.xml文件中添加依赖

<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.7</version>
</dependency>

之后,实现CommentGenerator类

package com.enn.carbon.inclusion.dal;

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.internal.util.StringUtility;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.Set;

/**
 * MyCommentGenerator
 *
 * @author shenrongtao
 * @date 2022/4/20
 */
public class MyCommentGenerator implements CommentGenerator {

    private final Properties properties;

    public MyCommentGenerator() {
        properties = new Properties();
    }

    @Override
    public void addConfigurationProperties(Properties properties) {
        // 获取自定义的 properties
        this.properties.putAll(properties);
    }

    @Override
    public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        String author = properties.getProperty("author", "Your name");
        String dateFormat = properties.getProperty("dateFormat", "yyyy-MM-dd");
        SimpleDateFormat dateFormatter = new SimpleDateFormat(dateFormat);
        // 获取表注释
        if (StringUtility.stringHasValue(introspectedTable.getRemarks())) {
            topLevelClass.addImportedType("lombok.Data");
            topLevelClass.addJavaDocLine("/**");
            topLevelClass.addJavaDocLine(" * " + introspectedTable.getRemarks());
            topLevelClass.addJavaDocLine(" *");
            topLevelClass.addJavaDocLine(" * @author " + author);
            topLevelClass.addJavaDocLine(" * @date   " + dateFormatter.format(new Date()));
            topLevelClass.addJavaDocLine(" */");
            topLevelClass.addAnnotation("@Data");
        } else {
            topLevelClass.addImportedType("lombok.Data");
            topLevelClass.addJavaDocLine("/**");
            topLevelClass.addJavaDocLine(" * @author " + author);
            topLevelClass.addJavaDocLine(" * @date   " + dateFormatter.format(new Date()));
            topLevelClass.addJavaDocLine(" */");
            topLevelClass.addAnnotation("@Data");
        }
    }

    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
        if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {
            field.addJavaDocLine("/**");
            field.addJavaDocLine(" * " + introspectedColumn.getRemarks());
            field.addJavaDocLine(" */");
        }
    }

    @Override
    public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {

    }

    @Override
    public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean b) {

    }

    @Override
    public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {

    }

    @Override
    public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {

    }

    @Override
    public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {

    }

    @Override
    public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {

    }

    @Override
    public void addJavaFileComment(CompilationUnit compilationUnit) {

    }

    @Override
    public void addComment(XmlElement xmlElement) {

    }

    @Override
    public void addRootComment(XmlElement xmlElement) {

    }

    @Override
    public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {

    }

    @Override
    public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) {

    }

    @Override
    public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {

    }

    @Override
    public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) {

    }

    @Override
    public void addClassAnnotation(InnerClass innerClass, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {

    }

    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable) {

    }
}

最后,修改generatorConfig.xml文件中commentGenerator标签的type属性以及property

<commentGenerator type="com.enn.carbon.inclusion.dal.util.MybatisCommentGenerator">
    <property name="author" value="shenrongtao"/>
    <property name="dateFormat" value="yyyy/MM/dd"/>
</commentGenerator>

自定义Plugin

上面方法在自动生成的po类中仍然会生成很多get、set方法。因此,为了不生成get、set方法,我们可以通过继承PluginAdapter自定义一个Plugin

package com.enn.carbon.inclusion.dal;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.internal.util.StringUtility;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * GeneratorPlugin
 *
 * @author shenrongtao
 * @date 2022/4/20
 */
public class GeneratorPlugin extends PluginAdapter {
    @Override
    public boolean validate(List<String> list) {
        return true;
    }

    @Override
    public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        // 添加import
        topLevelClass.addImportedType("lombok.Data");
        // 添加注解
        topLevelClass.addAnnotation("@Data");
        if (StringUtility.stringHasValue(introspectedTable.getRemarks())) {
            topLevelClass.addJavaDocLine("/**");
            topLevelClass.addJavaDocLine(" * " + introspectedTable.getRemarks());
            topLevelClass.addJavaDocLine(" *");
            topLevelClass.addJavaDocLine(" * @author " + "Your name");
            topLevelClass.addJavaDocLine(" * @date   " + new SimpleDateFormat("yyyy/MM/dd").format(new Date()));
            topLevelClass.addJavaDocLine(" */");
        } else {
            topLevelClass.addJavaDocLine("/**");
            topLevelClass.addJavaDocLine(" * @author " + "Your name");
            topLevelClass.addJavaDocLine(" * @date   " + new SimpleDateFormat("yyyy/MM/dd").format(new Date()));
            topLevelClass.addJavaDocLine(" */");
        }
        return true;

    }

    @Override
    public boolean modelFieldGenerated(Field field, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
        if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {
            field.addJavaDocLine("/**");
            field.addJavaDocLine(" * " + introspectedColumn.getRemarks());
            field.addJavaDocLine(" */");
        }
        return true;
    }

    @Override
    public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
        // 不生成get方法
        return false;
    }

    @Override
    public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
        // 不生成set方法
        return false;
    }

}

在generatorConfig.xml中增加plugin标签

<plugin type="com.enn.carbon.inclusion.dal.GeneratorPlugin">
</plugin>    

问题解决

一切配置好之后,当我们使用maven插件进行代码自动生成的时候,会出现如下问题

Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.7:generate (default-cli) on project carbon-inclusion-dal: Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.7:generate failed: Cannot instantiate object of type com.enn.carbon.inclusion.dal.util.MybatisCommentGenerator

通过参考参考文章中的第四篇,出现这个问题的原因是mybatis-generator的plugin有自己的classpath,我们在项目中直接继承的类和plugin不属于同一个classpath,所以使用maven会报错,所以我们只能通过代码进行生成

package com.enn.carbon.inclusion.dal;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class Generator {
    public static void main(String[] args) throws Exception {
        //MBG 执行过程中的警告信息
        List<String> warnings = new ArrayList<>();
        //当生成的代码重复时,覆盖原代码
        boolean overwrite = true;
        //读取我们的 MBG 配置文件
        InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(is);
        is.close();

        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        //创建 MBG
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        //执行生成代码
        myBatisGenerator.generate(null);
        //输出警告信息
        for (String warning : warnings) {
            System.out.println(warning);
        }
    }
}

参考文章

MyBatis Generator 超详细配置:MyBatis Generator 超详细配置 - 掘金

MyBatis Generator 自动生成注释:MyBatis Generator 自定义生成注释 - SegmentFault 思否

MyBatis Generator 自定义 CommentGenerator 实现中文注释:MyBatis Generator 自定义CommentGenerator实现中文注释_西南马的博客-CSDN博客_commentgenerator

解决自定义CommentGenerator无法初始化的问题:generate failed: Cannot instantiate object of type com.wolffy.jwcz.plugin.MyCommentGenerator_代码编程_积微成著

自动生成domain,再也没有一堆Getter/Setter方法了:MybatisGenerator + Lombok 自动生成的domain再也没有一堆Getter/Setter方法了 - 简书

最后

以上就是隐形芹菜为你收集整理的Mybatis代码生成器如何自定义注释的全部内容,希望文章能够帮你解决Mybatis代码生成器如何自定义注释所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部