mybatis-plus3.5.x和3.4.x版本的代码生成工具

前言

这两天一直在弄我负责的那些项目开源组件升级,因为好多组件有漏洞,要升级版本。然后mybatis-plus也是其中之一,因为我一直用的版本是3.4.3,现在要升级到3.5.2版本以上。然后3.4.x和3.5.x有一些地方变动还是挺大的,主要就是在代码生成这一块,变动比较大,以前写得生成工具类已经不能用了。然后现在重新写了3.5.x版本的生成工具类。

这里我把3.4和3.5的都放上来,大家可以对比参考下。

3.4.x版本

<!-- mybatis_plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version>
</dependency>
<!-- 代码生成器 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.4.1</version>
</dependency>
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 代码生成工具类
 */
public class GenerateUtil {
    /**
     * 数据库链接地址
     */
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&serverTimezone=UTC";

    /**
     * 驱动
     */
    private static final String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";

    /**
     * 用户名
     */
    private static final String USERNAME = "root";

    /**
     * 密码
     */
    private static final String PASSWORD = "123456";

    /**
     * 作者
     */
    private static final String AUTHOR = "fuHua";

    /**
     * 父包名
     */
    private static final String PACKAGE_PARENT = "com";

    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StrUtil.isNotEmpty(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

    /**
     * 全局配置
     *
     * @return 返回 GlobalConfig
     */
    private static GlobalConfig getGlobalConfig() {
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor(AUTHOR);
        gc.setOpen(false);
        // 是否覆盖同名文件,默认是false
        gc.setFileOverride(true);
        // 不需要ActiveRecord特性的请改为false
        gc.setActiveRecord(false);
        // XML 二级缓存
        gc.setEnableCache(false);
        // XML ResultMap 生成基本的resultmap
        gc.setBaseResultMap(true);
        // XML columList 生成基本的sql片段
        gc.setBaseColumnList(false);
        //实体属性 Swagger2 注解
        //gc.setSwagger2(true);
        gc.setServiceName("");
        gc.setServiceImplName("%sService");
        return gc;
    }

    /**
     * 数据源配置
     *
     * @return 返回 getDataSourceConfig
     */
    private static DataSourceConfig getDataSourceConfig() {
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl(URL);
        dsc.setDriverName(DRIVER_NAME);
        dsc.setUsername(USERNAME);
        dsc.setPassword(PASSWORD);
        return dsc;
    }

    /**
     * 包名配置
     *
     * @return 返回 PackageConfig
     */
    private static PackageConfig getPackageConfig() {
        PackageConfig pc = new PackageConfig();
        pc.setParent(PACKAGE_PARENT);
        //pc.setModuleName(scanner("模块名"));
        pc.setEntity("entity.sys");
        pc.setMapper("mapper.sys");
        pc.setService("");
        pc.setServiceImpl("service.sys");
        pc.setController("controller.sys");
        return pc;
    }

    /**
     * 模板引擎配置
     *
     * @return 返回 TemplateConfig
     */
    private static TemplateConfig getTemplateConfig() {
        TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.setXml(null);
        return templateConfig;
    }

    /**
     * 策略配置
     *
     * @param tableNames 表名称
     *                   strategy.setInclude(tableNames) 传入需要 "生成" 的表名
     *                   strategy.setExclude(tableNames) 传入需要 "过滤" 的表名
     *                   strategy.setSuperEntityColumns("id");
     * @return 返回 getStrategyConfig
     */
    private static StrategyConfig getStrategyConfig(String... tableNames) {
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);

        // 公共父类
        strategy.setSuperEntityClass(PACKAGE_PARENT + ".common.base.BaseEntity");
        strategy.setSuperMapperClass(strategy.getSuperMapperClass());
        strategy.setSuperServiceImplClass(PACKAGE_PARENT + ".common.base.BaseService");
        strategy.setSuperControllerClass(PACKAGE_PARENT + ".common.base.BaseController");

        // 写于父类中的公共字段
        strategy.setSuperEntityColumns("id", "create_by", "create_time", "update_by", "update_time");

        strategy.setInclude(tableNames);
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix("_");
        strategy.setEntityTableFieldAnnotationEnable(true);
        strategy.setEntityLombokModel(true);
        return strategy;
    }

    /**
     * 自定义配置
     *
     * @return 返回 InjectionConfig
     */
    private static InjectionConfig getInjectionConfig() {
        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        // 如果模板引擎是 freemarker
        final String templatePath = "/templates/mapper.xml.ftl";
        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                return System.getProperty("user.dir") + "/src/main/resources/mapper/sys/" + tableInfo.getEntityName() + "Mapper" + ".xml";
            }
        });
        cfg.setFileOutConfigList(focList);
        return cfg;
    }

    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();
        // 全局配置
        mpg.setGlobalConfig(getGlobalConfig());
        // 数据源配置
        mpg.setDataSource(getDataSourceConfig());
        // 包配置
        mpg.setPackageInfo(getPackageConfig());
        // 自定义配置
        mpg.setCfg(getInjectionConfig());
        // 配置模板
        mpg.setTemplate(getTemplateConfig());
        // 策略配置
        //sys_dept,sys_dict,sys_log,sys_menu,sys_post,sys_role,sys_role_dept,sys_role_menu,sys_user,sys_user_post
        mpg.setStrategy(getStrategyConfig(scanner("表名,多个英文逗号分割").split(",")));
        // 设置模板引擎
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }
}

3.5.x版本

<!-- mybatis_plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>
<!-- 代码生成器 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.3.1</version>
</dependency>
<!-- 代码生成器的模板引擎 -->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
</dependency>

注意:一定要引入代码生成器的模板引擎,否则的话运行会报错:org/apache/velocity/context/Context

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.common.base.BaseController;
import com.common.base.BaseEntity;
import com.common.base.BaseService;

import java.util.Collections;
import java.util.List;

/**
 * 代码生成工具类
 */
public class CodeGenerator {

    /**
     * 数据库链接地址
     */
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&serverTimezone=UTC";

    /**
     * 用户名
     */
    private static final String USERNAME = "root";

    /**
     * 密码
     */
    private static final String PASSWORD = "123456";

    /**
     * 作者
     */
    private static final String AUTHOR = "fuHua";

    /**
     * 表名的前缀,从表生成代码时会去掉前缀
     */
    private static final String TABLE_PREFIX = "";

    /**
     * 模块名
     */
    //private static final String MODULE_NAME = "";

    /**
     * 需要生成的表名,必填
     */
    private static final List<String> TABLES = ListUtil.toList("aqhdjl","aqyh","bqbhhjl","bwhyjl","chzttd","czpcx","dzhyj","gqjjc","gzpcx","qxdcx","whjx","yxfsd","zhtd");


    public static void main(String[] args) {
        if (CollUtil.isEmpty(TABLES)) {
            System.out.println("请输入需要生成的表名!");
            return;
        }

        String projectPath = System.getProperty("user.dir");

        //全局配置
        GlobalConfig config = new GlobalConfig.Builder()
                .author(AUTHOR)                                      //作者
                .outputDir(projectPath + "/src/main/java")          //生成文件输出路径(写到java目录)
                //.enableSwagger()                                  //开启swagger
                .commentDate("yyyy-MM-dd HH:mm:ss")                 //注释日期格式
                .dateType(DateType.TIME_PACK)                       //设置时间对应类型
                .disableOpenDir()                                   //生成后不要打开目录
                .build();

        //包名配置
        PackageConfig packageConfig = new PackageConfig.Builder()
                .parent("com")                      //父包名
                //.moduleName(moduleName)           //模块名
                .controller("controller.sys")       //controller包名
                //.service("service.sys")           //service接口包名
                .serviceImpl("service.sys")         //service实现类包名
                .entity("entity.sys")               //实体类包名
                .mapper("mapper.sys")               //mapper包名
                .xml("mapper.sys")                  //mapper对应的xml包名
                .pathInfo(Collections.singletonMap(OutputFile.mapper.xml, projectPath + "/src/main/resources/mapper/sys"))                  //mapper对应的xml路径
                .build();

        //策略配置
        StrategyConfig strategyConfig = new StrategyConfig.Builder()
                .addTablePrefix(TABLE_PREFIX)                       //需要抵消的表前缀
                .addInclude(TABLES)                                 //设置生成需要映射的表名
                //.enableCapitalMode()                              //策略开启⼤写命名

                .serviceBuilder()                                   //构建Service层
                .enableFileOverride()                               //覆盖文件(需谨慎使用)
                .formatServiceImplFileName("%sService")             //业务层接口实现类命名
                .superServiceImplClass(BaseService.class)           //service公共父类

                .entityBuilder()                                    //构建实体类
                .enableFileOverride()                               //覆盖文件(需谨慎使用)
                .superClass(BaseEntity.class)                       //entity公共父类
                .addSuperEntityColumns("id","updateTime","createTime") // 公共字段
                .columnNaming(NamingStrategy.underline_to_camel)    //字段名驼峰命名
                .naming(NamingStrategy.underline_to_camel)          //表名驼峰命名
                .enableLombok()                                     //添加lombock的getter、setter注解
                //.enableChainModel()                               //启动链式写法@Accessors(chain = true)
                //.enableColumnConstant()                           //启动属性转常量功能@FieldNameConstants
                //.logicDeleteColumnName("deleted")                 //逻辑删除字段,标记@TableLogic
                .enableTableFieldAnnotation()                       //启动字段注解
                //.addTableFills(tableFillList)                     //属性值填充策略

                .controllerBuilder()                                //构建Controller类
                .enableFileOverride()                               //覆盖文件(需谨慎使用)
                .enableHyphenStyle()                                //映射路径使用连字符格式,而不是驼峰
                .formatFileName("%sController")                     //Controller类命名
                .superClass(BaseController.class)                   //Controller 类继承 BaseController
                .enableRestStyle()                                  //标记@RestController注解

                .mapperBuilder()                                    //构建mapper接口类
                .enableFileOverride()                               //覆盖文件(需谨慎使用)
                .enableBaseResultMap()                              //生成基本的resultMap
                .formatMapperFileName("%sMapper")                   //Mapper接口类明名
                .superClass(BaseMapper.class)                       //Mapper接口类集成 BaseMapper
                //.enableMapperAnnotation()                         //标记@Mapper注解
                .formatXmlFileName("%sMapper")                      //Mapper.xml命名
                .enableBaseColumnList()                             //生成基本的SQL片段

                .build();

        //数据源配置
        DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig.Builder(URL,USERNAME,PASSWORD);
        //数据库类型转换器
        dataSourceConfigBuilder.typeConvert(new MySqlTypeConvert() {
            /*@Override
            public IColumnType processTypeConvert(GlobalConfig globalConfig, String tableField) {
                if (tableField.toLowerCase().contains("date") || tableField.toLowerCase().contains("timestamp") || tableField.toLowerCase().contains("datetime")) {
                    return DbColumnType.STRING;
                }
                return super.processTypeConvert(globalConfig, tableField);
            }*/
        });

        //创建代码生成器对象,加载配置
        AutoGenerator autoGenerator = new AutoGenerator(dataSourceConfigBuilder.build());
        autoGenerator.global(config);
        autoGenerator.packageInfo(packageConfig);
        autoGenerator.strategy(strategyConfig);

        //执行
        autoGenerator.execute();
        System.out.println("========================================  相关代码生成完毕  =====================================");
    }
}

以上就是全部代码了,引入依赖后,代码可以直接复制使用,改一下数据库连接、用户名、密码,还有包名。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

符华-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值