关于mybatis:把Mybatis-Generator生成的代码加上想要的注释

2次阅读

共计 6658 个字符,预计需要花费 17 分钟才能阅读完成。

作者:王建乐

1 前言

在日常开发工作中,咱们常常用 Mybatis Generator 依据表构造生成对应的实体类和 Mapper 文件。然而 Mybatis Generator 默认生成的代码中,正文并不是咱们想要的,所以个别在 Generator 配置文件中,会设置不主动生成正文。带来的问题就是主动生成代码之后,咱们还要本人去类文件中把正文加上,如果生成的类较少还好,如果有生成很多类文件,本人加正文是一件繁琐的工作。

通过重写 Mybatis Generator 的 CommentGenerator 接口,能够不便地生成本人想要的正文,缩小反复工作。

2 应用 Java 形式执行 Mybatis Generator

2.1 IDEA 中新建 Maven 我的项目

pom.xml 中引入 jar 包

<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
    <artifactId>MyGenerator</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.7</version>
        </dependency>
    </dependencies>
</project>

2.2 创立 generatorConfig.xml

轻易找个目录放,我放在 src/main/resources 目录下

<?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="hierarchical" targetRuntime="MyBatis3Simple" >
        <!-- 生成的 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"/>
        <commentGenerator>
            <property name="suppressAllComments" value="false" />
        </commentGenerator>
        <!-- 配置数据库连贯 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="URL"
                        userId="user" password="password">
            <!-- 设置 useInformationSchema 属性为 true -->
            <property name="useInformationSchema" value="true" />
        </jdbcConnection>
        <!-- 生成实体的地位 -->
        <javaModelGenerator targetPackage="com.jd.bulk"
                            targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaModelGenerator>
        <!-- 生成 Mapper XML 的地位 -->
        <sqlMapGenerator targetPackage="com.jd.bulk"
                         targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 生成 Mapper 接口的地位 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.jd.bulk"
                             targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- 设置数据库的表名和实体类名 -->
        <table tableName="worker" domainObjectName="Worker"/>
    </context>
</generatorConfiguration>

2.3 创立 main 办法,运行 Generator

public class Generator {public static void main(String[] args) throws Exception {List<String> warnings = new ArrayList<>(2);
        ConfigurationParser cp = new ConfigurationParser(warnings);

        File configFile = new File("src/main/resources/generatorConfig.xml");
        Configuration config = cp.parseConfiguration(configFile);

        DefaultShellCallback callback = new DefaultShellCallback(true);

        MyBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }
}

运行 main 办法,生成默认正文如下,并不是咱们想要的正文,所以个别会配置为正文不生成:

2.4 实现 CommentGenerator 接口

重写以下办法,自定义正文

public class MySQLCommentGenerator implements CommentGenerator {
    private final 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 author = properties.getProperty("author");
        String dateFormat = properties.getProperty("dateFormat", "yyyy-MM-dd");
        SimpleDateFormat dateFormatter = new SimpleDateFormat(dateFormat);
        // 获取表正文
        String remarks = introspectedTable.getRemarks();
        topLevelClass.addJavaDocLine("/**");
        topLevelClass.addJavaDocLine("*" + remarks);
        topLevelClass.addJavaDocLine("*");
        topLevelClass.addJavaDocLine("* @author" + author);
        topLevelClass.addJavaDocLine("* @date" + dateFormatter.format(new Date()));
        topLevelClass.addJavaDocLine("*/");
    }
    /**
     * 重写给实体类字段加的正文
     */
    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
        // 获取列正文
        String remarks = introspectedColumn.getRemarks();
        field.addJavaDocLine("/**");
        field.addJavaDocLine("*" + remarks);
        field.addJavaDocLine("*/");
    }
    /**
     * 重写给实体类 get 办法加的正文
     */
    @Override
    public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
        // 获取表正文
        String remarks = introspectedColumn.getRemarks();
        method.addJavaDocLine("/**");
        method.addJavaDocLine("*" + method.getName());
        method.addJavaDocLine("*/");
    }

2.5 批改 generatorConfig.xml 配置

将 generatorConfig.xml 文件中的 commentGenerator 做如下批改,type 属性抉择本人的实现类

<commentGenerator type="com.generator.MySQLCommentGenerator">
    <property name="author" value="Your Name"/>
    <property name="dateFormat" value="yyyy/MM/dd"/>
</commentGenerator>

运行 main 办法,生成正文如下:

3 应用 Maven 形式执行 Mybatis Generator

Pom.xml 文件中减少以下配置,须要引入 generator 插件时,依赖实现 CommentGenerator 接口的 jar 包,要先把本人的 jar 包 install 到本地仓库。

否则会报 com.generator.MySQLCommentGenerator 找不到,其余配置同上。

<build>
    <defaultGoal>compile</defaultGoal>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.4.0</version>
            <configuration>
                <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
                <verbose>true</verbose>
                <overwrite>true</overwrite>
            </configuration>
            <dependencies>
                <!-- 其余的数据库,须要批改依赖 -->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>8.0.16</version>
                </dependency>
                <!-- 援用实现 CommentGenerator 接口的 jar 包 -->
                <dependency>
                    <groupId>org.example</groupId>
                    <artifactId>MyGenerator</artifactId>
                    <version>1.0-SNAPSHOT</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>

4 源码剖析

查看执行 Mybatis Generator 的 main 办法,次要分为两局部,解析指定的配置文件与调用生成 java 文件和 Mapper 文件的办法

4.1 解析指定的 xml 配置文件

跟踪解析 xml 文件的办法 cp.parseConfiguration(configFile) 发现,底层以 Document 模式读取 xml 文件,依据标签名解析各标签属性,保留到 Configuration 实例中。

其中解析 commentGenerator 标签的办法 parseCommentGenerator(context, childNode) 中,会获取 commentGenerator 标签的 type 属性值,也就是自定义的”com.generator.MySQLCommentGenerator”类,放到 Context 实例中。

4.2 调用生成 java 文件和 Mapper 文件的办法

xml 配置文件解析实现,失去 Configuration 实例,前面生成文件的工作都会从 Configuration 实例中获取所需数据。生成文件的办法次要步骤为:1. 连贯数据库, 查问表信息与列信息,2. 生成文件内容,3. 写入生成文件。

其中生成文件内容时,会依据 Context 的 type 属性反射创立 MySQLCommentGenerator 实例,而后调用自定义的生成正文办法。

如:生成实体类文件的正文,调用 addModelClassComment 办法

生成字段正文,调用 addFieldComment 办法

生成 Get 办法正文,调用 addGetterComment 办法

在调用 addModelClassComment,addFieldComment,addGetterComment 等生成正文的办法时,执行的都是 MySQLCommentGenerator 类的办法,这样就实现了生成自定义正文的性能。

5 总结

通过应用自定义实现 CommentGenerator 接口,让主动生成的代码加上咱们想要的正文,能够省去本人加正文的麻烦。

与个别应用 Mybatis Generator 生成代码的形式一样,多实现个接口即可。
应用 Maven 形式运行时,须要在 pom.xml 引入插件时,依赖本人 jar 包。

正文完
 0