Spring Boot集成mybatis generator自動生成代碼(超詳細)

1,在pom.xml裏添加以下內容:

<build>
    <plugins>
        <!--mybatis自動生成代碼插件-->
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.4.0</version>
            <configuration>
                <!-- 是否覆蓋,true表示會替換生成的JAVA文件,false則不覆蓋 -->
                <overwrite>true</overwrite>
            </configuration>
            <dependencies>
                <!--mysql驅動包-->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>8.0.18</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

2,在resource目錄下新建文件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>
    <!-- 導入配置文件 -->
    <properties resource="jdbc.properties"/>

    <!-- defaultModelType="flat" 設置複合主鍵時不單獨爲主鍵創建實體 -->
    <context id="mysql" 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"/>
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <!--覆蓋生成XML文件-->
        <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>
        <!-- 生成的POJO實現java.io.Serializable接口 -->
        <!--<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>-->
        <!-- 生成的POJO toString方法插件 -->
        <!--<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>-->
        <!-- 分頁 -->
        <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"/>

        <!--optional,旨在創建class時,對註釋進行控制-->
        <!--<commentGenerator>
            <property name="suppressDate" value="true" />
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>-->
        <!-- 自定義註釋生成器 -->
        <commentGenerator type="com.sy.ssm.plugin.MyCommentGenerator">
            <property name="author" value="linss"/>
            <property name="dateFormat" value="yyyy/MM/dd"/>
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>
        <!-- 數據庫連接,直接通過${}jdbc.properties裏的配置 -->
        <jdbcConnection
                driverClass="${ssm.druid.datasource.driverClassName}"
                connectionURL="${ssm.druid.datasource.url}"
                userId="${ssm.druid.datasource.username}"
                password="${ssm.druid.datasource.password}">
            <!-- 設置 useInformationSchema 屬性爲 true 以便獲取表的註釋 -->
            <property name="useInformationSchema" value="true"/>
        </jdbcConnection>
        <!--非必須,類型處理器,在數據庫類型和java類型之間的轉換控制-->
        <javaTypeResolver>
            <!-- 默認情況下數據庫中的 decimal,bigInt 在 Java 對應是 sql 下的 BigDecimal 類 -->
            <!-- 不是 double 和 long 類型 -->
            <!-- 使用常用的基本類型代替 sql 包下的引用類型 -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 生成POJO對象,並將類放到com.sy.ssm.entity.ssm包下 -->
        <javaModelGenerator targetPackage="com.sy.ssm.entity.ssm" targetProject="src/main/java">
            <!--enableSubPackages: value爲true時,包不存在會自動創建-->
            <property name="enableSubPackages" value="true"/>
            <!-- 是否對modal添加構造函數 -->
            <property name="constructorBased" value="true"/>
            <!-- 是否清理從數據庫中查詢出的字符串左右兩邊的空白字符 -->
            <property name="trimStrings" value="true"/>
            <!-- 建立model對象是否不可改變 即生成的model對象不會有setter方法,只有構造方法 -->
            <property name="immutable" value="false"/>
            <property name="rootClass" value="com.sy.ssm.services.vo.BaseVo"/>
        </javaModelGenerator>
        <!-- 生成mapper xml文件,並放到resources下的mapper/ssm文件夾下 -->
        <sqlMapGenerator targetPackage="mapper.ssm" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 生成mapper xml對應dao接口,com.sy.ssm.mapper.ssm包下-->
        <javaClientGenerator targetPackage="com.sy.ssm.mapper.ssm" targetProject="src/main/java" type="XMLMAPPER">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!--  useActualColumnNames:如果爲true,則MBG將使用從數據庫元數據返回的列名作爲生成的域對象的屬性。
                                   如果爲false(默認),則MBG將嘗試以駝峯式表示返回的名稱。
                                   默認值爲false。-->

        <!-- table標籤可以有多個,至少一個,tableName指定表名,可以使用_和%通配符 -->
        <table tableName="sm_regist_channel"
               enableCountByExample="true" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="true"
               selectByExampleQueryId="false">
            <!-- 是否只生成POJO對象 -->
            <property name="modelOnly" value="false"/>
            <!-- generatedKey用於生成生成主鍵的方法 -->
            <generatedKey column="id" sqlStatement="MySql" identity="true"/>
            <domainObjectRenamingRule searchString="^Sm" replaceString=""/>
        </table>
    </context>
</generatorConfiguration>

3,很巧妙地發現"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"這一行報紅,於是在pom中添加依賴如下:

<dependency>
     <groupId>org.mybatis.generator</groupId
     <artifactId>mybatis-generator-core</artifactId>
     <version>1.4.0</version>
</dependency>

4,刷新maven配置,在External Libraries列表中找到這個包並複製path。

5,如圖添加配置信息

6,解決自動生成註釋的問題,自定義註釋生成器(maven執行插件會有問題,通過執行如下代碼中main方法)

package com.sy.ssm.plugin;

import org.mybatis.generator.api.CommentGenerator;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.api.dom.java.*;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.PropertyRegistry;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import org.mybatis.generator.internal.util.StringUtility;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;

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

/**
 * @author linss
 * @program sy-smart-marketing
 * @create 2019-12-19 19:15
 */
public class MyCommentGenerator implements CommentGenerator {

    public static void main(String[] args) {
        List<String> warnings = new ArrayList<>();
        // 覆蓋
        boolean overwrite = true;
        // 給出generatorConfig.xml文件的位置
        File configFile = new File("C:\\D\\projects\\02upgrade\\sy-smart-marketing\\src\\main\\resources\\generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        try {
            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();
        }
    }

    private Properties properties;

    /**
     * 抑制日期  默認false:不抑制
     */
    private boolean suppressDate = false;
    /**
     * 抑制註釋 默認false:不抑制
     */
    private boolean suppressAllComments = false;

    /**
     * 顯示數據庫comments 默認false:不顯示
     */
    private boolean addRemarkComments = true;
    /**
     * 日期格式
     */
    private SimpleDateFormat dateFormat;

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


    /**
     * 讀取配置文件
     *
     * @param properties
     */
    @Override
    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);
        }
    }

    /**
     * 日期格式化
     *
     * @return 格式化後的日期
     */
    protected String getDateString() {
        if (this.suppressDate) {
            return null;
        } else {
            return this.dateFormat != null ? this.dateFormat.format(new Date()) : (new Date()).toString();
        }
    }

    /**
     * 創建的數據表對應的類添加的註釋
     *
     * @param topLevelClass
     * @param introspectedTable
     */
    @Override
    public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        if (!this.suppressAllComments) {
            topLevelClass.addJavaDocLine("/**");
            topLevelClass.addJavaDocLine(" * @author "+ properties.getProperty("author"));
            topLevelClass.addJavaDocLine(" * @version V1.0 ");
            topLevelClass.addJavaDocLine(" * @description MyBatis Generator 自動創建,對應數據表爲:" + introspectedTable.getFullyQualifiedTable());
            topLevelClass.addJavaDocLine(" * @create " + this.getDateString());
            topLevelClass.addJavaDocLine(" */");
        }
    }

    /**
     * <p>生成xx.java文件(model)屬性的註釋</p>
     *
     * @param field
     * @param introspectedTable
     * @param introspectedColumn
     */
    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
        if (!this.suppressAllComments) {
            // 註釋開始的地方
            field.addJavaDocLine("/**");
            String remarks = introspectedColumn.getRemarks();
            // 開啓註釋,並且數據庫中comment有值
            if (this.addRemarkComments && StringUtility.stringHasValue(remarks)) {
                // 通過換行符分割 System.getProperty("line.separator"):換行符 ,屏蔽了 Windows和Linux的區別
                String[] remarkLines = remarks.split(System.getProperty("line.separator"));
                int length = remarkLines.length;
                // 如果有多行,就換行顯示
                for (int i = 0; i < length; i++) {
                    String remarkLine = remarkLines[i];
                    field.addJavaDocLine(" * " + remarkLine);
                }
            }
            // 註釋結束
            field.addJavaDocLine(" */");
        }
    }

    /**
     * xxxMapper接口和xxxExample類方法註解
     *
     * @param method
     * @param introspectedTable
     */
    @Override
    public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
        if (!this.suppressAllComments) {
            method.addJavaDocLine("/**");
            method.addJavaDocLine(" * " + method.getName());
            List<Parameter> parameters = method.getParameters();
            parameters.forEach(parameter -> method.addJavaDocLine(" * @param " + parameter.getName()));
            // 如果有返回類型,添加@return
            String returnType = "void";
            if (!returnType.equals(method.getReturnType())) {
                method.addJavaDocLine(" * @return ");
            }
            method.addJavaDocLine(" */");
        }

    }

    /**
     * 數據庫對應實體類的Getter方法註解
     *
     * @param method
     * @param introspectedTable
     * @param introspectedColumn
     */
    @Override
    public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {

    }

    /**
     * 數據庫對應實體類的Setter方法註解
     *
     * @param method
     * @param introspectedTable
     * @param introspectedColumn
     */
    @Override
    public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {

    }

    /**
     * 生成xxMapper.XML文件的註釋
     *
     * @param xmlElement
     */
    @Override
    public void addComment(XmlElement xmlElement) {
    }

    @Override
    public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> imports) {

    }

    @Override
    public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> imports) {

    }

    @Override
    public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> imports) {

    }

    @Override
    public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> imports) {
    }

    @Override
    public void addClassAnnotation(InnerClass innerClass, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> imports) {
    }

    @Override
    public void addJavaFileComment(CompilationUnit compilationUnit) {
    }

    @Override
    public void addRootComment(XmlElement rootElement) {
    }

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

    }

    @Override
    public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {

    }

    @Override
    public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {

    }

    @Override
    public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {

    }
}

7,檢查修改配置內容,比如application.properties中配置信息,按實際情況獲取配置。

發佈了21 篇原創文章 · 獲贊 6 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章