MybatisPlus最新代码生成器(version3.5.1+),自定义文件模板
1、导入依赖(我这里用的是gradle构建工具,maven也一样啦~)
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.3' // 定义SpringBoot版本,不单独使用
id 'io.spring.dependency-management' version '1.1.0'
}
group 'com.qbb'
version '1.0-SNAPSHOT'
// 设置编译的Java版本
sourceCompatibility = 17
targetCompatibility = 17
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
implementation 'org.springframework.boot:spring-boot-starter-web' //省略版本,原生bom支持,插件management提供
implementation 'org.springframework.boot:spring-boot-devtools' // 热部署
implementation 'org.projectlombok:lombok:1.18.24' // 简化开发
implementation 'com.baomidou:mybatis-plus-boot-starter:3.5.2' // mybatis-plus
implementation 'com.baomidou:mybatis-plus-generator:3.5.3' // mybatis-plus代码生成器
implementation 'org.freemarker:freemarker:2.3.31' // 模板引擎
implementation 'mysql:mysql-connector-java:8.0.31' // mysql
implementation 'io.springfox:springfox-boot-starter:3.0.0' // swagger3
}
test {
useJUnitPlatform()
}
2、编写两个基础类用作继承(当然也可以不用)
// BaseController 封装公共请求
package com.qbb.security.common;
public class BaseController {
// WARN:自定义信息
}
// BaseEntity 封装公共字段
package com.qbb.security.common;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public abstract class BaseEntity implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "create_time", fill = FieldFill.INSERT)
private LocalDateTime createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
3、编写CodeGenerator(完整配置,有些参数没用到,感兴趣的自己研究一下~)
package com.qbb.security.code;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.fill.Property;
import com.qbb.security.common.BaseController;
import com.qbb.security.common.BaseEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class CodeGenerator {
public static void main(String[] args) {
// 获取表名
List<String> tables = getTableNames();
// 数据库设置
FastAutoGenerator.create("jdbc:mysql://localhost:3306/startqbb", "root", "root")
/**
* 全局配置
*/
.globalConfig(builder -> {
builder.author("QIUQIU&LL") // 作者
.disableOpenDir() // 禁止打开输出目录
.outputDir(System.getProperty("user.dir") + "\\src\\main\\java") // 指定输出目录 /opt/baomidou/ 默认值: windows:D:// linux or mac : /tmp
.enableSwagger() // 开启 swagger 模式 默认值:false
.dateType(DateType.TIME_PACK) // 时间策略 DateType.ONLY_DATE 默认值: DateType.TIME_PACK
.commentDate("yyyy-MM-dd"); // 注释日期 默认值: yyyy-MM-dd
// .fileOverride(); // 覆盖已有文件(已迁移到策略配置中,3.5.4版本会删除此方法)
})
/**
* 包配置
*/
.packageConfig(builder -> builder.parent("com.qbb.security") // 父包名 默认值:com.baomidou
// .moduleName("com.qbb.security") // 父包模块名 默认值:无
.entity("domain") // Entity 包名 默认值:common
.service("service") // Service 包名 默认值:service
.serviceImpl("service.impl") // Service Impl 包名 默认值:service.impl
.controller("controller") // Controller 包名 默认值:controller
.mapper("mapper") // Mapper 包名 默认值:mapper
.xml("mapper") // Mapper XML 包名 默认值:mapper.xml
.pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "\\src\\main\\resources\\mapper"))) // xml的路径配置信息
/**
* 策略配置
*/
.strategyConfig(builder -> builder.addInclude(tables)// 增加表匹配(内存过滤) include 与 exclude 只能配置一项
// .enableCapitalMode() // 开启大写命名 默认值:false
// .enableSkipView() // 开启跳过视图 默认值:false
// .disableSqlFilter() // 禁用 sql 过滤 默认值:true,语法不能支持使用 sql 过滤表的话,可以考虑关闭此开关
// .enableSchema() // 启用 schema 默认值:false,多 schema 场景的时候打开
// .likeTable(LikeTable) // 模糊表匹配(sql 过滤) likeTable 与 notLikeTable 只能配置一项
// .notLikeTable(LikeTable) // 模糊表排除(sql 过滤) likeTable 与 notLikeTable 只能配置一项
// .addExclude() // 增加表排除匹配(内存过滤) include 与 exclude 只能配置一项
.addTablePrefix("t_", "sys_", "tb_")
// .addTableSuffix(String...) // 增加过滤表后缀
// .addFieldPrefix(String...) // 增加过滤字段前缀
// .addFieldSuffix(String...) // 增加过滤字段后缀
/**
* service 策略配置
*/
.serviceBuilder()
.superServiceClass(IService.class) // 设置 service 接口父类 BaseService.class
// .superServiceClass(String) // 设置 service 接口父类 com.baomidou.global.BaseService
.superServiceImplClass(ServiceImpl.class) // 设置 service 实现类父类 BaseServiceImpl.class
// .superServiceImplClass(String) // 设置 service 实现类父类 com.baomidou.global.BaseServiceImpl
// .convertServiceFileName(ConverterFileName) // 转换 service 接口文件名称
// .convertServiceImplFileName(ConverterFileName) // 转换 service 实现类文件名称
.formatServiceFileName("%sService") // 格式化 service 接口文件名称
.formatServiceImplFileName("%sServiceImpl") // 格式化 service 实现类文件名称
/**
* 实体策略配置
*/
.entityBuilder()
// .nameConvert(INameConvert) // 名称转换实现
.superClass(BaseEntity.class) // 设置父类 BaseEntity.class
// .superClass(String) // 设置父类 com.baomidou.global.BaseEntity
.disableSerialVersionUID() // 禁用生成 serialVersionUID 默认值:true
// .enableColumnConstant() // 开启生成字段常量 默认值:false
.enableChainModel() // 开启链式模型 默认值:false
.enableRemoveIsPrefix() // 开启 Boolean 类型字段移除 is 前缀 默认值:false
.enableTableFieldAnnotation() // 开启生成实体时生成字段注解 默认值:false
// .enableActiveRecord() // 开启 ActiveRecord 模型 默认值:false
.versionColumnName("version") // 乐观锁字段名(数据库)
// .versionPropertyName(String) // 乐观锁属性名(实体)
.logicDeleteColumnName("is_deleted") // 逻辑删除字段名(数据库)
// .logicDeletePropertyName(String) // 逻辑删除属性名(实体)
.naming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略 默认下划线转驼峰命名:NamingStrategy.underline_to_camel
// .columnNaming(NamingStrategy.underline_to_camel) // 数据库表字段映射到实体的命名策略 默认为 null,未指定按照 naming 执行
// .addSuperEntityColumns("id", "createTime", "updateTime", "statu") // 添加父类公共字段
// .addIgnoreColumns(String...) // 添加忽略字段
.addTableFills(new Column("create_time", FieldFill.INSERT)) // 添加表字段填充
.addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE)) // 添加表字段填充
// .idType(IdType.AUTO) // 全局主键类型
// .convertFileName(ConverterFileName)// 转换文件名称
// .formatFileName(String) // 格式化文件名称
.enableLombok() // 开启 lombok 模型 默认值:false
/**
* controller 策略配置
*/
.controllerBuilder()
.superClass(BaseController.class) // 设置父类 BaseController.class
// .superClass(String) // 设置父类 com.baomidou.global.BaseController
.enableHyphenStyle() // 开启驼峰转连字符 默认值:false
.enableRestStyle() // 开启生成@RestController 控制器 默认值:false
// .convertFileName(ConverterFileName) // 转换文件名称
.formatFileName("%sController")// 格式化文件名称
/**
* mapper 策略配置
*/
.mapperBuilder()
.superClass(BaseMapper.class) // 设置父类 BaseMapper.class
// .superClass(String) //设置父类 com.baomidou.global.BaseMapper
// .enableMapperAnnotation() //开启 @Mapper 注解 默认值:false WARN 因为现在mybatis-plus传递mybatis-spring依赖,这里是没问题的,但后面如果考虑脱离mybatis-spring的时候就需要把这里处理掉,建议使用mapperAnnotation方法来标记自己的注解。
.mapperAnnotation(Mapper.class)
.enableBaseResultMap() // 启用 BaseResultMap 生成 默认值:false
.enableBaseColumnList() // 启用 BaseColumnList 默认值:false
// .cache(Class<? extends Cache>) //设置缓存实现类 MyMapperCache.class
// .convertMapperFileName(ConverterFileName) //转换 mapper 类文件名称
// .convertXmlFileName(ConverterFileName) //转换 xml 文件名称
.formatMapperFileName("%sMapper") // 格式化 mapper 文件名称
.formatXmlFileName("%sMapper") // 格式化 xml 实现类文件名称
)
/**
* 模板配置
*/
.templateConfig(builder -> {
// WARN : 使用我们自定义模板 需要注意虽然我们文件是以ftl结尾,但是这里不要加上ftl,不然会报模板引擎找不到文件
builder
// .disable(TemplateType.ENTITY,TemplateType.SERVICE...) // 禁用模板
// .disable() // 禁用所有模板
.entity("/templates/myEntity.java") // 自定义entity模板
.controller("/templates/myControlle.java") // 自定义controller模板
.service("/templates/myService.java") // 自定义service模板
.serviceImpl("/templates/myServiceImpl.java") // 自定义servicei.mpl模板
.mapper("/templates/myMapper.java") // 自定义mapper模板
.xml("/templates/myMapper.xml"); // 自定义xml模板
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
/**
* 读取控制台内容,获取用户输入的表名
*/
public static List<String> getTableNames() {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入表名(多个表名以逗号隔开):");
String tableNames = scanner.nextLine();
if (StringUtils.isNotBlank(tableNames)) {
return Arrays.asList(tableNames.split(","));
}
throw new MybatisPlusException("请按照格式输入正确的表名!");
}
}
4、CodeGenerator(CV直接用)
package com.qbb.security.code;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.fill.Property;
import com.qbb.security.common.BaseController;
import com.qbb.security.common.BaseEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class CodeGenerator {
public static void main(String[] args) {
// 获取表名
List<String> tables = getTableNames();
// 数据库设置
FastAutoGenerator.create("jdbc:mysql://localhost:3306/startqbb", "root", "root")
/**
* 全局配置
*/
.globalConfig(builder -> {
builder.author("QIUQIU&LL") // 作者
.disableOpenDir() // 禁止打开输出目录
.outputDir(System.getProperty("user.dir") + "\\src\\main\\java") // 指定输出目录 /opt/baomidou/ 默认值: windows:D:// linux or mac : /tmp
.enableSwagger() // 开启 swagger 模式 默认值:false
.dateType(DateType.TIME_PACK) // 时间策略 DateType.ONLY_DATE 默认值: DateType.TIME_PACK
.commentDate("yyyy-MM-dd"); // 注释日期 默认值: yyyy-MM-dd
})
/**
* 包配置
*/
.packageConfig(builder -> builder.parent("com.qbb.security") // 父包名 默认值:com.baomidou
.entity("domain") // Entity 包名 默认值:common
.service("service") // Service 包名 默认值:service
.serviceImpl("service.impl") // Service Impl 包名 默认值:service.impl
.controller("controller") // Controller 包名 默认值:controller
.mapper("mapper") // Mapper 包名 默认值:mapper
.xml("mapper") // Mapper XML 包名 默认值:mapper.xml
.pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "\\src\\main\\resources\\mapper"))) // xml的路径配置信息
/**
* 策略配置
*/
.strategyConfig(builder -> builder.addInclude(tables)// 增加表匹配(内存过滤) include 与 exclude 只能配置一项
.addTablePrefix("t_", "sys_", "tb_")
/**
* service 策略配置
*/
.serviceBuilder()
.superServiceClass(IService.class) // 设置 service 接口父类 BaseService.class
.superServiceImplClass(ServiceImpl.class) // 设置 service 实现类父类 BaseServiceImpl.class
.formatServiceFileName("%sService") // 格式化 service 接口文件名称
.formatServiceImplFileName("%sServiceImpl") // 格式化 service 实现类文件名称
/**
* 实体策略配置
*/
.entityBuilder()
.superClass(BaseEntity.class) // 设置父类 BaseEntity.class
.disableSerialVersionUID() // 禁用生成 serialVersionUID 默认值:true
.enableChainModel() // 开启链式模型 默认值:false
.enableRemoveIsPrefix() // 开启 Boolean 类型字段移除 is 前缀 默认值:false
.enableTableFieldAnnotation() // 开启生成实体时生成字段注解 默认值:false
.versionColumnName("version") // 乐观锁字段名(数据库)
.logicDeleteColumnName("is_deleted") // 逻辑删除字段名(数据库)
.naming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略 默认下划线转驼峰命名:NamingStrategy.underline_to_camel
.addTableFills(new Column("create_time", FieldFill.INSERT)) // 添加表字段填充
.addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE)) // 添加表字段填充
.enableLombok() // 开启 lombok 模型 默认值:false
/**
* controller 策略配置
*/
.controllerBuilder()
.superClass(BaseController.class) // 设置父类 BaseController.class
.enableHyphenStyle() // 开启驼峰转连字符 默认值:false
.enableRestStyle() // 开启生成@RestController 控制器 默认值:false
.formatFileName("%sController")// 格式化文件名称
/**
* mapper 策略配置
*/
.mapperBuilder()
.superClass(BaseMapper.class) // 设置父类 BaseMapper.class
.mapperAnnotation(Mapper.class)
.enableBaseResultMap() // 启用 BaseResultMap 生成 默认值:false
.enableBaseColumnList() // 启用 BaseColumnList 默认值:false
.formatMapperFileName("%sMapper") // 格式化 mapper 文件名称
.formatXmlFileName("%sMapper") // 格式化 xml 实现类文件名称
)
/**
* 模板配置
*/
.templateConfig(builder -> {
// WARN : 使用我们自定义模板 需要注意虽然我们文件是以ftl结尾,但是这里不要加上ftl,不然会报模板引擎找不到文件
builder
.entity("/templates/myEntity.java") // 自定义entity模板
.controller("/templates/myControlle.java") // 自定义controller模板
.service("/templates/myService.java") // 自定义service模板
.serviceImpl("/templates/myServiceImpl.java") // 自定义servicei.mpl模板
.mapper("/templates/myMapper.java") // 自定义mapper模板
.xml("/templates/myMapper.xml"); // 自定义xml模板
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
/**
* 读取控制台内容,获取用户输入的表名
*/
public static List<String> getTableNames() {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入表名(多个表名以逗号隔开):");
String tableNames = scanner.nextLine();
if (StringUtils.isNotBlank(tableNames)) {
return Arrays.asList(tableNames.split(","));
}
throw new MybatisPlusException("请按照格式输入正确的表名!");
}
}
5、文件中使用到的模板文件我放在阿里云盘了,各位自取
模板文件 ===> templates
MybatisPlus最新代码生成器(version3.5.1+),自定义文件模板的更多相关文章
- Pycharm 自定义文件模板
Pycharm 自定义文件模板 每次新建文件都有相同的代码框架,每次重复敲浪费了程序员的寿命啊 按照下面方式自定义自己的模板:
- SpringBoot之【mybatisplus】代码生成器
1.概述. AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity.Mapper.Mapper XML.Service.C ...
- MybatisPlus使用代码生成器遇到的小问题
MyBatisPlus 在3.0.3版本之前使用代码生成器因为存在默认依赖,所以不需要其他的依赖,项目中使用的是3.0.1的版本,所以不用添加其他依赖,添加之后反倒是会报错,实际上MP官网上已经说明了 ...
- C# 自定义文件图标 双击启动 (修改注册表)
程序生成的自定义文件,比如后缀是.test 这种文件怎么直接启动打开程序,并打开本文件呢 1.双击打开 2.自定义的文件,有图标显示 3.自定义的文件,点击右键有相应的属性 后台代码:(如何在注册表中 ...
- java学习笔记(2):获取文件名和自定义文件过滤器
//自定义文件过滤器import java.io.File; import javax.swing.filechooser.*; public class JavaChooser extends Fi ...
- 重新想象 Windows 8 Store Apps (26) - 选取器: 自定义文件选取窗口, 自定义文件保存窗口
原文:重新想象 Windows 8 Store Apps (26) - 选取器: 自定义文件选取窗口, 自定义文件保存窗口 [源码下载] 重新想象 Windows 8 Store Apps (26) ...
- KVO实现自定义文件复制进度展示
一.创建文件 说明:自定义文件类,通过NSFileManager 以及NSFileHandle 实现文件的创建和copy,为了控制内存的并发使用,通过控制每次赋值的固定长度来分多次复制: NSStri ...
- red5 自定义文件存放目录
Red5 流媒体服务器 自定义文件存放目录 Red5在正常情况下,安装之后文件必须存放在Red5安装目录下的oflaDemo\streams中,不能自定义存放目录,例如Red5 安装在C盘,但是我的文 ...
- 如何开发使用自定义文件的OEM应用程序
有关创建和使用自定义数据文件的详细信息,请参阅DISM应用程序包(.appx或.appxbundle)服务命令行选项. 了解如何开发使用自定义文件的应用程序,将信息从OEM传递到应用程序. 对于您为O ...
- 背水一战 Windows 10 (95) - 选取器: 自定义文件保存选取器
[源码下载] 背水一战 Windows 10 (95) - 选取器: 自定义文件保存选取器 作者:webabcd 介绍背水一战 Windows 10 之 选取器 自定义文件保存选取器 示例1.演示如何 ...
随机推荐
- Excel中的数值四舍五入方法详解
在日常工作和数据处理中,我们经常需要对数值进行四舍五入操作.Excel作为一款强大的电子表格软件,提供了多种方法来实现数值的四舍五入.本文将介绍Excel中常用的四舍五入函数及其基本使用方法. ROU ...
- C++算法之旅、06 基础篇 | 第三章 图论
常用代码模板3--搜索与图论 - AcWing DFS 尽可能往深处搜,遇到叶子节点(无路可走)回溯,恢复现场继续走 数据结构:stack 空间:需要记住路径上的点,\(O(h)\). BFS使用空间 ...
- 使用antd-mobile遇到的坑
在使用antd-mobile中的组件的时候,遇到了一些比较棘手的问题,经过查找相关资料和网上的帮助,在此整理出了问题以及解决办法: 在引入antd-mobile的时候,根据官网提供的文档: 1,首先安 ...
- 面试题:Mybatis中的#{}和${}有什么区别?这是我见过最好的回答
面试题:Mybatis中的#{}和${}有什么区别? 前言 今天来分享一道比较好的面试题,"Mybatis中的#{}和${}有什么区别?". 对于这个问题,我们一起看看考察点和比较 ...
- 如何实现一个数据库的 UDF?图数据库 NebulaGraph UDF 功能背后的设计与思考
大家好,我是来自 BOSS直聘的赵俊南,主要负责安全方面的图存储相关工作.作为一个从 v1.x 用到 v3.x 版本的忠实用户,在见证 NebulaGraph 发展的同时,也和它一起成长. BOSS直 ...
- 用Rust手把手编写一个Proxy(代理), UDP绑定篇
用Rust手把手编写一个Proxy(代理), UDP绑定篇 项目 ++wmproxy++ gite: https://gitee.com/tickbh/wmproxy github: https:// ...
- 在同一个k8s集群中部署多套nginx-controller
1.nginx-controller部署请参考我的另一篇博客 nginx Ingress Controller Packaged by Bitnami 2.修改values.yaml 不通contro ...
- python3利用smtplib发送、抄送邮件并附带附件
python3利用smtplib发送.抄送邮件并附带附件 1. 导包 import smtplib from email.mime.text import MIMEText from email.mi ...
- 《流畅的Python》 读书笔记 231007(第二章第一部分)
第2章 数据结构 ABC语言是Python的爸爸~ 很多点子在现在看来都很有 Python 风格:序列的泛型操作.内置的元组和映射类型.用缩进来架构的源码.无需变量声明的强类型 不管是哪种数据结构,字 ...
- Python并发编程——操作系统发展史、多道技术、进程理论、开启进程、join方法、进程间的数据隔离
文章目录 必备知识回顾 今日内容详细 操作系统发展史 多道技术 必备知识点 多道技术图解 多道技术重点知识 进程理论 必备知识点 进程调度 进程运行的三状态图 两对重要概念 开启进程的两种方式 joi ...