mybatis-generator-修改原始碼生成自己想要的程式碼

藍星花發表於2018-10-20

前言

雖然mybatis-generator能生成dao,mapper,xml等檔案,但是生成的程式碼也不是完全通用,所以這裡我們要的mybatis-generator-core原始碼進行修改。

原始碼下載: https://github.com/chenxingxing6/my-mybatis-generator


場景

1.生成自己想要的註釋

/**
 * 使用者資訊
 * 
 * @author lanxinghua
 * @date 2018/10/20
 */
public class UserBo implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    private Long id;

    /**
     * 使用者名稱
     */
    private String userName;

2.通用的表欄位,統一處理

  /**
     * 是否有效
     */
    private Integer isValid;

    /**
     * 建立人
     */
    private String createUser;

    /**
     * 建立時間
     */
    private Long createTime;

    /**
     * 修改人
     */
    private String opUser;

    /**
     * 修改時間
     */
    private Long opTime;
    /**
     * 版本號
     */
    private Integer lastVer;
<!-- 生成對映檔案的包名和位置 -->
<sqlMapGenerator targetPackage="com.dfire.soa.item.mapper" targetProject="src">
	<!-- 欄位的初始化 -->
	<columnSetting>
		<insert>
			<column name="is_valid" defaultValue="1"/>
			<column name="create_time" defaultValue="unix_timestamp(now(3))*1000"/>
			<column name="op_time" defaultValue="unix_timestamp(now(3))*1000"/>
			<column name="last_ver" defaultValue="0"/>
		</insert>
		<update>
			<column name="op_time" defaultValue="unix_timestamp(now(3))*1000"/>
			<column name="last_ver" defaultValue="last_ver + 1"/>
			<column name="create_time" hide="true"/>
		</update>
	</columnSetting>
</sqlMapGenerator>

3.我們資料庫欄位型別是tinyint,smallint的對應java型別為byte,而我們要Integer

javaTypeResolver type="org.mybatis.generator.internal.types.PandaJavaTypeResolverDefaultImpl"/>

這裡我們那生成註釋舉例子

我的想法

主要步驟就是,修改對應原始碼的類,比如我們對預設的註釋不滿意,那我們自己寫一個類然後繼承預設的類,然後實現自己的邏輯。然後就是在generatorConfig.xml檔案對應的地方,將class檔案指向我們自己定義的類,就是這麼簡單。而且很多場景都有人重寫過對應的類,所以我們要什麼,就去搜對應文件,然後改一下就好。

1.首先包mybatis-generator-core原始碼下下來

官方原始碼:https://github.com/mybatis/generator
在這裡插入圖片描述


這裡我們要改生成Bo類時,類上面新增時間,作者名字,類屬性新增資料庫中對應的註釋

1.找到DefaultCommentGenerator類

在這裡插入圖片描述

2.在同包下建立自己的註釋類MyCommentGenerator 繼承DefaultCommentGenerator
package org.mybatis.generator.internal;

import org.apache.commons.lang3.StringUtils;
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.Method;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.api.dom.xml.XmlElement;

/**
 * User: lanxinghua
 * Date: 2018/10/20 18:34
 * Desc:
 */
public class MyCommentGenerator extends DefaultCommentGenerator {

    //類上新增註釋
    @Override
    public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        topLevelClass.addJavaDocLine("/**");
        String remark = introspectedTable.getRemarks();
        if (StringUtils.isNotBlank(remark)) {
            topLevelClass.addJavaDocLine(" * " + remark);
        }
        topLevelClass.addJavaDocLine(" * ");
        topLevelClass.addJavaDocLine(" * " + "@author " + getAuthor());
        topLevelClass.addJavaDocLine(" * " + "@date " + getDateContent());
        topLevelClass.addJavaDocLine(" */");
    }

    //屬性上新增註釋
    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
        String remark = introspectedColumn.getRemarks();
        if (StringUtils.isNotBlank(remark)) {
            field.addJavaDocLine("/**");
            field.addJavaDocLine(" * " + remark);
            field.addJavaDocLine(" */");
        }
    }

    //get方法新增註釋
    @Override
    public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
    }

    //setter方法新增註釋
    @Override
    public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {

    }
    @Override
    public void addComment(XmlElement xmlElement) {

    }
}


3.修改DefaultCommentGenerator程式碼

新增幾個屬性

private String author;
private String date;
private String dateContent;
private static final String DEFAULT_DATE_FORMAT = "yyyy/MM/dd";
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));

        author = properties.getProperty("author");
        author = author == null ? "" : author;
        date = properties.getProperty("date");
        date = date == null ? DEFAULT_DATE_FORMAT : date;
        SimpleDateFormat sf = new SimpleDateFormat(date);
        dateContent = sf.format(new Date());
    }

public String getAuthor() {
    return author;
}

public String getDateContent() {
    return dateContent;
}
4.打成jar包,install到倉庫去

在這裡插入圖片描述

5.修改generatorConfig.xml檔案
  <!-- 需要修改原始碼 -->
        <commentGenerator type="org.mybatis.generator.internal.MyCommentGenerator">
            <!-- 檔案編碼 -->
            <property name="javaFileEncoding" value="UTF-8" />
            <!-- 忽略所有註解,使用自定義的註解生成 -->
            <property name="suppressAllComments" value="true" />
            <!-- 作者 -->
            <property name="author" value="lanxinghua" />
            <!-- 時間 value值為時間格式-->
            <property name="date" value="yyyy/MM/dd" />
        </commentGenerator>

在這裡插入圖片描述


總結

其實想想,這也是非常簡單的。不過我們應該要有點啟發,如果經常有同樣的事要幹,我們就要想辦法讓這部分通用起來,不用把時間浪費在一些沒意義的事情上。

相關文章