MyBatis Generator 自定义生成注释

时间:2022-07-22 05:23:17

注释生成器

为了生成db里面的注释,必须自定义注释生成器

EmptyCommentGenerator:

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 java.util.Properties;
import java.util.Set;

public class EmptyCommentGenerator implements CommentGenerator {

    @Override
    public void addConfigurationProperties(Properties properties) {

    }

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

    }

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

    }

    @Override
    public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {

    }

    @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) {

    }
}

MySQLCommentGenerator:

import java.util.Properties;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.TopLevelClass;

/**
 * Created by qhong on 2019/3/22 14:10
 **/
public class MySQLCommentGenerator extends EmptyCommentGenerator {

   private Properties properties;

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

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

   @Override
   public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
      // 获取表注释
      String remarks = introspectedTable.getRemarks();

      topLevelClass.addJavaDocLine("/**");
      topLevelClass.addJavaDocLine(" * " + remarks);
      topLevelClass.addJavaDocLine(" */");
   }

   @Override
   public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
      // 获取列注释
      String remarks = introspectedColumn.getRemarks();
      field.addJavaDocLine("/**");
      field.addJavaDocLine(" * " + remarks);
      field.addJavaDocLine(" */");
   }
}

代码生成配置

mybatis-generator.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">
<!-- 第一种mybatis逆向生成xml配置 -->
<generatorConfiguration>

  <context id="sqlserverTables" defaultModelType="flat"  targetRuntime="MyBatis3">
    <!-- 生成的 Java 文件的编码 -->
    <property name="javaFileEncoding" value="UTF-8"/>
    <!-- 格式化 Java 代码 -->
    <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
    <!-- 格式化 XML 代码 -->
    <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>

    <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
    <!-- 生成的pojo,将implements Serializable-->
    <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>

    <!-- 自定义注释生成器 -->
    <commentGenerator type="com.jsy.order.config.mybatis.MySQLCommentGenerator">
    </commentGenerator>

    <!-- 数据库链接URL、用户名、密码 -->
    <jdbcConnection driverClass="com.mysql.jdbc.Driver"
      connectionURL="jdbc:mysql://18.16.200.42:3306/personnel-dev"
      userId="root"
      password="shitou$root">
      <!-- 设置 useInformationSchema 属性为 true -->
      <property name="useInformationSchema" value="true" />
    </jdbcConnection>

    <!--
    默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer
        true,把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal
    -->
    <javaTypeResolver>
      <property name="forceBigDecimals" value="false"/>
    </javaTypeResolver>

    <!--
    生成model模型,对应的包路径,以及文件存放路径(targetProject),targetProject可以指定具体的路径,如./src/main/java,
    也可以使用“MAVEN”来自动生成,这样生成的代码会在target/generatord-source目录下
    -->
    <!--<javaModelGenerator targetPackage="com.joey.mybaties.test.pojo" targetProject="MAVEN">-->
    <javaModelGenerator targetPackage="com.jsy.order.mybatis.entity" targetProject="./src/main/java">
      <property name="enableSubPackages" value="true"/>
      <!-- 从数据库返回的值被清理前后的空格  -->
      <property name="trimStrings" value="true"/>
    </javaModelGenerator>

    <!--对应的mapper.xml文件  -->
    <sqlMapGenerator targetPackage="mappers" targetProject="./src/main/resources">
      <property name="enableSubPackages" value="true"/>
    </sqlMapGenerator>

    <!-- 对应的Mapper接口类文件 -->
    <javaClientGenerator type="XMLMAPPER" targetPackage="com.jsy.order.mybatis.dao" targetProject="./src/main/java">
      <property name="enableSubPackages" value="true"/>
    </javaClientGenerator>


    <!--生成对应表及类名-->
    <!--<table tableName="stocktradeinfo" domainObjectName="StockTradeInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>-->
    <table tableName="tb_order" domainObjectName="Order" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>

    <table tableName="tb_resident_customer_info" domainObjectName="ResidentCustomerInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>


  </context>
</generatorConfiguration>

注意其中的commentGenerator节点,引用的是自定义的类

上面的网上都有,但是网上一般都是自己写main方法调用

我这边不想写main方法,还是用maven插件命令进行调用

pom.xml插件配置:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>
                <dependencies>
                    <dependency>
                        <groupId> mysql</groupId>
                        <artifactId> mysql-connector-java</artifactId>
                        <version> 5.1.39</version>
                    </dependency>
                    <dependency>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-core</artifactId>
                        <version>1.3.7</version>
                    </dependency>
                    <dependency>
                        <groupId>com.jsy</groupId>
                        <artifactId>order-persistence</artifactId>
                        <version>1.0.0-SNAPSHOT</version>
                    </dependency>
                </dependencies>

                <executions>
                    <execution>
                        <id>Generate MyBatis Artifacts</id>
                        <!--<phase>package</phase>-->
                        <!--<goals>-->
                            <!--<goal>generate</goal>-->
                        <!--</goals>-->
                    </execution>
                </executions>
                <configuration>
                    <!--允许移动生成的文件 -->
                    <verbose>true</verbose>
                    <!-- 是否覆盖 -->
                    <overwrite>true</overwrite>
                    <!-- 自动生成的配置 -->
                    <configurationFile>
                        src/main/resources/mybatis-generator.xml</configurationFile>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

goal:

其中goals注释,是因为mybatis-generator.xml中,如果没有table标签,那么package就会报错

[ERROR] Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.7:generate (Generate MyBatis Artifacts) on project order-persistence: XML Parser Error on line 70: 元素类型为 "context" 的内
容不完整, 它必须匹配 "(property*,plugin*,commentGenerator?,(connectionFactory|jdbcConnection),javaTypeReso
lver?,javaModelGenerator,sqlMapGenerator?,javaClientGenerator?,table+)"。 -> [Help 1]

插件配置的引用

注意插件配置中的引用依赖

<dependency>
                    <groupId>com.jsy</groupId>
                    <artifactId>order-persistence</artifactId>
                    <version>1.0.0-SNAPSHOT</version>
                </dependency>

这是我项目中的一个模块,就是上面自定义注释生成器所在项目的模块,而且这个模块还要引用

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

mybatis-generator 的plugin有自己的classpath,我们在项目中直接继承的类和plugin不属于同一个classpath

这其实是不同的两个维度。

命令生成代码

全都配置好以后,还需要将注释生成器所在模块使用maven命令install到本地,

这样就可以使用下面命令生成代码

mvn mybatis-generator:generate

如果本地并没有注释生成器所在模块,那么就会报异常:

[ERROR] Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.7:generate (default-cli) on project order-persistence: Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.7:generate failed: Cannot instantiate object of type com.jsy.order.config.mybatis.MySQLCommentGenerator -> [Help 1]

参考

MyBatis Generator 自定义生成注释

mybatis-generator自定义注释生成

mybatis插件--(1)--mybatis generator自定义插件或者扩展报Cannot instantiate object of type XXX