MybatisPlus-Generator自定义模版生成CRUD、DTO、VO、Convert等

news2024/11/19 17:26:24

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


简介

如标题所言,本篇文章介绍如何使用MybatisPlus-Generator自定义模版生成CRUDDTOVOConvert等。

项目已在开源,可以通过以下Github/Gitee链接下载源码使用,目前生成器还不是很灵活,你可以下载源码自定义修改,或者真的有需要可以提Issues,我们一起来完善。

GitHub - wnhyang/crud-quickstart

Gitee - wnhyang/crud-quickstart

Mybatis官网:代码生成器配置新 | MyBatis-Plus

项目说明

看图就行了

从下面截图和这里的生成器可以看到除了MybatisPlus自带的entity.javamapper.javamapper.xmlservice.javaserviceImpl.javacontroller.java外,自定了CreateVO.javaUpdateVO.javaVO.javaPage.javaDTO.javaConvert.java模版。

使用范围

数据源:MySQL,因为我主要使用的是MySQL,其他数据源没测试过,不敢保证。

工具:lombokmapstruct,因为项目使用mapstructDTOVO的转换工具,所以这些是必要的。

基础但非必要:JDK17 + Spring Boot3 + MybatisPlus最新版,非必要指的是版本。

使用方法

如上截图,因为是我日常使用,添加了一些我需要的依赖、配置和自定义类。pom依赖就多了些,你可以根据自需要取舍。这里就不贴了,有点多。

必要依赖

因为自定义的不止这些,所以单单使用这些是不够的。

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-generator</artifactId>
</dependency>

<dependency>
  <groupId>org.apache.velocity</groupId>
  <artifactId>velocity-engine-core</artifactId>
</dependency>

示例sql

项目中自带有示例sql,如下,有两张表,他们通用的特点是共有5个字段(creatorcreate_timeupdaterupdate_timedeleted),deleted是逻辑删除字段。

也是因此,生成的entity共同继承了一个基础类BasePO.java

-- auto-generated definition
create table sys_dict_data
(
  id          bigint auto_increment comment '字典数据主键' primary key,
  sort        int          default 0                 not null comment '字典排序',
  label       varchar(100) default ''                not null comment '字典标签',
  value       varchar(100) default ''                not null comment '字典键值',
  dict_type   varchar(100) default ''                not null comment '字典类型',
  status      tinyint      default 0                 not null comment '状态(0正常 1停用)',
  remark      varchar(500) null comment '备注',
  creator     varchar(64)  default '' null comment '创建者',
  create_time datetime     default CURRENT_TIMESTAMP not null comment '创建时间',
  updater     varchar(64)  default '' null comment '更新者',
  update_time datetime     default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
  deleted     bit          default b'0'              not null comment '是否删除'
) comment '字典数据表' charset = utf8mb4;

-- auto-generated definition
create table sys_operate_log
(
  id               bigint auto_increment comment '日志主键' primary key,
  user_id          bigint                                  not null comment '用户编号',
  module           varchar(50)                             not null comment '模块标题',
  name             varchar(50)                             not null comment '操作名',
  type             int           default 0                 not null comment '操作分类',
  content          varchar(2000) default ''                not null comment '操作内容',
  exts             varchar(512)  default ''                not null comment '拓展字段',
  request_method   varchar(16)   default '' null comment '请求方法名',
  request_url      varchar(255)  default '' null comment '请求地址',
  user_ip          varchar(50) null comment '用户 IP',
  user_agent       varchar(200) null comment '浏览器 UA',
  java_method      varchar(512)  default ''                not null comment 'Java 方法名',
  java_method_args varchar(8000) default '' null comment 'Java 方法的参数',
  start_time       datetime                                not null comment '操作时间',
  duration         int                                     not null comment '执行时长',
  result_code      int           default 0                 not null comment '结果码',
  result_msg       varchar(512)  default '' null comment '结果提示',
  result_data      varchar(4000) default '' null comment '结果数据',
  creator          varchar(64)   default '' null comment '创建者',
  create_time      datetime      default CURRENT_TIMESTAMP not null comment '创建时间',
  updater          varchar(64)   default '' null comment '更新者',
  update_time      datetime      default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
  deleted          bit           default b'0'              not null comment '是否删除'
) comment '操作日志记录' charset = utf8mb4;

生成器

使用时修改静态常量就可以,如:数据源、用户名密码、模块名、包名、作者、表名等。

/**
 * @author wnhyang
 * @date 2024/3/15
 **/
public class Generator {
    /**
     * 数据源
     */
    private static final String DATASOURCE_URL = "jdbc:mysql://mysql:3306/dbName?allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true";

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

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

    private static final String MODULE_NAME = "";

    private static final String OUTPUT_PATH = System.getProperty("user.dir");

    /**
     * 父包名
     */
    private static final String PARENT_PATH = "cn.wnhyang.generator";

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

    /**
     * 表名
     */
    private static final List<String> TABLES = new ArrayList<>(
        Arrays.asList("sys_dict_data", "sys_operate_log"));


    public static void main(String[] args) {
        //1、配置数据源
        FastAutoGenerator.create(DATASOURCE_URL, USERNAME, PASSWORD)
        //2、全局配置
        .globalConfig(builder -> {
            builder.disableOpenDir() // 禁止打开输出目录 默认 true
            .outputDir(OUTPUT_PATH + "/src/main/java")   // 设置输出路径:项目的 java 目录下
            .author(AUTHOR) // 设置作者名p
            // .enableKotlin() //开启 kotlin 模式 默认false
            // .enableSwagger()   // 开启 swagger 模式 默认false
            .dateType(DateType.TIME_PACK)   // 定义生成的实体类中日期的类型 TIME_PACK=LocalDateTime;ONLY_DATE=Date;
            .commentDate("yyyy/MM/dd"); // 注释日期 默认值 yyyy-MM-dd
        })
        //3、包配置
        .packageConfig(builder -> {
            builder.parent(PARENT_PATH) // 父包名 默认值 com.baomidou
            .moduleName(MODULE_NAME)   // 父包模块名 默认值 无
            .entity("entity")   // Entity 包名 默认值 entity
            .service("service") //Service 包名 默认值 service
            .serviceImpl("service.impl") // Service Impl 包名 默认值:service.impl
            .mapper("mapper")   // Mapper 包名 默认值 mapper
            .xml("mapper")  // Mapper XML 包名 默认值 mapper.xml
            .controller("controller") // Controller 包名 默认值 controller
            .pathInfo(Collections.singletonMap(OutputFile.xml, OUTPUT_PATH + "/src/main/resources/mapper"));    //配置 mapper.xml 路径信息:项目的 resources 目录下
        })
        //4、模版配置
        .templateConfig(builder -> {
            builder.entity("/templates/entity.java")
            .service("/templates/service.java")
            .serviceImpl("/templates/serviceImpl.java")
            .mapper("/templates/mapper.java")
            .xml("/templates/mapper.xml")
                            .controller("/templates/controller.java");

                })
                //5、策略配置
                .strategyConfig(builder -> {
                    builder.addInclude(TABLES) // 设置需要生成的数据表名
                            .addTablePrefix("t_", "c_", "sys_", "de_") // 设置过滤表前缀

                            //5.1、实体类策略配置
                            .entityBuilder()
                            .enableFileOverride() // 覆盖entity
                            .superClass(BasePO.class)
                            //.disableSerialVersionUID()  // 禁用生成 serialVersionUID 默认值 true
                            .enableLombok() // 开启 Lombok 默认值:false
                            .enableTableFieldAnnotation()       // 开启生成实体时生成字段注解 默认值 false
                            .logicDeleteColumnName("deleted")   // 逻辑删除字段名
                            .naming(NamingStrategy.underline_to_camel)  //数据库表映射到实体的命名策略:下划线转驼峰命
                            .columnNaming(NamingStrategy.underline_to_camel)    // 数据库表字段映射到实体的命名策略:下划线转驼峰命
                            // .addSuperEntityColumns("creator", "create_time", "updater", "update_time")
                            // .addTableFills(
                            //  new Column("creator", FieldFill.INSERT),
                            //  new Column("updater", FieldFill.INSERT_UPDATE)
                            // )   // 添加表字段填充,"create_time"字段自动填充为插入时间,"modify_time"字段自动填充为插入修改时间
                            .formatFileName("%s")

                            //5.2、Mapper策略配置
                            .mapperBuilder()
                            .enableFileOverride() // 覆盖mapper
                            .superClass(BaseMapperX.class)   // 设置父类
                            .mapperAnnotation(org.apache.ibatis.annotations.Mapper.class)      // 开启 @Mapper 注解
                            // .enableBaseResultMap() //启用 BaseResultMap 生成
                            .formatMapperFileName("%sMapper")   // 格式化 mapper 文件名称
                            .formatXmlFileName("%sMapper") // 格式化 Xml 文件名称

                            //5.3、service 策略配置
                            .serviceBuilder()
                            .enableFileOverride() // 覆盖service
                            .formatServiceFileName("%sService") // 格式化 service 接口文件名称,%s进行匹配表名,如 UserService
                            .formatServiceImplFileName("%sServiceImpl") // 格式化 service 实现类文件名称,%s进行匹配表名,如 UserServiceImpl

                            //5.4、Controller策略配置
                            .controllerBuilder()
                            .enableFileOverride() // 覆盖controller
                            .enableRestStyle()  // 开启生成 @RestController 控制器
                            //.enableHyphenStyle() //开启驼峰转连字符 默认false
                            .formatFileName("%sController"); // 格式化 Controller 类文件名称,%s进行匹配表名,如 UserController

                })
                //6、自定义配置
                .injectionConfig(consumer -> {
                    Map<String, Object> customMap = new HashMap<>();
                    customMap.put("dto", PARENT_PATH + ".dto");
                    customMap.put("create", PARENT_PATH + ".vo.create");
                    customMap.put("update", PARENT_PATH + ".vo.update");
                    customMap.put("vo", PARENT_PATH + ".vo");
                    customMap.put("page", PARENT_PATH + ".vo.page");
                    customMap.put("convert", PARENT_PATH + ".convert");

                    consumer.customMap(customMap);
                    // DTO
                    List<CustomFile> customFiles = new ArrayList<>();
                    customFiles.add(new CustomFile.Builder().packageName("dto").fileName("DTO.java")
                            .templatePath("/templates/dto/DTO.java.vm").enableFileOverride().build());
                    customFiles.add(new CustomFile.Builder().packageName("vo/create").fileName("CreateVO.java")
                            .templatePath("/templates/vo/CreateVO.java.vm").enableFileOverride().build());
                    customFiles.add(new CustomFile.Builder().packageName("vo/update").fileName("UpdateVO.java")
                            .templatePath("/templates/vo/UpdateVO.java.vm").enableFileOverride().build());
                    customFiles.add(new CustomFile.Builder().packageName("vo").fileName("VO.java")
                            .templatePath("/templates/vo/VO.java.vm").enableFileOverride().build());
                    customFiles.add(new CustomFile.Builder().packageName("vo/page").fileName("PageVO.java")
                            .templatePath("/templates/vo/PageVO.java.vm").enableFileOverride().build());
                    customFiles.add(new CustomFile.Builder().packageName("convert").fileName("Convert.java")
                            .templatePath("/templates/convert/Convert.java.vm").enableFileOverride().build());
                    consumer.customFile(customFiles);
                })
                //7、模板
                .templateEngine(new VelocityTemplateEngine())

                /*
                    .templateEngine(new VelocityTemplateEngine())
                    .templateEngine(new FreemarkerTemplateEngine())
                    .templateEngine(new BeetlTemplateEngine())
                */

                //8、执行
                .execute();
    }
}

运行生成器

在运行成功后,生成如下类

运行web项目

1、在IDEA中右键项目,选择Reformat Code

2、然后优化导包

3、修改application.yml

dbnamedbnamedbpasswordredispassword

spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: jdbc:mysql://mysql:3306/dbName?allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
          username: dbname
          password: dbpassword
          driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        slave:
          url: jdbc:mysql://mysql:3306/dbName?allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
          username: dbname
          password: dbpassword
          driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
  data:
    redis:
      host: redis
      port: 6379
      # cluster:
      #   nodes: 127.0.0.1:6379
      database: 0
      password: redispassword
      lettuce:
        pool:
          max-active: 64 #最大连接数,0表示无限制
          max-idle: 32 #最大等待连接数,0表示无限制
          min-idle: 0 #最小等待连接数,0表示无限制
          max-wait: 20ms #最大建立连接等待时间,-1表示无限制
        shutdown-timeout: 100ms

4、运行GeneratorApplication

测试

使用Postman之类的工具,或者使用IDEARestfulTool插件测试

我使用的是Apifox插件配合客户端,所以在配置了Apifox插件项目之后,右键项目的controller,选择Upload to Apifox同步接口。

然后在Apifox客户端就可以看到所有接口了。

1、设置环境;2、选择接口;3、自动生成;4、发送

完美!!!

欢迎使用

GitHub - wnhyang/crud-quickstart

Gitee - wnhyang/crud-quickstart

写在最后

拙作艰辛,字句心血,望诸君垂青,多予支持,不胜感激。


个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1525457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GRACE:梯度引导的可控检索增强基于属性的生成

在本文中&#xff0c;我们提出通过梯度引导的可控检索&#xff08;GRACE&#xff09;来增强基于属性的生成&#xff0c;考虑到目标属性&#xff08;见图1&#xff09;。具体来说&#xff0c;我们训练一个鉴别器来计算给定上下文的属性分布。我们构建了一个检索库&#xff0c;存…

用python写网络爬虫:2.urllib库的基本用法

文章目录 urllib库抓取网页data参数timeout参数更灵活地配置参数登录代理Cookies 参考书籍 建议新入门的小伙伴先看我同一专栏的文章&#xff1a;用python写网络爬虫&#xff1a;1.基础知识 urllib库 urllib是python中一个最基础的HTTP库&#xff0c;一般是内置的&#xff0c;…

数字经济时代,数据清洗不是件小事

对于企业来说&#xff0c;数据无疑是当前时代业务增长和发展决策的核心要素&#xff0c;也是数字经济探索中的基础建设。不过随着数字化的加速普及&#xff0c;企业需要存储、处理的数据越来越多&#xff0c;海量的数据已经让企业难以理解&#xff0c;很难全面进行利用。尤其是…

数字化转型下的新质生产力:赋能未来发展新引擎

1. 引言&#xff1a;数字化转型与新质生产力的交融共生 在信息化、智能化的新时代&#xff0c;数字化转型已经成为推动经济社会发展的重要力量。而新质生产力&#xff0c;作为面向新兴领域和未来产业的先进生产力&#xff0c;正在数字化转型的浪潮中焕发出新的生机与活力。 数…

机器人路径规划:基于深度优先搜索(Depth-First-Search,DFS)算法的机器人路径规划(提供Python代码)

一、深度优先搜索算法介绍 深度优先搜索算法&#xff08;Depth-First-Search&#xff09;的基本思想是沿着树的深度遍历树的节点&#xff0c;尽可能深的搜索树的分支。当节点v的所有边都己被探寻过&#xff0c;搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已…

PTA-练习3

目录 实验4-2-3 换硬币 实验4-2-4 输出三角形字符阵列 实验4-2-5 输出整数各位数字 实验4-2-6 梅森数 实验4-2-7 找完数 实验4-2-9 水仙花数 实验6-2 英文字母替换加密&#xff08;大小写转换后移1位&#xff09; 实验6-5 简单计算器 实验6-10 统计单词的长度 实验4-2…

财富池指标公式--通达信主力资金指标公式,主力资金流向怎么看?

今日分享的通达信主力资金指标公式&#xff0c;是一个分析主力资金进出的指标。 具体信号说明&#xff1a; 当紫色的起涨点主力资金线和红色的拉升资金同时上传0线&#xff0c;并且紫色的拉升线超过资金线&#xff0c;大盘进入派发阶段&#xff0c;后市看涨&#xff0c;是参考…

pinia 的选项式和组合式的不同写法和持久化的方法

pinia 是vue3推荐的状态管理插件&#xff0c;它对标的是vue2中使用的vuex pinia 的引入方法 npm 安装 pinia在 src/store/index.js 中 创建一个pinia 的实例&#xff0c;并导出 在项目中的 main.js 中引入 2 中的pinia 并且使用 app.use(pinia) main.js中 import pinia from…

100天精通Python(实用脚本篇)——第118天:基于selenium和ddddocr库实现反反爬策略之验证码识别

文章目录 专栏导读一、前言二、ddddocr库使用说明1. 介绍2. 算法步骤3. 安装4. 参数说明5. 纯数字验证码识别6. 纯英文验证码识别7. 英文数字验证码识别8. 带干扰的验证码识别 三、验证码识别登录代码实战1. 输入账号密码2. 下载验证码3. 识别验证码并登录 书籍推荐 专栏导读 …

第111讲:Mycat实践指南:固定Hash算法分片下的水平分表详解

文章目录 1.固定Hash算法分片的概念1.1.固定Hash算法的概念1.2.固定Hash算法是如何将数据路由到分片节点的 2.使用固定Hash算法分片对某张表进行水平拆分2.1.在所有的分片节点中创建表结构2.2.配置Mycat实现固定Hash算法分片的水平分表2.2.1.配置Schema配置文件2.2.2.配置Rule分…

VMware虚拟机和主机之间无法复制粘贴,移动文件,重新安装vmware-tools变灰,VMware Tools继续运行脚本未能在虚拟机中成功运行。

起初&#xff0c;虚拟机只是无法和主机之间进行复制粘贴&#xff0c;移动文件。查询了很多资料,反反复复地安装卸载vmware-tools&#xff0c;但是都没有成功。通过这篇文章&#xff1a;虚拟机安装VMware Tools的两种方法_vmware tools有3种安装方式-CSDN博客 安装了vmware_too…

PCIE收发时序了解

文章目录 一、Pcie的发送时序1.1 不带数据的TLP包1.2 带数据的TLP包1.3 连续发送数据的TLP包 二、Pcie的接收时序2.1 不带数据的TLP包2.2 带数据的TLP包2.3 连续接收数据的TLP包 三、riffa框架和用户channel的接口3.1 RX接口波形&#xff1a;3.2 TX接口波形&#xff1a; 一、Pc…

用python写网络爬虫:3.urllib库进一步的使用方法

文章目录 异常处理URLErrorHTTPError设置超时时间 链接的解析、构造、合并urlparse方法urlsplit方法urljoin方法urlencode方法parse_qs方法quote方法 Robots 协议Robots 协议的结构解析协议 参考书籍 在上一篇文章&#xff1a;用python写网络爬虫&#xff1a;2.urllib库的基本用…

SpringBoot3整合Knife4j4.x版本(Swagger3、OpenApi3)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; SpringBoot3整合Knife4j4.x版本(Swagger3、OpenApi3) ⏱️ 创作时间&a…

【每日力扣】131.分割回文串与450.删除二叉搜索树中的节点

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害。 131.分割回文串 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的…

C#使用MiniExcel读取excel表格文件

使用MiniExcel读取excel表格文件 MiniExecl提供了几种读取方法。 准备测试数据 测试类&#xff1a; public class Person{public int Id { get; set; }public string Name { get; set; }public string Description { get; set; }public double Value { get; set; }}测试数据…

伦敦数据科学与Scikit-learn:一次探索与实践的旅程

1.题目 Data Science London正在举办一场关于Scikit-learn的聚会。 这个比赛是尝试、分享和创建 sklearn 分类能力示例的练习场&#xff08;如果这变成了有用的东西&#xff0c;我们可以跟进回归或更复杂的分类问题&#xff09;。Scikit-learn&#xff08;sklearn&#xff09;…

Django项目不显示图片,路径找不到

1.问题 创建Django项目简单写一个网页&#xff0c;文字能显示&#xff0c;图片却无法加载&#xff0c;路径错误&#xff0c;找不到图片。 2.背景 我的项目结构 C:. ├─.idea │ └─inspectionProfiles ├─app01 │ ├─migrations │ ├─templates │ │ ├─app0…

postgres让别人连接自己本地的库

本地安装了postgres&#xff0c;一般只能自己连接&#xff0c;如果别人想要连接我们自己的库&#xff0c;需要修改postgres的配置。 找到pg.gba.conf&#xff0c;路径是&#xff1a;postgres安装路径/PostgreSQL/data 使用记事本打开这个文件&#xff0c;将别人的ip填入其中即…

Python数学建模-2.5Pandas库介绍

2.5.1Pandas基本操作 Pandas是一个强大的Python数据分析库&#xff0c;它提供了快速、灵活且富有表现力的数据结构&#xff0c;设计初衷是为了处理关系型或标记型数据。Pandas的基本操作涵盖了数据的读取、处理、筛选、排序、分组、合并以及可视化等多个方面。 以下是一些Pan…