天天看點

mybatis-generator自定義注釋實作

(一)、項目結構

mybatis-generator自定義注釋實作

(二)、引入Maven依賴

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.bean</groupId>
    <artifactId>mybatis_plugin</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mybatis_plugin</name>
    <description>Mybatis的插件類</description>
    <packaging>jar</packaging>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
           

(三)、配置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" >
<generatorConfiguration>

    <classPathEntry location="F:\maven\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar"/>
    <context id="MyBatis3" 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"/>
        <!--配置自定義注釋位址-->
        <commentGenerator type="com.bean.mybatis_plugin.config.MyCommentGenerator">
            <property name="suppressAllComments" value="false"/>
        </commentGenerator>
        <!--配置資料庫連接配接-->
        <jdbcConnection userId="root" password="root" driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql:///chatting?useUnicode=true&amp;characterEncoding=utf8&amp;useInformationSchema=true"/>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!--配置Java實體位址-->
        <javaModelGenerator targetPackage="com.bean.model"
                            targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!--配置Mapper.xml的位址-->
        <sqlMapGenerator targetPackage="mybatis.mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>
        <!--配置Mapper接口位址-->
        <javaClientGenerator targetPackage="com.bean.mapper" type="XMLMAPPER"
                             targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>
        <!--配置表資訊-->
        <table tableName="t_user_info" domainObjectName="UserInfo"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false">
        </table>
    </context>
</generatorConfiguration>
           

(四)、配置自定義注釋實作類

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.MergeConstants;
import org.mybatis.generator.config.PropertyRegistry;

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

/**
 * @Description //TODO
 * @Date $ $
 * @Author huangwb
 **/
public class MyCommentGenerator implements CommentGenerator {
    private Properties properties;
    private Properties systemPro;
    private boolean suppressDate;
    private boolean suppressAllComments;
    private String nowTime;
    private final String authorr = "huangwb";


    public MyCommentGenerator() {
        super();
        properties = new Properties();
        systemPro = System.getProperties();
        suppressDate = false;
        suppressAllComments = false;
        nowTime = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());
    }

    public void addJavaFileComment(CompilationUnit compilationUnit) {
        if (suppressAllComments) {
            return;
        }
        return;
    }

    /**
     * Adds a suitable comment to warn users that the element was generated, and
     * when it was generated.
     */
    public void addComment(XmlElement xmlElement) {
        return;
    }

    public void addRootComment(XmlElement rootElement) {
        // add no document level comments by default
        return;
    }

    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));
    }

    /**
     * 判斷傳入參數是否為true
     *
     * @param property
     * @return
     */
    private boolean isTrue(String property) {
        if ("true".equals(property)) {
            return true;
        }
        return false;
    }

    /**
     * This method adds the custom javadoc tag for. You may do nothing if you do
     * not wish to include the Javadoc tag - however, if you do not include the
     * Javadoc tag then the Java merge capability of the eclipse plugin will
     * break.
     *
     * @param javaElement the java element
     */
    protected void addJavadocTag(JavaElement javaElement, boolean markAsDoNotDelete) {
        javaElement.addJavaDocLine(" *");
        StringBuilder sb = new StringBuilder();
        sb.append(" * ");
        sb.append(MergeConstants.NEW_ELEMENT_TAG);
        if (markAsDoNotDelete) {
            sb.append(" do_not_delete_during_merge");
        }
        String s = getDateString();
        if (s != null) {
            sb.append(' ');
            sb.append(s);
        }
        javaElement.addJavaDocLine(sb.toString());
    }

    /**
     * This method returns a formated date string to include in the Javadoc tag
     * and XML comments. You may return null if you do not want the date in
     * these documentation elements.
     *
     * @return a string representing the current timestamp, or null
     */
    protected String getDateString() {
        String result = null;
        if (!suppressDate) {
            result = nowTime;
        }
        return result;
    }

    public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {
        if (suppressAllComments) {
            return;
        }
        StringBuilder sb = new StringBuilder();
        innerClass.addJavaDocLine("/**");
        sb.append(" * ");
        sb.append(introspectedTable.getFullyQualifiedTable());
        sb.append(" ");
        sb.append(getDateString());
        innerClass.addJavaDocLine(sb.toString().replace("\n", " "));
        innerClass.addJavaDocLine(" */");
    }

    public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {
        if (suppressAllComments) {
            return;
        }
        StringBuilder sb = new StringBuilder();
        innerEnum.addJavaDocLine("/**");
        sb.append(" * ");
        sb.append(introspectedTable.getFullyQualifiedTable());
        innerEnum.addJavaDocLine(sb.toString().replace("\n", " "));
        innerEnum.addJavaDocLine(" */");
    }

    /**
     * 設定字段注釋
     */
    public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
        if (suppressAllComments) {
            return;
        }
        StringBuilder sb = new StringBuilder();
        field.addJavaDocLine("/**");
        sb.append(" * ");
        sb.append(introspectedColumn.getRemarks());
        sb.append("<br> \n");
        sb.append("    * 列名:" + introspectedColumn.getActualColumnName() + " 類型:" + introspectedColumn.getJdbcTypeName()
                + "(" + introspectedColumn.getLength() + ")" + " 允許空:" + introspectedColumn.isNullable() + " 預設值:"
                + introspectedColumn.getDefaultValue());
        field.addJavaDocLine(sb.toString());
        field.addJavaDocLine(" */");
    }

    public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
        if (suppressAllComments) {
            return;
        }
        StringBuilder sb = new StringBuilder();
        field.addJavaDocLine("/**");
        sb.append(" * ");
        sb.append(introspectedTable.getFullyQualifiedTable());
        field.addJavaDocLine(sb.toString().replace("\n", " "));
        field.addJavaDocLine(" */");
    }

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

    }

    public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
        if (suppressAllComments) {
            return;
        }
        method.addJavaDocLine("/**");
        addJavadocTag(method, false);
        method.addJavaDocLine(" */");
    }

    /**
     * 設定getter方法注釋
     */
    public void addGetterComment(Method method, IntrospectedTable introspectedTable,
                                 IntrospectedColumn introspectedColumn) {
        if (suppressAllComments) {
            return;
        }
        method.addJavaDocLine("/**");
        StringBuilder sb = new StringBuilder();
        sb.append(" * ");
        sb.append(introspectedColumn.getRemarks());
        method.addJavaDocLine(sb.toString().replace("\n", " "));
        sb.setLength(0);

        //加入系統使用者
        sb.append(" * @author ");
        /*systemPro.getProperty("user.name")*/
        sb.append(authorr);
        method.addJavaDocLine(sb.toString().replace("\n", " "));
        sb.setLength(0);

        //是否加入時間戳
        if (suppressDate) {
            sb.append(" * @date " + nowTime);
            method.addJavaDocLine(sb.toString().replace("\n", " "));
            sb.setLength(0);
        }

        sb.append(" * @return ");
        sb.append(introspectedColumn.getActualColumnName());
        sb.append(" ");
        sb.append(introspectedColumn.getRemarks());
        method.addJavaDocLine(sb.toString().replace("\n", " "));
        method.addJavaDocLine(" */");
    }

    /**
     * 設定setter方法注釋
     */
    public void addSetterComment(Method method, IntrospectedTable introspectedTable,
                                 IntrospectedColumn introspectedColumn) {
        if (suppressAllComments) {
            return;
        }
        method.addJavaDocLine("/**");
        StringBuilder sb = new StringBuilder();
        sb.append(" * ");
        sb.append(introspectedColumn.getRemarks());
        method.addJavaDocLine(sb.toString().replace("\n", " "));
        sb.setLength(0);

        //加入系統使用者
        sb.append(" * @author ");
        //systemPro.getProperty("user.name")
        sb.append(authorr);
        method.addJavaDocLine(sb.toString().replace("\n", " "));
        sb.setLength(0);

        //是否加入時間戳
        if (suppressDate) {
            sb.append(" * @date " + nowTime);
            method.addJavaDocLine(sb.toString().replace("\n", " "));
            sb.setLength(0);
        }

        Parameter parm = method.getParameters().get(0);
        sb.append(" * @param ");
        sb.append(parm.getName());
        sb.append(" ");
        sb.append(introspectedColumn.getRemarks());
        method.addJavaDocLine(sb.toString().replace("\n", " "));
        method.addJavaDocLine(" */");
    }

    public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {
        if (suppressAllComments) {
            return;
        }
        StringBuilder sb = new StringBuilder();
        innerClass.addJavaDocLine("/**");
        sb.append(" * ");
        sb.append(introspectedTable.getFullyQualifiedTable());
        innerClass.addJavaDocLine(sb.toString().replace("\n", " "));
        sb.setLength(0);
        sb.append(" * @author ");
        sb.append(authorr);
        sb.append(" ");
        sb.append(nowTime);
        innerClass.addJavaDocLine(" */");
    }


}
           

(五)、配置SpringBoot項目自啟動執行生成資料

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description //TODO
 * @Date $ $
 * @Author huangwb
 **/
@Component
public class MybatisPluginPostConstruct {
    @PostConstruct
    public void mybatisPliginGenerator() {
        try {
            List<String> warnings = new ArrayList<String>();
            boolean overwrite = true;
            ClassLoader classloader = Thread.currentThread().getContextClassLoader();
            InputStream is = classloader.getResourceAsStream("mybatis/mybatis-generator.xml");
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration config = cp.parseConfiguration(is);
            DefaultShellCallback callback = new DefaultShellCallback(overwrite);
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
            myBatisGenerator.generate(null);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (InvalidConfigurationException e) {
            e.printStackTrace();
        } catch (XMLParserException e) {
            e.printStackTrace();
        }

    }
}
           

(六)、SpringBoot啟動類

@SpringBootApplication
public class MybatisPluginApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisPluginApplication.class, args);
    }
}
           

(七)、運作後效果

public class UserInfo {
    /**
     * 主鍵<br> 
    * 列名:id 類型:VARCHAR(64) 允許空:false 預設值:null
     */
    private String id;

    /**
     * 使用者名稱<br> 
    * 列名:user_name 類型:VARCHAR(255) 允許空:true 預設值:null
     */
    private String userName;

    /**
     * 使用者密碼<br> 
    * 列名:user_password 類型:VARCHAR(255) 允許空:true 預設值:null
     */
    private String userPassword;

    /**
     * 郵箱<br> 
    * 列名:user_email 類型:VARCHAR(255) 允許空:true 預設值:null
     */
    private String userEmail;

    /**
     * 電話<br> 
    * 列名:user_phone 類型:VARCHAR(255) 允許空:true 預設值:null
     */
    private String userPhone;

    /**
     * 建立時間<br> 
    * 列名:create_time 類型:TIMESTAMP(19) 允許空:true 預設值:null
     */
    private Date createTime;

    /**
     * 建立人<br> 
    * 列名:create_user_id 類型:VARCHAR(64) 允許空:true 預設值:null
     */
    private String createUserId;

    /**
     * 修改時間<br> 
    * 列名:update_time 類型:TIMESTAMP(19) 允許空:true 預設值:null
     */
    private Date updateTime;

    /**
     * 修改人<br> 
    * 列名:update_user_id 類型:VARCHAR(64) 允許空:true 預設值:null
     */
    private String updateUserId;

    /**
     * 使用者狀态 0、禁用 1、啟用<br> 
    * 列名:user_status 類型:VARCHAR(1) 允許空:true 預設值:null
     */
    private String userStatus;

    /**
     * 主鍵
     * @author huangwb
     * @return id 主鍵
     */
    public String getId() {
        return id;
    }

    /**
     * 主鍵
     * @author huangwb
     * @param id 主鍵
     */
    public void setId(String id) {
        this.id = id == null ? null : id.trim();
    }

    /**
     * 使用者名稱
     * @author huangwb
     * @return user_name 使用者名稱
     */
    public String getUserName() {
        return userName;
    }

    /**
     * 使用者名稱
     * @author huangwb
     * @param userName 使用者名稱
     */
    public void setUserName(String userName) {
        this.userName = userName == null ? null : userName.trim();
    }

    /**
     * 使用者密碼
     * @author huangwb
     * @return user_password 使用者密碼
     */
    public String getUserPassword() {
        return userPassword;
    }

    /**
     * 使用者密碼
     * @author huangwb
     * @param userPassword 使用者密碼
     */
    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword == null ? null : userPassword.trim();
    }

    /**
     * 郵箱
     * @author huangwb
     * @return user_email 郵箱
     */
    public String getUserEmail() {
        return userEmail;
    }

    /**
     * 郵箱
     * @author huangwb
     * @param userEmail 郵箱
     */
    public void setUserEmail(String userEmail) {
        this.userEmail = userEmail == null ? null : userEmail.trim();
    }

    /**
     * 電話
     * @author huangwb
     * @return user_phone 電話
     */
    public String getUserPhone() {
        return userPhone;
    }

    /**
     * 電話
     * @author huangwb
     * @param userPhone 電話
     */
    public void setUserPhone(String userPhone) {
        this.userPhone = userPhone == null ? null : userPhone.trim();
    }

    /**
     * 建立時間
     * @author huangwb
     * @return create_time 建立時間
     */
    public Date getCreateTime() {
        return createTime;
    }

    /**
     * 建立時間
     * @author huangwb
     * @param createTime 建立時間
     */
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    /**
     * 建立人
     * @author huangwb
     * @return create_user_id 建立人
     */
    public String getCreateUserId() {
        return createUserId;
    }

    /**
     * 建立人
     * @author huangwb
     * @param createUserId 建立人
     */
    public void setCreateUserId(String createUserId) {
        this.createUserId = createUserId == null ? null : createUserId.trim();
    }

    /**
     * 修改時間
     * @author huangwb
     * @return update_time 修改時間
     */
    public Date getUpdateTime() {
        return updateTime;
    }

    /**
     * 修改時間
     * @author huangwb
     * @param updateTime 修改時間
     */
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    /**
     * 修改人
     * @author huangwb
     * @return update_user_id 修改人
     */
    public String getUpdateUserId() {
        return updateUserId;
    }

    /**
     * 修改人
     * @author huangwb
     * @param updateUserId 修改人
     */
    public void setUpdateUserId(String updateUserId) {
        this.updateUserId = updateUserId == null ? null : updateUserId.trim();
    }

    /**
     * 使用者狀态 0、禁用 1、啟用
     * @author huangwb
     * @return user_status 使用者狀态 0、禁用 1、啟用
     */
    public String getUserStatus() {
        return userStatus;
    }

    /**
     * 使用者狀态 0、禁用 1、啟用
     * @author huangwb
     * @param userStatus 使用者狀态 0、禁用 1、啟用
     */
    public void setUserStatus(String userStatus) {
        this.userStatus = userStatus == null ? null : userStatus.trim();
    }
}
           

(八)、參考部落格

https://www.cnblogs.com/esther-qing/p/8036899.html mybatis-generator自定義注釋生成

繼續閱讀