MybatisPlus逆向工程+模板

MybatisPlus逆向工程+模板,第1张

MybatisPlus逆向工程

项目跟网上搜索出来生成的代码不一样,所以就开大招(改生成的模板,结果发现这可真香)
代码:(里面有模板)
链接:https://pan.baidu.com/s/1-DVUaAU7HM_BRnqO_Y9QUQ
提取码:okr1
MybatisPlus官方参考文档:
https://baomidou.com/pages/779a6e/ 新版本
https://baomidou.com/pages/d357af/ 旧版本

首先得知道:MP是按照mybatis-plus-generator 3.5.1版本区分开 (之前和之后是两种不同的生成方法,差异较大),之后的用最新的那个,我用的3.1版本的,所以使用的是老版本,本人用的是freemarker模板

生成的文件:其中根据 对应的模板 可以随意各种添加任何@注解和其他参数,并去除多余注解,可以随意添加继承类和相对应在导入包
直接上结果图:




其中对应在模板就在 mybatis-plus-generator相对应在包里(不能从网上找模板,因为包版本不同,模板就有差异)

直接上代码
新建文件 CodeGenerator3

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.*;
/**
 *  *  1.配置resources下的genreator.properties中的author 数据库 和 需要添加的表名
 *  *  2.执行本文件 生成文件
 *  *  3.  将        controller、mapper、service 拷到项目中可直接使用
 *  *      将        entity 拷到项目中可直接使用
 *  
 * @ClassName CodeGenerator3
 * @Description TODO
 * @Author wanglei
 * @Date 2022/4/20
 **/
public class CodeGenerator3 {
    public static void main(String[] args) {
        // 要生成代码的表名配置
        String[] tables = {
                "xxl_job_info",//xxx表
                "xxl_job_log",//aaa表
                "xxl_job_log_report",//bbbb表
                "xxl_job_logglue",
                "xxl_job_registry",
                "xxl_job_group",
                "xxl_job_user",
                "xxl_job_lock"
        };

        //用来获取generator.properties文件的配置信息
        ResourceBundle rb = ResourceBundle.getBundle("genreator");

        // 1.new一个 代码生成器
        AutoGenerator mpg = new AutoGenerator();
        // 2.new一个 全局配置 ,并放到代码生成器
        GlobalConfig gc = new GlobalConfig();
        //获取项目根目录
        String projectPath = System.getProperty("user.dir");
        //生成文件的输出目录 默认值:D 盘根目录
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor(rb.getString("author"));
        //是否打开输出目录 默认值:true
        gc.setOpen(false);
        //是否覆盖已有文件 默认值:false #open
        gc.setFileOverride(true);
        //开启 BaseResultMap 默认值:false
        gc.setBaseResultMap(true);
        //开启 baseColumnList 默认值:false
        gc.setBaseColumnList(true);
        gc.setSwagger2(true); //实体属性 Swagger2 注解
        // 注意:【如下配置 %s 为占位符】
        gc.setEntityName("%s");
        //主键策略
        gc.setIdType(IdType.AUTO);
        //去掉Service接口的首字母I
        gc.setServiceName("%sService");
        mpg.setGlobalConfig(gc);

        // 3.配置 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl(rb.getString("jdbc.url"));
        // dsc.setSchemaName("public");
        dsc.setDriverName(rb.getString("jdbc.drivername"));
        dsc.setUsername(rb.getString("jdbc.username"));
        dsc.setPassword(rb.getString("jdbc.password"));
        dsc.setDbType(DbType.MYSQL);
        dsc.setTypeConvert(new MySqlTypeConvert());
        mpg.setDataSource(dsc);

        //4.生成文件的 包配置 根据自己项目需求来配置
        PackageConfig pc = new PackageConfig();
//        pc.setModuleName(scanner("模块名"));
        pc.setParent(rb.getString("parent"));
        pc.setController(rb.getString("controller"));
        pc.setService(rb.getString("service"));
        pc.setServiceImpl(rb.getString("serviceImpl"));
        pc.setEntity(rb.getString("entity"));
        pc.setXml(rb.getString("xml"));
        pc.setMapper(rb.getString("mapper"));
        mpg.setPackageInfo(pc);


        // 自定义配置 此处是给模板赋值
//        InjectionConfig cfg = new InjectionConfig() {
//            //自定义属性注入:abc
//            //在.ftl(或者是.vm)模板中,通过${cfg.abc}获取属性
//            @Override
//            public void initMap() {
//                Map map = new HashMap<>();
//                map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
//                this.setMap(map);
//            }
//        };

        // 如果模板引擎是 freemarker
//        String templatePath = "/templates/mapper.xml.ftl";
        // 如果模板引擎是 velocity
        // String templatePath = "/templates/mapper.xml.vm";

        // 自定义输出配置  因为entity在api包里
//        List 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;
//            }
//        });
        /*
        cfg.setFileCreate(new IFileCreate() {
            @Override
            public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
                // 判断自定义文件夹是否需要创建
                checkDir("调用默认方法创建的目录,自定义目录用");
                if (fileType == FileType.MAPPER) {
                    // 已经生成 mapper 文件判断存在,不想重新生成返回 false
                    return !new File(filePath).exists();
                }
                // 允许生成模板文件
                return true;
            }
        });
        */
//        cfg.setFileOutConfigList(focList);
//        mpg.setCfg(cfg);

        // 5. 配置模板
        TemplateConfig templateConfig = new TemplateConfig();
        // 配置自定义输出模板
        //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别  此处的路径是.ftl
        templateConfig.setEntity("templates/entity2.java");
        templateConfig.setController("templates/controller2.java");
        templateConfig.setService("templates/service2.java");
        templateConfig.setServiceImpl("templates/serviceImpl2.java");
//        templateConfig.setXml("templates/mapper2.xml"); //TODO 此处不知道为什么改名字不行,默认会使用mapper.xml.ftl
        templateConfig.setMapper("templates/mapper2.java");
        mpg.setTemplate(templateConfig);

        // 策略配置 详细请参考 https://baomidou.com/pages/061573/#%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A1%A8%E9%85%8D%E7%BD%AE
        StrategyConfig strategy = new StrategyConfig();
        /** 此处可以修改为您的表前缀,如果没有,注释掉即可*/
        //strategy.setTablePrefix(new String[] { "t_" });
        //数据库表映射到实体的命名策略 支持驼峰
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//        strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
        //【实体】是否为 lombok 模型(默认 false)此处设置成true会生成以下三个注解 ,所以直接删除了模板entity2.java.ftl的多余注解

        strategy.setEntityLombokModel(true);
        //是否生成实体时,生成字段注解
        strategy.setEntityTableFieldAnnotationEnable(true);
        //生成 @RestController 控制器
        strategy.setRestControllerStyle(true);
//        strategy.setControllerMappingHyphenStyle(true);
        // 公共Controller父类  这个父类的导包有问题,TODO 直接在模板里写死
//        strategy.setSuperControllerClass("BaseController");
        // 写于父类中的公共字段
//        strategy.setSuperEntityColumns("id");

        strategy.setInclude(tables);
//        strategy.setControllerMappingHyphenStyle(true);
//        strategy.setTablePrefix(pc.getModuleName() + "_");
        mpg.setStrategy(strategy);
        // set freemarker engine 需要在 AutoGenerator 中 设置模板引擎
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }
}

resources 的templates下新建文件 genreator.properties

#作者
author=wanghaha

#包配置 根据自己项目需求来配置 可随便调整
parent=com.wanghaha
controller=generator.controller
service=generator.service
serviceImpl=generator.service.impl
entity=generatorapi.entity
xml=generator.mapper.xml
mapper=generator.mapper

tables=

#数据源
jdbc.username=root
jdbc.password=1234
jdbc.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
jdbc.drivername=com.mysql.cj.jdbc.Driver

用到的依赖包:

  <!--mybatisplus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.9</version>
        </dependency>

        <!--添加 代码生成器 依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.1.1</version>
        </dependency>
        <!--模板引擎 freemarker-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.2</version>
            <scope>provided</scope>
        </dependency>
        <!--        德鲁伊的启动器-->
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.5.22</version>
        </dependency>

我是用的是mysql,使用的表是(直接用之前xxl-job官网的表)

CREATE TABLE `xxl_job_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
  `job_desc` varchar(255) NOT NULL,
  `add_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  `author` varchar(64) DEFAULT NULL COMMENT '作者',
  `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件',
  `schedule_type` varchar(50) NOT NULL DEFAULT 'NONE' COMMENT '调度类型',
  `schedule_conf` varchar(128) DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型',
  `misfire_strategy` varchar(50) NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略',
  `executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略',
  `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
  `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
  `executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略',
  `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',
  `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
  `glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型',
  `glue_source` mediumtext COMMENT 'GLUE源代码',
  `glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注',
  `glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间',
  `child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',
  `trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行',
  `trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间',
  `trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
  `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
  `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
  `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
  `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
  `executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',
  `executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
  `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
  `trigger_code` int(11) NOT NULL COMMENT '调度-结果',
  `trigger_msg` text COMMENT '调度-日志',
  `handle_time` datetime DEFAULT NULL COMMENT '执行-时间',
  `handle_code` int(11) NOT NULL COMMENT '执行-状态',
  `handle_msg` text COMMENT '执行-日志',
  `alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',
  PRIMARY KEY (`id`),
  KEY `I_trigger_time` (`trigger_time`),
  KEY `I_handle_code` (`handle_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_log_report` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `trigger_day` datetime DEFAULT NULL COMMENT '调度-时间',
  `running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量',
  `suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量',
  `fail_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量',
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_logglue` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
  `glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
  `glue_source` mediumtext COMMENT 'GLUE源代码',
  `glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',
  `add_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_registry` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `registry_group` varchar(50) NOT NULL,
  `registry_key` varchar(255) NOT NULL,
  `registry_value` varchar(255) NOT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_group` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `app_name` varchar(64) NOT NULL COMMENT '执行器AppName',
  `title` varchar(12) NOT NULL COMMENT '执行器名称',
  `address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',
  `address_list` text COMMENT '执行器地址列表,多地址逗号分隔',
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL COMMENT '账号',
  `password` varchar(50) NOT NULL COMMENT '密码',
  `role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员',
  `permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割',
  PRIMARY KEY (`id`),
  UNIQUE KEY `i_username` (`username`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `xxl_job_lock` (
  `lock_name` varchar(50) NOT NULL COMMENT '锁名称',
  PRIMARY KEY (`lock_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

此上代码有两个困惑(虽然不影响结果),有大神看到了并解决了还望告知小弟1.149行 templateConfig.setXml(“templates/mapper2.xml”); 为什么我这里使用mapper2.xml.ftl是无效的?(我注释了,所以现在默认用的是mapper.xml.ftl)
2.169行 我想实现所有的controller都继承这个BaseController,但是这个BaseController的导包在哪设置呢?(默认就在当前的目录上,我是直接在模板里写死的,因为项目中的路径也是固定死的)

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/720386.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存