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

发布了1 篇原创文章 · 获赞 6 · 访问量 91

猜你喜欢

转载自blog.csdn.net/qq_35317619/article/details/104701196
今日推荐