Mybatis代碼生成javaConfig配置

**

Mybatis代碼生成javaConfig配置

**
關於mybatis的代碼生成已經有多不勝數的文章和例子,本文主要介紹通過javaConfig的方式替代xml的方式配置,從而以接口的形式完成參數化的代碼生成。
一、環境
Idea, JDK8, springboot2.2.2, mysql8.0.13
關鍵包及版本:
關鍵包及版本
Mysql驅動: mysql-connector-java-8.0.13.jar

二、重點模塊
1、New一個springboot基礎工程,創建相關文件夾,大致結構如下
項目結構
2、重點文件GeneratorConfig及方法

package com.tool.toolbox.generator;

import com.tool.toolbox.dto.GeneratorDto;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.*;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Administrator
 */
public class GeneratorConfig {

    /**模板,暫時不需要*/
    private boolean exampleTf = false;
    /**靜態地址,非項目結構變更不做修改*/
    private static String sysUrl = System.getProperty("user.dir")
            .concat(File.separator).concat("src")
            .concat(File.separator).concat("main")
            .concat(File.separator).concat("resources");

    public String generatorConfig(GeneratorDto generatorDto) {
        String classpathEntry;
        if(generatorDto.getDriverClass().contains("mysql")){
            classpathEntry  = sysUrl + File.separator + "lib" + File.separator + "mysql-connector-java-8.0.13.jar";
        }else
            throw new IllegalStateException("Unexpected value: " + generatorDto.getDriverClass());
        Context context = new Context(ModelType.CONDITIONAL);
        context.setTargetRuntime("MyBatis3");
        context.setId("mysql");

        CommentGeneratorConfiguration commentGeneratorConfiguration = new CommentGeneratorConfiguration();
        commentGeneratorConfiguration.addProperty("suppressDate","true");
        commentGeneratorConfiguration.addProperty("suppressAllComments","true");

        /*數據庫鏈接URL,用戶名、密碼 */
        JDBCConnectionConfiguration jdbcConnectionConfiguration = new JDBCConnectionConfiguration();
        jdbcConnectionConfiguration.setDriverClass(generatorDto.getDriverClass());
        jdbcConnectionConfiguration.setConnectionURL(generatorDto.getConnectionURL());
        jdbcConnectionConfiguration.setUserId(generatorDto.getUsername());
        jdbcConnectionConfiguration.setPassword(generatorDto.getPassword());

        JavaTypeResolverConfiguration javaTypeResolverConfiguration = new JavaTypeResolverConfiguration();
        javaTypeResolverConfiguration.addProperty("forceBigDecimals","false");

        /*生成模型的包名和位置*/
        JavaModelGeneratorConfiguration javaModelGeneratorConfiguration = new JavaModelGeneratorConfiguration();
        javaModelGeneratorConfiguration.setTargetPackage("tamp");
        javaModelGeneratorConfiguration.setTargetProject(sysUrl);
        javaModelGeneratorConfiguration.addProperty("enableSubPackages","true");
        javaModelGeneratorConfiguration.addProperty("trimStrings","true");

        /*生成映射文件的包名和位置*/
        SqlMapGeneratorConfiguration sqlMapGeneratorConfiguration = new SqlMapGeneratorConfiguration();
        sqlMapGeneratorConfiguration.setTargetPackage("tamp");
        sqlMapGeneratorConfiguration.setTargetProject(sysUrl);
        sqlMapGeneratorConfiguration.addProperty("enableSubPackages","true");

        /*生成DAO的包名和位置*/
        JavaClientGeneratorConfiguration javaClientGeneratorConfiguration = new JavaClientGeneratorConfiguration();
        javaClientGeneratorConfiguration.setConfigurationType("XMLMAPPER");
        javaClientGeneratorConfiguration.setTargetPackage("tamp");
        javaClientGeneratorConfiguration.setTargetProject(sysUrl);
        javaClientGeneratorConfiguration.addProperty("enableSubPackages","true");

        PluginConfiguration pluginConfiguration = new PluginConfiguration();
        switch (generatorDto.getType()){
            case 0: pluginConfiguration.setConfigurationType("com.tool.toolbox.generator.LombokPlugin");break;
            case 1: pluginConfiguration.setConfigurationType("com.tool.toolbox.generator.CommentPlugin");break;
        }

        context.addPluginConfiguration(pluginConfiguration);

        context.addProperty("javaFileEncoding","UTF-8");
        context.addProperty("javaFormatter","org.mybatis.generator.api.dom.DefaultJavaFormatter");
        context.addProperty("xmlFormatter","org.mybatis.generator.api.dom.DefaultXmlFormatter");
        context.addProperty("beginningDelimiter","`");
        context.addProperty("endingDelimiter","`");

        context.setCommentGeneratorConfiguration(commentGeneratorConfiguration);
        context.setJdbcConnectionConfiguration(jdbcConnectionConfiguration);
        context.setJavaTypeResolverConfiguration(javaTypeResolverConfiguration);
        context.setJavaModelGeneratorConfiguration(javaModelGeneratorConfiguration);
        context.setSqlMapGeneratorConfiguration(sqlMapGeneratorConfiguration);
        context.setJavaClientGeneratorConfiguration(javaClientGeneratorConfiguration);


        generatorDto.getTableList().forEach(tableEntity->{
            TableConfiguration tableConfiguration = new TableConfiguration(context);
            tableConfiguration.setTableName(tableEntity.getTableName());
            tableConfiguration.setDomainObjectName(tableEntity.getDomainObjectName());
            tableConfiguration.setCountByExampleStatementEnabled(exampleTf);
            tableConfiguration.setUpdateByExampleStatementEnabled(exampleTf);
            tableConfiguration.setSelectByExampleStatementEnabled(exampleTf);
            tableConfiguration.setSelectByExampleStatementEnabled(exampleTf);
            tableConfiguration.setDeleteByExampleStatementEnabled(exampleTf);
            context.addTableConfiguration(tableConfiguration);
        });

        Configuration config = new Configuration();
        config.addClasspathEntry(classpathEntry);
        config.addContext(context);

        DefaultShellCallback callback = new DefaultShellCallback(true);
        MyBatisGenerator myBatisGenerator;
        try {
            myBatisGenerator = new MyBatisGenerator(config, callback, new ArrayList<>(0));
            myBatisGenerator.generate(null);
            return sysUrl + File.separator + "tamp";
        } catch (InvalidConfigurationException | InterruptedException | IOException | SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}


方法解析1
方法開始,我們就需要指定本次生成所用的驅動包,需要集成可在此處做分支語句。(注:此處的sysUrl適用本項目結構,複用請當心)
方法解析2
創建一個上下文容器替代xml文件(這是核心操作)
方法解析3
一些必須項,略過(這裏面聊起來就太多了)
方法解析4
這裏除了mybatis的傳統註釋插件,還有一份Lombok的註釋插件(個人喜好使用)
方法解析5
將必須的部件全部放入上下文容器中(到此一個xml文件就已經有了)
方法解析6
可能我們一次生成好多張表,於是有了這裏的循環。
方法解析7
直接調用mybatis逆向工程來生成文件(此處返回了一個url,在後面做打包下載的)
三、插話
本文只是用作交流,算是自己動手的一份總結,或有不簡潔、不透徹的地方,請適度吐槽。

四、基礎模塊
創建 GeneratorDto
參數dto
創建GeneratorService,並創建唯一的方法born
(從yml文件讀取的dirverClass,connectionURL,username,password;文件下載的工具類FileUtils我認爲是個常規操作,本次不做展開)
實現類主要方法

創建GeneratorController
控制器代碼

五、效果展示
運行項目,瀏覽器訪問
localhost:8080/generator/born?tableNames=表名1,表名2
結果如下:
運行結果
六、結語

附上項目demo
https://github.com/zhpngpeng/toolbox.git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章