【保姆级】手把手带你用MyBatis Plus制作代码生成器

730 阅读3分钟

概述

MyBatis-Plus(简称 MP)是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,是一个为简化开发、提高效率而生的增强工具。具有无侵入损耗小强大的 CRUD 操作支持 Lambda 形式调用支持主键自动生成支持 ActiveRecord 模式支持自定义全局通用操作内置代码生成器内置分页插件等特性。

就像MyBatis-Plus官方网站上所说的

我们的愿景是成为 MyBatis 最好的搭档,就像魂斗罗中的 1P、2P,基友搭配,效率翻倍。

官方地址是 baomidou.com/

我们先看下这个生成器长啥样

接下来,我们一步一步实现它~~

创建代码生成器

AutoGenerator autoGenerator = new AutoGenerator();

进行全局配置

GlobalConfig config = setConfig();
autoGenerator.setGlobalConfig(config);

private static GlobalConfig setConfig() {
    GlobalConfig config = new GlobalConfig();
    config.setOutputDir(OUTPUT_DIR);
    config.setAuthor(CODE_AUTHER);
    config.setOpen(true);
    config.setFileOverride(true);
    config.setEntityName(SUF_DO);
    config.setServiceName(SUF_DAO);
    // id生成策略
    config.setIdType(IdType.ASSIGN_ID);
    config.setServiceImplName(SUF_DAO_IMPL);
    return config;
}

这里需要注意一下id生成策略,一般都是 IdType.ASSIGN_ID,具体含义我们可以看下IdType这个类:

ASSIGN_ID 表示分配ID (主键类型为 numberstring), 这个类型只有当插入对象ID为空,才自动填充,默认实现方法是雪花算法(如下图)

这里设置了代码根路径、包路径、模块名(注意会在包路径的基础上继续生成)、表名、作者名、生成的DO对象名称后缀、生成的Dao对象名称后缀以及生成的DaoImpl对象名称后缀等属性

数据源配置

用于指定需要生成哪些表或者排除哪些表

DataSourceConfig dataSourceConfig = setDataSourceConfig();
autoGenerator.setDataSource(dataSourceConfig);

private static DataSourceConfig setDataSourceConfig() {
    DataSourceConfig dataSourceConfig = new DataSourceConfig();
    dataSourceConfig.setUrl(MYSQL_URL);
    dataSourceConfig.setDriverName(MYSQL_DRIVER);
    dataSourceConfig.setUsername(MYSQL_USERNAME);
    dataSourceConfig.setPassword(MYSQL_PASSWORD);
    dataSourceConfig.setDbType(DbType.MYSQL);
    dataSourceConfig.setTypeConvert(new MySqlTypeConvert());
    return dataSourceConfig;
}

参数说明

  • MYSQL_URL 数据库连接

  • MYSQL_DRIVER 数据库驱动

  • MYSQL_USERNAME 数据库用户名

  • MYSQL_PASSWORD 数据库密码

包配置

指定生成代码的包路径

PackageConfig packageConfig = setPackageConfig();
autoGenerator.setPackageInfo(packageConfig);

private static PackageConfig setPackageConfig() {
    PackageConfig packageConfig = new PackageConfig();
    packageConfig.setParent(PACKAGE_NAME);
    if (!StringUtils.isEmpty(MODAL_NAME)) {
        packageConfig.setEntity("entity." + MODAL_NAME);
        packageConfig.setService("dao." + MODAL_NAME);
        packageConfig.setServiceImpl("dao." + MODAL_NAME + ".impl");
        packageConfig.setMapper("mapper." + MODAL_NAME);
    }
    return packageConfig;
}

自定义配置

InjectionConfig cfg = new InjectionConfig() {
    @Override
    public void initMap() {
    }
};
List<FileOutConfig> focList = setFileOutConfig();
cfg.setFileOutConfigList(focList);
autoGenerator.setCfg(cfg);
       // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });

策略配置

可指定需要生成哪些表或者排除哪些表

        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel)
                .setColumnNaming(NamingStrategy.underline_to_camel)
                .setEntityLombokModel(true)
                .setRestControllerStyle(true)
                .setInclude(TABLE_NAME.split(","))
                .setControllerMappingHyphenStyle(true)
                .setChainModel(true);
        autoGenerator.setStrategy(strategy);

参数说明

  • NamingStrategy 配置从数据库表到文件的命名策略

    • no_change 不做任何改变,原样输出
    • underline_to_camel 表示下划线转驼峰命名

最后,绑定模板,执行即可~~~

autoGenerator.setTemplateEngine(new FreemarkerTemplateEngine());
autoGenerator.execute();

通过main方法进行调用

public static void main(String[] args) {
    codeGeneratorMethod();
}

我们看下执行结果

其实到这里整个步骤就已经完整来的,不过额外介绍下如何自定义类型转换器~

自定义类型转换器

使用默认的 MySqlTypeConvert 时,如果MySQL中定义的是tinyint(1) 类型,在生成DO对象时会生成Boolean类型

如果你希望仍然使用 Integer 则需要实现一个自定义的类型转换器来继承 MySqlTypeConvert 并重写 processTypeConvert()方法(以此类推,你也可以进行别的自定义匹配),我们这里拿常见的 tinyint(1) 举个例子:

public class AQinMysqlTypeConvert extends MySqlTypeConvert {
    @Override
    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
        String type = fieldType.toLowerCase();
        if (type.contains("tinyint(1)")) {
            return DbColumnType.INTEGER;
        }
        return super.processTypeConvert(globalConfig, fieldType);
    }
}

搞定~~~