Reverse engineering annotations MyBatis Generator generate entity class attribute field Notes Table, serialized, toString

table of Contents

First, the article Introduction

Second, cancel auto-generated comments

Third, the automatic generation of a sequence of

Fourth, automatic generation toString

Fifth, generate custom annotations

Sixth, the results demonstrate

Seven-source project


First, the article Introduction

    This article is about the MyBatis Generator reverse engineering to generate custom annotations, serialization, toString configured before reading this article, I hope readers basically use MyBatis Generator has no problem, because this article does not describe how to build MyBatis Generator environment

Second, cancel auto-generated comments

    1. The automatically generated annotation annoying, but that are not used, so we need to cancel the auto-generated comments

    2. In the context node configuration

    3. Reference Code

<commentGenerator>
    <property name="suppressDate" value="false"/>
    <property name="suppressAllComments" value="false"/>
</commentGenerator>

Third, the automatic generation of a sequence of

    1. When we generate entity classes, and found toString default is no serialization, but often need to be serialized objects, thereby facilitating transmission over the network

    2. requiring only the addition of the generated sequence <plugin type = "org.mybatis.generator.plugins.SerializablePlugin" /> in the context node to plug  

    3. Reference Code

<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />

Fourth, automatic generation toString

    1. toString generating and generates a sequence of the same, the same added <plugin type = "org.mybatis.generator.plugins.ToStringPlugin" /> in the context node to plug

    2. Reference Code

<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />

Fifth, generate custom annotations

    Note: in the data table must have a comment field below to MySQL, for example, would comment because the comment field annotation extract information entity classes

    1.MyBatis reverse engineering is used by default org.mybatis.generator.internal.DefaultCommentGenerator subclass org.mybatis.generator.api.CommentGenerator class generated comments, so we can achieve a comment own class

   2.新建一个类,实现CommentGenerator接口

    3.从org.mybatis.generator.internal.DefaultCommentGenerator把所有代码拷贝出来,复制到更改新建的类中,注意其中有一个@Override的类会报错,把@Override去掉即可,以下是拷贝过来的代码部分截图

    4.我们生成注释的主要有以下几个地方:实体类属性、实体类getter方法、实体类setter方法、实体类静态常量属性、mapper.xml注释

   5.实体类属性注释是addFieldComment(Field field,IntrospectedTable introspectedTable,IntrospectedColumn introspectedColumn) 这个方法

    6.实体类静态属性字段的方法名和上一个方法名一样,只是参数不同

    7.实体类toString方法是addGeneralMethodComment(Method method, IntrospectedTable introspectedTable),这里没有选择生成任何代码,因为没有必要

    8.实体类getter方法注释是addGetterComment方法

    9.实体类setter注释是addSetterComment方法

    10.实体类对应的mapper.xml注释是addComment(XmlElement xmlElement)方法这里没有加入任何注释,如有需要参考 DefaultCommentGenerator

六、结果演示

    1.序列化和属性字段注释,如账户ID是从数据库comment字段中提取出来的

    2.静态字段

   3.getter和setter方法

   4.toString

   5.mapper

七、工程源码

    1.maven依赖

<dependencies>
	<!-- 数据库驱动包 -->
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.44</version>
	</dependency>

	<!-- 代码生成器 -->
	<dependency>
		<groupId>org.mybatis.generator</groupId>
		<artifactId>mybatis-generator-core</artifactId>
		<version>1.3.5</version>
	</dependency>

	<!-- MyBatis -->
	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis</artifactId>
		<version>3.4.6</version>
	</dependency>
</dependencies>

    2.MyBatis逆向工程配置文件generatorConfig.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>
    <!-- 指定数据库驱动包 -->
    <!-- <classPathEntry location="~\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar" /> -->
    <context id="MySQLTables" targetRuntime="MyBatis3">
    	<!-- 配置生成pojo的序列化的插件  -->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
        
        <!-- 配置生成pojo的toString()方法的插件 -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
        
        <!-- 取消生成的注释 -->
        <!-- <commentGenerator>
            <property name="suppressDate" value="false"/>
            <property name="suppressAllComments" value="false"/>
        </commentGenerator> -->
        <!-- 通过type指定自定义的注释 -->
        <commentGenerator type="com.codecoord.config.MyCommentGenerator">
	        <!-- 不要开启,否则将不会使用自定义注释 -->
	        <!-- <property name="suppressAllComments" value="true"> -->
        </commentGenerator>
  

        <!-- 数据库连接参数 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/credit?useSSL=false"
                        userId="root"
                        password="tianxin">
        </jdbcConnection>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 指定实体类 -->
        <javaModelGenerator targetPackage="com.codecoord.entity"
                            targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- 创建SQL的Mapper文件 -->
        <sqlMapGenerator targetPackage="mapper"
                         targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <!-- 指定Mapper文件XMLMAPPER生成xml ANNOTATEDMAPPER为注解  -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.codecoord.dao"
                             targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!-- 指定数据库哪些表生成代码 -->
	    <table tableName="account" domainObjectName="Account"
	    	enableCountByExample="false" enableDeleteByExample="false"
	    	enableUpdateByExample="false" enableSelectByExample="false">
	    </table>
    </context>
</generatorConfiguration>

    3.自定义注释类 MyCommentGenerator

/**
 *    Copyright 2006-2016 the original author or authors.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package com.codecoord.config;

import static org.mybatis.generator.internal.util.StringUtility.isTrue;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Properties;

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.CompilationUnit;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.InnerClass;
import org.mybatis.generator.api.dom.java.InnerEnum;
import org.mybatis.generator.api.dom.java.JavaElement;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.config.MergeConstants;
import org.mybatis.generator.config.PropertyRegistry;
import org.mybatis.generator.internal.util.StringUtility;

public class MyCommentGenerator implements CommentGenerator {

    /** The properties. */
    private Properties properties;
    
    /** The suppress date. */
    private boolean suppressDate;
    
    /** The suppress all comments. */
    private boolean suppressAllComments;

    /** The addition of table remark's comments.
     * If suppressAllComments is true, this option is ignored*/
    private boolean addRemarkComments;
    
    private SimpleDateFormat dateFormat;

    public MyCommentGenerator() {
        super();
        properties = new Properties();
        suppressDate = false;
        suppressAllComments = false;
        addRemarkComments = false;
    }

    public void addJavaFileComment(CompilationUnit compilationUnit) {
    }

    /**
     * 实体类对应的mapper.xml注释,mapper类不加注释,如有需要参考 DefaultCommentGenerator
     */
    public void addComment(XmlElement xmlElement) {
        if (suppressAllComments) {
            return;
        }
    }

    public void addRootComment(XmlElement rootElement) {
    	
    }

    public void addConfigurationProperties(Properties properties) {
        this.properties.putAll(properties);

        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));
        
        String dateFormatString = properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_DATE_FORMAT);
        if (StringUtility.stringHasValue(dateFormatString)) {
            dateFormat = new SimpleDateFormat(dateFormatString);
        }
    }

    protected void addJavadocTag(JavaElement javaElement,
            boolean markAsDoNotDelete) {
        javaElement.addJavaDocLine(" *"); //$NON-NLS-1$
        StringBuilder sb = new StringBuilder();
        sb.append(" * "); //$NON-NLS-1$
        sb.append(MergeConstants.NEW_ELEMENT_TAG);
        if (markAsDoNotDelete) {
            sb.append(" do_not_delete_during_merge"); //$NON-NLS-1$
        }
        String s = getDateString();
        if (s != null) {
            sb.append(' ');
            sb.append(s);
        }
        javaElement.addJavaDocLine(sb.toString());
    }

    protected String getDateString() {
        if (suppressDate) {
            return null;
        } else if (dateFormat != null) {
            return dateFormat.format(new Date());
        } else {
            return new Date().toString();
        }
    }

    public void addClassComment(InnerClass innerClass,
            IntrospectedTable introspectedTable) {
        if (suppressAllComments) {
            return;
        }
        
        StringBuilder sb = new StringBuilder();

        innerClass.addJavaDocLine("/**"); //$NON-NLS-1$

        sb.append(" * This class corresponds to the database table "); //$NON-NLS-1$
        sb.append(introspectedTable.getFullyQualifiedTable());
        innerClass.addJavaDocLine(sb.toString());

        addJavadocTag(innerClass, false);

        innerClass.addJavaDocLine(" */"); //$NON-NLS-1$
    }

    public void addModelClassComment(TopLevelClass topLevelClass,
            IntrospectedTable introspectedTable) {
        if (suppressAllComments  || !addRemarkComments) {
            return;
        }

        StringBuilder sb = new StringBuilder();

        topLevelClass.addJavaDocLine("/**"); //$NON-NLS-1$

        String remarks = introspectedTable.getRemarks();
        if (addRemarkComments && StringUtility.stringHasValue(remarks)) {
            topLevelClass.addJavaDocLine(" * Database Table Remarks:");
            String[] remarkLines = remarks.split(System.getProperty("line.separator"));  //$NON-NLS-1$
            for (String remarkLine : remarkLines) {
                topLevelClass.addJavaDocLine(" *   " + remarkLine);  //$NON-NLS-1$
            }
        }
        topLevelClass.addJavaDocLine(" *"); //$NON-NLS-1$

        topLevelClass
                .addJavaDocLine(" * This class was generated by MyBatis Generator."); //$NON-NLS-1$

        sb.append(" * This class corresponds to the database table "); //$NON-NLS-1$
        sb.append(introspectedTable.getFullyQualifiedTable());
        topLevelClass.addJavaDocLine(sb.toString());

        addJavadocTag(topLevelClass, true);

        topLevelClass.addJavaDocLine(" */"); //$NON-NLS-1$
    }

    public void addEnumComment(InnerEnum innerEnum,
            IntrospectedTable introspectedTable) {
        if (suppressAllComments) {
            return;
        }

        StringBuilder sb = new StringBuilder();

        innerEnum.addJavaDocLine("/**"); //$NON-NLS-1$
        innerEnum
                .addJavaDocLine(" * This enum was generated by MyBatis Generator."); //$NON-NLS-1$

        sb.append(" * This enum corresponds to the database table "); //$NON-NLS-1$
        sb.append(introspectedTable.getFullyQualifiedTable());
        innerEnum.addJavaDocLine(sb.toString());

        addJavadocTag(innerEnum, false);

        innerEnum.addJavaDocLine(" */"); //$NON-NLS-1$
    }

    /**
     * 实体类字段注释
     */
    public void addFieldComment(Field field,
            IntrospectedTable introspectedTable,
            IntrospectedColumn introspectedColumn) {
    	if (suppressAllComments) {
            return;
        }

        field.addJavaDocLine("/**"); //$NON-NLS-1$

        // 核心代码 introspectedColumn.getRemarks() 就是获取字段注释
        StringBuilder sb = new StringBuilder();
        sb.append(" * " + introspectedColumn.getRemarks());
        sb.append("\n\t * [email protected]");
        sb.append("\n\t * " + LocalDateTime.now());
        field.addJavaDocLine(sb.toString());
        field.addJavaDocLine(" */"); 
    }

    /**
     * 实体类的静态字段
     */
    public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
        if (suppressAllComments) {
            return;
        }

        StringBuilder sb = new StringBuilder();

        field.addJavaDocLine("/**"); 
        sb.append(" * [email protected]");
        sb.append("\n\t * " + LocalDateTime.now());
        field.addJavaDocLine(sb.toString());
        field.addJavaDocLine(" */");
    }

    /**
     * 实体类toString方法
     */
    public void addGeneralMethodComment(Method method,
            IntrospectedTable introspectedTable) {
        if (suppressAllComments) {
            return;
        }

       /* StringBuilder sb = new StringBuilder();

        method.addJavaDocLine("/**"); //$NON-NLS-1$
        method.addJavaDocLine(" * toString."); //$NON-NLS-1$

        sb.append(introspectedTable.getFullyQualifiedTable());
        method.addJavaDocLine(sb.toString());
        addJavadocTag(method, false);*/
        //method.addJavaDocLine(" */");
    }
    
    /**
     * 实体类getter方法注释
     */
    public void addGetterComment(Method method,
            IntrospectedTable introspectedTable,
            IntrospectedColumn introspectedColumn) {
        if (suppressAllComments) {
            return;
        }

        StringBuilder sb = new StringBuilder();

        method.addJavaDocLine("/**"); //$NON-NLS-1$
        sb.append(" * " + introspectedColumn.getRemarks());
        method.addJavaDocLine(sb.toString());
        method.addJavaDocLine(" */"); //$NON-NLS-1$
    }

    /**
     * 实体类setter注释
     */
    public void addSetterComment(Method method,
            IntrospectedTable introspectedTable,
            IntrospectedColumn introspectedColumn) {
        if (suppressAllComments) {
            return;
        }

        StringBuilder sb = new StringBuilder();

        method.addJavaDocLine("/**"); //$NON-NLS-1$
        sb.append(" * " + introspectedColumn.getRemarks());
        method.addJavaDocLine(sb.toString());
        method.addJavaDocLine(" */"); //$NON-NLS-1$
    }

    public void addClassComment(InnerClass innerClass,
            IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {
        if (suppressAllComments) {
            return;
        }

        StringBuilder sb = new StringBuilder();

        innerClass.addJavaDocLine("/**"); //$NON-NLS-1$
        innerClass
                .addJavaDocLine(" * This class was generated by MyBatis Generator."); //$NON-NLS-1$

        sb.append(introspectedTable.getFullyQualifiedTable());
        innerClass.addJavaDocLine(sb.toString());

        addJavadocTag(innerClass, markAsDoNotDelete);

        innerClass.addJavaDocLine(" */"); //$NON-NLS-1$
    }
}

    4.逆向工程启动类

package com.codecoord.main;

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.File;
import java.util.ArrayList;
import java.util.List;

public class RunClass {
    public static void main(String[] args) {
        try {
            List<String> warnings = new ArrayList<String>();
            boolean overwrite = true;
            File configFile = new File("src/main/resources/generatorConfig.xml");
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration config = cp.parseConfiguration(configFile);
            DefaultShellCallback callback = new DefaultShellCallback(overwrite);
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
            myBatisGenerator.generate(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

    5.工程结构

发布了118 篇原创文章 · 获赞 1115 · 访问量 213万+

Guess you like

Origin blog.csdn.net/sinat_34104446/article/details/88675224