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

个人博客:无奈何杨(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);// DTOList<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 #设置默认的数据源或者数据源组,默认值即为masterstrict: 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=trueusername: dbnamepassword: dbpassworddriver-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=trueusername: dbnamepassword: dbpassworddriver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置data:redis:host: redisport: 6379# cluster:#   nodes: 127.0.0.1:6379database: 0password: redispasswordlettuce: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.mzph.cn/news/752793.shtml

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

相关文章

Redis实战——查询缓存缓存穿透、雪崩、击穿

目录 为什么要使用缓存缓存的作用缓存的成本如何使用缓存缓存模型和思路缓存更新策略数据库和缓存不一致解决方案数据库和缓存不一致采用什么方案对比删除缓存与更新缓存如何保证缓存与数据库的操作同时成功/同时失败先操作缓存还是先操作数据库&#xff1f; 实现商铺缓存与数据…

Tensorflow笔记(二):激活函数、优化器等、神经网络模型实现(商品销量预测)

import tensorflow as tf import numpy as np from tqdm import tqdm# ----------------------------- tensor常用函数2 ----------------------------------- a tf.constant([1, 2, 3, 1, 2]) b tf.constant([0, 1, 3, 4, 5]) c tf.where(tf.greater(a, b), a, b) # 若a&g…

Linux下的多线程编程:原理、工具及应用(4)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;Flower of Life—陽花 0:34━━━━━━️&#x1f49f;──────── 4:46 &#x1f504; ◀️ ⏸ ▶️ ☰ …

RuoYi-Vue开源项目2-前端登录验证码生成过程分析

前端登录验证码实现过程 生成过程分析 生成过程分析 验证码的生成过程简单概括为&#xff1a;前端登录页面加载时&#xff0c;向后端发送一个请求&#xff0c;返回验证码图片给前端页面展示 前端页面加载触发代码&#xff1a; import { getCodeImg } from "/api/login&q…

Spring6--基础概念

1. 概述 1.1. Spring是什么 Spring 是一套广泛应用于 Java 企业级应用开发领域的轻量级开源框架&#xff0c;由 Rod Johnson 创立&#xff0c;旨在显著降低 Java 企业应用的复杂性&#xff0c;缩短开发周期&#xff0c;并提升开发效率。Spring 不仅适用于服务器端开发&#x…

三个案例,带你看懂智能时代支撑降本增效的底层逻辑

2003年&#xff0c;“神舟五号”成功登上太空&#xff0c;2007年&#xff0c;乔布斯初代苹果发布会&#xff0c;2016年“天宫二号”与“神州十一号”自动交会对接成功&#xff0c;2022年ChatGPT横空出市。 科技发展速度令人惊叹&#xff0c;一不留神就步入了下一个科技时代&am…

【vue elementUI】el-select和弹出框el-option样式调整,::v-deep失效

组件自带样式&#xff1a; 修改后样式&#xff1a; 注意修改弹出框样式需要修改一个属性&#xff1a; 此属性默认值为true&#xff0c;此时可以看到弹出框是放在外面的&#xff0c;没有在el-select里面。此时设置弹窗样式会不生效&#xff0c;::v-deep无效。 需要将此属性改为f…

JavaScript练手小技巧:数字反转时钟

样式基于博主的这篇文章&#xff1a; CSS3技巧38&#xff1a;3D 翻转数字效果-CSDN博客 既然可以实现翻转数字了&#xff0c;肯定就可以跟 JS 相结合去完成一些数字展示效果。 比如&#xff0c;数字反转时钟。 为了方便&#xff0c;所有 HTML 数字根据时间动态生成。因此&a…

vue3 element plus 上传下载

文章目录 上传下载 上传 /* html */ <el-upload v-model"fileId" class"avatar-uploader" ref"exampleUploadRef" :file-list"fileList" :show-file-list"false" action"/ys-three-year/ThreeReport/uploadFile&q…

Coarse-to-Fine Latent Diffusion for Pose-Guided Person Image Synthesis阅读笔记

连更&#xff01;&#xff01; 0 Abstract 先前的姿势引导图像合成方法简单的将人的外观与目标姿势进行对齐&#xff0c;这容易导致过拟合&#xff0c;因为缺乏对source person image的high-level semantic understanding&#xff1b;文章开发了一种新的训练范式&#xff1a;…

mudo服务器测试一

目录 长连接测试 测试代码 客户端 服务端 超时连接测试 测试代码 客户端 服务端 错误请求测试 测试代码 场景一 客户端 服务端 场景二 客户端 服务端 长连接测试 测试代码 /*长连接测试1: 创建一个客户端持续给服务器发送数据,直到超过时间看是否正常*/ #inc…

实用工具推荐----geek 卸载软件的神器

Geek Uninstaller 是一款软件卸载工具。它提供简单易用的界面和强大的卸载功能&#xff0c;能快速扫描和识别应用程序&#xff0c;并彻底删除与之相关的文件和注册表项&#xff0c;确保完全清除应用程序。它还可以监视应用程序安装过程&#xff0c;并记录创建的文件和注册表项…

计算机组成原理练习-计算机性能指标

CPU时间与IO时间 ------------------------------------------------------------------------------------------------------------------------------- 1.假定基准程序A在某计算机上的运行时间为100秒&#xff0c;其中90秒为CPU时间&#xff0c;其余 为l/O时间。若CPU速度…

WebGIS之实现查询地区天气并让地区高亮

一.预览>> 二.思路>> 根据搜索框的内容来进行页面视角的切换&#xff0c;对应的地区高亮&#xff0c;右边有关天气的地方实时更新&#xff0c;并且因为代码体量非常小&#xff0c;并没有选择在框架下完成。直接一个html文件搞定了&#xff0c;但实际上还是有一些坑…

带有超令牌采样的视觉转换器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;带有超令牌采样的视觉转换器1、研究背景2、方法提出3、优势4、实验5、贡献 二、StokenAttention代码学习 摘要 本周主要阅读了CV…

Elasticsearch数据存储优化方案

优化Elasticsearch数据存储有助于提升系统性能、降低成本、提高数据查询效率以及增强系统的稳定性和可靠性。通常我们再优化Elasticsearch数据存储会遇到一些问题&#xff0c;导致项目卡壳。以下是优化Elasticsearch数据存储的一些重要作用&#xff1a; 1、问题背景 在某些场景…

AI系统性学习03—ChatGPT开发教程

文章目录 1、OpenAI关键概念⭐️2、OpenAI SDK介绍3、OpenAI API KEY&API 认证3.1 REST API安全认证 4、OpenAI模型⭐️4.1 模型分类4.2 GPT44.3 GPT-3.54.4 Embeddings 5、OpenAI快速入门6、Function calling(函数调用)⭐️⭐️⭐️6.1 应用场景6.2 支持function calling的…

打破传统,拥抱未来:解锁企业数字化转型成功的11把金钥匙

数字化转型是一个持续的过程&#xff0c;需要企业不断地适应新技术和市场变化。企业如何提高转型成功的可能性&#xff0c;并在竞争激烈的市场中保持领先地位。今天我们来解锁企业数字化转型成功的11把金钥匙。 清晰的战略目标&#xff1a; 首先&#xff0c;企业需要明确数字化…

如何高效接入 Flink: Connecter / Catalog API 核心设计与社区进展

本文整理自阿里云实时计算团队 Apache Flink Committer 和 PMC Member 任庆盛在 FFA 2023 核心技术专场&#xff08;二&#xff09;中的分享&#xff0c;内容主要分为以下四部分&#xff1a; Source APISink API将 Connecter 集成至 Table /SQL APICatalog API 在正式介绍这些 …

CornerStone之读取txt文件点数据

1. 页面标签 页面中目前只提供一个按钮来进行输入文件 <input click"importZeroOne" type"file" />2. 函数定义 在输入文件之后&#xff0c;执行importZeroOne函数&#xff0c;获得输入的文件&#xff0c;进行以下处理 const importZeroOne((eve…