个人博客:无奈何杨(wnhyang)
个人语雀:wnhyang
共享语雀:在线知识共享
Github:wnhyang -
Overview
简介
如标题所言,本篇文章介绍如何使用MybatisPlus-Generator
自定义模版生成CRUD
、DTO
、VO
、Convert
等。
项目已在开源,可以通过以下Github
/Gitee
链接下载源码使用,目前生成器还不是很灵活,你可以下载源码自定义修改,或者真的有需要可以提Issues
,我们一起来完善。
GitHub -
wnhyang/crud-quickstart
Gitee -
wnhyang/crud-quickstart
Mybatis官网:代码生成器配置新 |
MyBatis-Plus
项目说明
看图就行了
从下面截图和这里的生成器可以看到除了MybatisPlus
自带的entity.java
、mapper.java
、mapper.xml
、service.java
、serviceImpl.java
、controller.java
外,自定了CreateVO.java
、UpdateVO.java
、VO.java
、Page.java
、DTO.java
、Convert.java
模版。
使用范围
数据源:MySQL
,因为我主要使用的是MySQL
,其他数据源没测试过,不敢保证。
工具:lombok
、mapstruct
,因为项目使用mapstruct
做DTO
、VO
的转换工具,所以这些是必要的。
基础但非必要:JDK17
+ Spring Boot3
+
MybatisPlus
最新版,非必要指的是版本。
使用方法
如上截图,因为是我日常使用,添加了一些我需要的依赖、配置和自定义类。pom
依赖就多了些,你可以根据自需要取舍。这里就不贴了,有点多。
必要依赖
因为自定义的不止这些,所以单单使用这些是不够的。
1 2 3 4 5 6 7 8 9
| <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个字段(creator
、create_time
、updater
、update_time
、deleted
),deleted
是逻辑删除字段。
也是因此,生成的entity
共同继承了一个基础类BasePO.java
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| 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;
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;
|
生成器
使用时修改静态常量就可以,如:数据源、用户名密码、模块名、包名、作者、表名等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
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) { FastAutoGenerator.create(DATASOURCE_URL, USERNAME, PASSWORD) .globalConfig(builder -> { builder.disableOpenDir() .outputDir(OUTPUT_PATH + "/src/main/java") .author(AUTHOR) .dateType(DateType.TIME_PACK) .commentDate("yyyy/MM/dd"); }) .packageConfig(builder -> { builder.parent(PARENT_PATH) .moduleName(MODULE_NAME) .entity("entity") .service("service") .serviceImpl("service.impl") .mapper("mapper") .xml("mapper") .controller("controller") .pathInfo(Collections.singletonMap(OutputFile.xml, OUTPUT_PATH + "/src/main/resources/mapper")); }) .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");
}) .strategyConfig(builder -> { builder.addInclude(TABLES) .addTablePrefix("t_", "c_", "sys_", "de_")
.entityBuilder() .enableFileOverride() .superClass(BasePO.class) .enableLombok() .enableTableFieldAnnotation() .logicDeleteColumnName("deleted") .naming(NamingStrategy.underline_to_camel) .columnNaming(NamingStrategy.underline_to_camel) .formatFileName("%s")
.mapperBuilder() .enableFileOverride() .superClass(BaseMapperX.class) .mapperAnnotation(org.apache.ibatis.annotations.Mapper.class) .formatMapperFileName("%sMapper") .formatXmlFileName("%sMapper")
.serviceBuilder() .enableFileOverride() .formatServiceFileName("%sService") .formatServiceImplFileName("%sServiceImpl")
.controllerBuilder() .enableFileOverride() .enableRestStyle() .formatFileName("%sController");
}) .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); 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); }) .templateEngine(new VelocityTemplateEngine())
.execute(); } }
|
运行生成器
在运行成功后,生成如下类
运行web项目
1、在IDEA
中右键项目,选择Reformat Code
2、然后优化导包
3、修改application.yml
dbname
、dbname
、dbpassword
、redispassword
等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| spring: datasource: dynamic: primary: master strict: 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 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 data: redis: host: redis port: 6379 database: 0 password: redispassword lettuce: pool: max-active: 64 max-idle: 32 min-idle: 0 max-wait: 20ms shutdown-timeout: 100ms
|
4、运行GeneratorApplication
测试
使用Postman
之类的工具,或者使用IDEA
的RestfulTool
插件测试
我使用的是Apifox
插件配合客户端,所以在配置了Apifox
插件项目之后,右键项目的controller
,选择Upload to Apifox
同步接口。
然后在Apifox
客户端就可以看到所有接口了。
1、设置环境;2、选择接口;3、自动生成;4、发送
完美!!!
欢迎使用
GitHub -
wnhyang/crud-quickstart
Gitee -
wnhyang/crud-quickstart
写在最后
拙作艰辛,字句心血,望诸君垂青,多予支持,不胜感激。
个人博客:无奈何杨(wnhyang)
个人语雀:wnhyang
共享语雀:在线知识共享
Github:wnhyang -
Overview