MyBatis-Plus代码一键生成

官网地址:MyBatis-Plus 🚀 为简化开发而生

开始:

添加依赖:

        <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.7</version></dependency><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency>

配置方法:只需要修改以下的常量即可

/*** @Description 快速生产模板代码* @Author WangKun* @Date 2024/9/14 10:28* @Version*/
@Slf4j
public class CodedGeneration {/*** @Description 代码生成* @param args* @Throws* @Return void* @Date 2024-09-20 17:10:13* @Author WangKun**/public static void main(String[] args) {log.info("---> 开始!");TABLES.add("sys_user");TABLES.add("sys_log");log.info("---> 添加表{} ", TABLES.toString());VelocityTemplate.velocityTemplate();log.info("---> 结束!");}// 以下为数据库设置// 数据库public static final String DB = "wk-admin1";// 主机public static final String HOST = "127.0.0.1";// 端口号public static final String PORT = "3306";// URLpublic static final String URL = "jdbc:mysql://" + HOST + ":" + PORT + "/" + DB + "?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true";// 用户名public static final String USER_NAME = "root";// 密码public static final String PASSWORD = "123456";// 以下为包名设置// 设置父包名public static final String PARENT = "com.xxx";// 父包public static final String MODULE_NAME = "module";// 设置实体类包名public static final String ENTITY = "entity";// 设置 Service 接口包名public static final String SERVICE = "service";// 设置 Service 实现类包名public static final String SERVICE_IMPL = "serviceImpl";// 设置 Mapper 接口包名public static final String MAPPER = "mapper";// 设置 Mapper XML 文件包名public static final String MAPPER_XML = "mapper.xml";// 设置 Controller 包名public static final String CONTROLLER = "controller";// 输出路径public static final String OUTPUT_DIR = System.getProperty("user.home") + "/Desktop";// 表集合public static final List<String> TABLES = new ArrayList<>();

模板配置:

/*** @Description 代码模板* @Author WangKun* @Date 2024/9/18 15:53* @Version*/
public class VelocityTemplate {// 数据源private static final DataSourceConfig.Builder DATA_SOURCE_CONFIG = new DataSourceConfig.Builder(URL, USER_NAME, PASSWORD);/*** @param* @Description 生成模板* @Throws* @Return void* @Date 2024-09-18 15:42:51* @Author WangKun**/public static void velocityTemplate() {// 使用 FastAutoGenerator 快速配置代码生成器FastAutoGenerator.create(DATA_SOURCE_CONFIG).globalConfig(builder -> {builder.outputDir(OUTPUT_DIR) // 指定输出目录.disableOpenDir()//禁止加载完之后打开.dateType(DateType.SQL_PACK) //时间策略DateType.ONLY_DATE 默认值: DateType.TIME_PACK.commentDate("yyyy-MM-dd HH:mm:ss");//注释的日期}).packageConfig(builder -> {builder.parent(PARENT) // 设置父包名.moduleName(MODULE_NAME)// 父包.entity(ENTITY) // 设置实体类包名.service(SERVICE) // 设置 Service 接口包名.serviceImpl(SERVICE_IMPL) // 设置 Service 实现类包名.mapper(MAPPER) // 设置 Mapper 接口包名.xml(MAPPER_XML) // 设置 Mapper XML 文件包名.controller(CONTROLLER); // 设置 Controller 包名}).strategyConfig(builder -> {builder.addInclude(TABLES) // 设置需要生成的表名,多个表“”,“”.addTablePrefix("t_", "c_", "hw_") // 设置过滤表前缀 去除表的前缀如果t_user则变成User而不包含TUser.enableSkipView()//开启跳过视图//策略配置//entity层.entityBuilder().javaTemplate("templates/entity.java.vm") // 设置实体类模板.enableLombok() // 启用 Lombok.naming(NamingStrategy.underline_to_camel)//开启驼峰命名.logicDeleteColumnName("isDelete")//设置逻辑删除字段注解 @TableLogic.idType(IdType.AUTO)//设置主键类型 @TableId.enableFileOverride() // 覆盖已生成文件//service层.serviceBuilder().serviceTemplate("/templates/service.java.vm") // 设置 Service 模板.formatServiceFileName("%sService") //service层的拼接比如实体类时User拼接成UserService.serviceImplTemplate("/templates/serviceImpl.java.vm") // 设置 ServiceImpl 模板.formatServiceImplFileName("%sServiceImp") //service层的拼接比如实体类时User拼接成UserServiceImpl.enableFileOverride() // 覆盖已生成文件//mapper层.mapperBuilder().mapperTemplate("/templates/mapper.java.vm")  // 设置 Mapper 模板.enableMapperAnnotation() //开启@Mapper注解.formatMapperFileName("%sMapper") //mapper层的拼接比如实体类时User拼接成UserMapper.xml.mapperXmlTemplate("/templates/mapper.xml.vm")  // 设置 xml 模板.formatXmlFileName("%sMapper.xml") //mapper层的拼接比如实体类时User拼接成UserMapper.xml.enableFileOverride() // 覆盖已生成文件//controller层.controllerBuilder().template("templates/controller.java.vm")  // 设置 Controller 模板.formatFileName("%sController")//controller层的拼接比如实体类时User拼接成UserController.enableRestStyle()//开启rest风格,主要为加了@RestController.enableHyphenStyle()//开启驼峰命名.enableFileOverride();// 覆盖已生成文件}).execute(); // 执行生成}}

自定义模板:在resources下新建以下模板

controller.java.vm
package ${package.Controller};import ${package.Service}.${entity}Service
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
#if(${restControllerStyle})
import org.springframework.web.bind.annotation.RestController;
#else
import org.springframework.stereotype.Controller;
#end
#if(${superControllerClassPackage})
import ${superControllerClassPackage};
#end/*** @Description  ${entity}前端控制器* @Author WangKun* @Date ${date}* @Version*/
@RequiredArgsConstructor
#if(${restControllerStyle})
@RestController
#else
@Controller
#end
@RequestMapping("#if(${package.ModuleName})/${package.ModuleName}#end/#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end")
#if(${kotlin})
class ${table.controllerName}#if(${superControllerClass}) : ${superControllerClass}()#end#else
#if(${superControllerClass})
public class ${table.controllerName} extends ${superControllerClass} {
#else
public class ${table.controllerName} {
#endprivate final ${entity}Service ${table.entityPath}Service;}
#end
entity.java.vm
package ${package.Entity};#foreach($pkg in ${table.importPackages})
import ${pkg};
#end
#if(${springdoc})
import io.swagger.v3.oas.annotations.media.Schema;
#elseif(${swagger})
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
#end
#if(${entityLombokModel})
import lombok.Data;
import java.io.Serial;
#if(${chainModel})
import lombok.experimental.Accessors;
#end
#end/*** @Description ${entity}实体类* @Author WangKun* @Date ${date}* @Version*/
#if(${entityLombokModel})
@Data#if(${chainModel})
@Accessors(chain = true)#end
#end
#if(${table.convert})
@TableName("${schemaName}${table.name}")
#end
#if(${springdoc})
@Schema(name = "${entity}", description = "$!{table.comment}")
#elseif(${swagger})
@ApiModel(value = "${entity}对象", description = "$!{table.comment}")
#end
#if(${superEntityClass})
public class ${entity} extends ${superEntityClass}#if(${activeRecord})<${entity}>#end {
#elseif(${activeRecord})
public class ${entity} extends Model<${entity}> {
#elseif(${entitySerialVersionUID})
public class ${entity} implements Serializable {
#else
public class ${entity} {
#end
#if(${entitySerialVersionUID})@Serialprivate static final long serialVersionUID = 1L;
#end
## ----------  BEGIN 字段循环遍历  ----------
#foreach($field in ${table.fields})#if(${field.keyFlag})
#set($keyPropertyName=${field.propertyName})
#end
#if("$!field.comment" != "")#if(${springdoc})@Schema(description = "${field.comment}")#elseif(${swagger})@ApiModelProperty("${field.comment}")#else/*** ${field.comment}*/#end
#end
#if(${field.keyFlag})
## 主键#if(${field.keyIdentityFlag})@TableId(value = "${field.annotationColumnName}", type = IdType.AUTO)#elseif(!$null.isNull(${idType}) && "$!idType" != "")@TableId(value = "${field.annotationColumnName}", type = IdType.${idType})#elseif(${field.convert})@TableId("${field.annotationColumnName}")#end
## 普通字段
#elseif(${field.fill})
## -----   存在字段填充设置   -----#if(${field.convert})@TableField(value = "${field.annotationColumnName}", fill = FieldFill.${field.fill})#else@TableField(fill = FieldFill.${field.fill})#end
#elseif(${field.convert})@TableField("${field.annotationColumnName}")
#end
## 乐观锁注解
#if(${field.versionField})@Version
#end
## 逻辑删除注解
#if(${field.logicDeleteField})@TableLogic
#endprivate ${field.propertyType} ${field.propertyName};
#end
## ----------  END 字段循环遍历  ----------
#if(!${entityLombokModel})
#foreach($field in ${table.fields})#if(${field.propertyType.equals("boolean")})#set($getprefix="is")#else#set($getprefix="get")#endpublic ${field.propertyType} ${getprefix}${field.capitalName}() {return ${field.propertyName};}#if(${chainModel})public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {#elsepublic void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {#endthis.${field.propertyName} = ${field.propertyName};#if(${chainModel})return this;#end}
#end
## --foreach end---
#end
## --end of #if(!${entityLombokModel})--
#if(${entityColumnConstant})#foreach($field in ${table.fields})public static final String ${field.name.toUpperCase()} = "${field.name}";#end
#end
#if(${activeRecord})@Overridepublic Serializable pkVal() {#if(${keyPropertyName})return this.${keyPropertyName};#elsereturn null;#end}
#end
#if(!${entityLombokModel})@Overridepublic String toString() {return "${entity}{" +#foreach($field in ${table.fields})#if($!{foreach.index}==0)"${field.propertyName} = " + ${field.propertyName} +#else", ${field.propertyName} = " + ${field.propertyName} +#end#end"}";}
#end
}
mapper.java.vm
package ${package.Mapper};import ${package.Entity}.${entity};
import ${superMapperClassPackage};
#if(${mapperAnnotationClass})
import ${mapperAnnotationClass.name};
#end/*** @Description ${entity}Mapper 接口* @Author WangKun* @Date ${date}* @Version*/
#if(${mapperAnnotationClass})
@${mapperAnnotationClass.simpleName}
#end
#if(${kotlin})
interface ${table.mapperName} : ${superMapperClass}<${entity}>
#else
public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {}
#end
mapper.xml.vm
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${package.Mapper}.${table.mapperName}">#if(${enableCache})<!-- 开启二级缓存 --><cache type="${cacheClassName}"/>#end
#if(${baseResultMap})<!-- 通用查询映射结果 --><resultMap id="BaseResultMap" type="${package.Entity}.${entity}">
#foreach($field in ${table.fields})
#if(${field.keyFlag})##生成主键排在第一位<id column="${field.name}" property="${field.propertyName}" />
#end
#end
#foreach($field in ${table.commonFields})##生成公共字段<result column="${field.name}" property="${field.propertyName}" />
#end
#foreach($field in ${table.fields})
#if(!${field.keyFlag})##生成普通字段<result column="${field.name}" property="${field.propertyName}" />
#end
#end</resultMap>#end
#if(${baseColumnList})<!-- 通用查询结果列 --><sql id="Base_Column_List">
#foreach($field in ${table.commonFields})${field.columnName},
#end${table.fieldNames}</sql>#end
</mapper>
service.java.vm
package ${package.Service};import ${package.Entity}.${entity};
import ${superServiceClassPackage};/*** @Description ${entity}服务类* @Author WangKun* @Date ${date}* @Version*/
#if(${kotlin})
interface ${table.serviceName} : ${superServiceClass}<${entity}>
#else
public interface ${table.serviceName} extends ${superServiceClass}<${entity}> {}
#end
serviceImpl.java.vm
package ${package.ServiceImpl};import ${package.Entity}.${entity};
import ${package.Mapper}.${table.mapperName};
#if(${generateService})
import ${package.Service}.${table.serviceName};
#end
import ${superServiceImplClassPackage};
import org.springframework.stereotype.Service;/*** @Description ${entity}服务实现类* @Author WangKun* @Date ${date}* @Version*/
@Service
#if(${kotlin})
open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}>()#if(${generateService}), ${table.serviceName}#end {}
#else
public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}>#if(${generateService}) implements ${table.serviceName}#end {}
#end

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

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

相关文章

IMS 在线计费 IMS 离线计费

目录 1. IMS 在线计费 1.1 主要内容 1.2 IMS 在线计费架构 ​编辑1.3 IMS 在线计费方案 1.4 IMS 在线计费的关键步骤 1.5 在线计费的基本流程 1.6 IMS Information AVP 2. IMS 离线计费 2.1 IMS 离线计费架构 2.2 IMS 离线计费概述 2.3 什么时候 AS 给 CG 发送 ACR?…

独立站技能树/工具箱1.0 总纲篇丨出海笔记

正所谓要把一件事做到90分很难&#xff0c;但做到60分基本上照着SOP做到位都没问题&#xff0c;如果我们能把每件事都做到60分&#xff0c;那绝对比至少60%的人都强&#xff0c;除非你的对手不讲武德——那就是他很可能看了我这篇文章&#xff0c;不但每方面都超过及格线&#…

油耳拿什么清理比较好?比较推荐哪种可视耳勺

相信很多小伙伴都有挖耳朵方面的困扰&#xff0c;尤其是油性耳朵的人&#xff0c;用棉签掏耳朵时感觉越掏越往里去&#xff0c;而使用普通耳勺又因为材质过硬&#xff0c;在使用过程中容易刮伤耳道。于是市面上出现了可视挖耳勺&#xff0c;让人们可以在看得见的情况下取出耳道…

解决novnc1.2.0不能使用剪切板的问题

1.下载资源文件asciidef.js,在rfb.js中引入 2.修改rfb.js中clipboardPasteFrom方法如下 clipboardPasteFrom(text) {if (this._rfbConnectionState !== connected || this._viewOnly) {return; }if (this._clipboardServerCapabilitiesFormats[extendedClipboardFormatText] &…

MT6765/MT6762(R/D/M)/MT6761(MT8766)安卓核心板参数比较_MTK联发科4G智能模块

联发科Helio P35 MT6765安卓核心板 MediaTek Helio P35 MT6765是智能手机的主流ARM SoC&#xff0c;于2018年末推出。它在两个集群中集成了8个ARM Cortex-A53内核&#xff08;big.LITTLE&#xff09;。四个性能内核的频率高达2.3GHz。集成显卡为PowerVR GE8320&#xff0c;频率…

研发企业的源代码防泄密秘籍:一机两用的沙盒电脑

在数字化时代&#xff0c;数据安全已成为企业最关注的问题之一。尤其是对于研发密集型企业&#xff0c;源代码的安全更是核心资产。SDC沙盒&#xff0c;正是为了应对这一挑战而设计的先进数据防泄密解决方案。 全面保护&#xff0c;从源头开始 SDC沙盒采用独特的代码级安全设…

python线程(python threading模块、python多线程)(守护线程与非守护线程)

文章目录 Python多线程入门1. Python多线程概述2. threading模块基础- Thread 类: 这是一个代表线程的类。可以通过创建Thread类的实例来新建一个线程。- Lock 类: 在多线程环境中&#xff0c;为了防止数据错乱&#xff0c;通常需要用到锁机制。Lock类提供了基本的锁功能&#…

如日中天的AI大模型,也到了发展幻灭期!

近期 Gartner发布了《新兴技术成熟度曲线》&#xff0c;其中生成式 AI &#xff08;GenAI&#xff09; 正式进入到了幻灭期。 2018 年 6 月&#xff0c;OpenAI发布GPT-1模型&#xff0c;生成式AI开始向产品化发展。 到2022年的GPT-3.5发布&#xff0c;并且ChatGPT首次向公众推…

企业微信-前往服务商后台页面对接解决方案

序 我会告诉你在哪里点我会告诉你在哪里配置点下去他只返回auth_code的&#xff0c;我怎么登录 正文 他是在这个位置 是这样&#xff0c;应用授权安装第三方应用后&#xff0c;企业微信&#xff08;管理员角色&#xff09;是可以从pc端企业后台点第三方应用的。 如果我没记…

【qt】一个WPS项目了解qt界面设计的基本套路

项目功能演示: 放心食用!最后有完整代码. 超级详细,期待您的一个点赞❥(^_-) 一览全局: WPS项目目录 一.创建项目二.导入资源三.ui设计四.字号选择框初始化五.滚动条初始化六.添加自定义文本类七.初始化action状态八.新建文档九.打开文件十.保存与另存为十一.打印/打印预览十…

QT设置git仓库

笔者最近想写一个qt的程序&#xff0c;想要把这个代码推送到github上。 前提是电脑已安装了git、QT 以下是设置步骤&#xff1a; 1.设置QT中关于git的配置 打开QT&#xff0c;点击工具-》选项-》版本控制-》填写PATH 这个PATH是你安装git的绝对路径&#xff0c;如果你不记得…

HTTP中的Cookie与Session

一、背景 HTTP协议是无状态无连接的。 无状态&#xff1a;服务器不会保存客户端历史请求记录&#xff0c;每一次请求都是全新的。 无连接&#xff1a;服务器应答后关闭连接&#xff0c;每次请求都是独立的。 无状态就导致服务器不认识每一个请求的客户端是否登陆过。 这时…

Mybatis框架映射---代码实现(XML配置以及注解形式)

目录 一. 映射关系 1 对 1-映射方式 1.通过xml文件实现映射的一对一关系 总结 &#xff1a; 2.通过注解的方式来实现下面的 1 对 1 的映射关系&#xff0c;实现级联查询 总结&#xff1a; 二. 映射关系多对一 1.通过xml文件实现映射的多对一关系 2.通过注解的方式来实现…

【Elasticsearch系列十五】强大特性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

MapReduce基本原理

目录 整体执行流程​ Map端执行流程 Reduce端执行流程 Shuffle执行流程 整体执行流程 八部曲 读取数据--> 定义map --> 分区 --> 排序 --> 规约 --> 分组 --> 定义reduce --> 输出数据 首先将文件进行切片&#xff08;block&#xff09;处理&#xff…

EsDA,一站式嵌入式软件

EsDA是一套面向工业智能物联领域的嵌入式系统设计自动化工具集&#xff0c;包含实时操作系统AWorksLP、低代码开发平台AWStudio、资源管理平台AXPI、跨平台GUI引擎AWTK和云服务平台ZWS&#xff0c;旨在提高嵌入式软件开发的效率、性能和可扩展性。 EsDA全称是嵌入式系统设计自动…

司南 OpenCompass 九月大语言模型评测榜单启动召集,欢迎新合作厂商申请评测

主要概览 司南 OpenCompass 大语言模型官方自建榜单&#xff08;9 月榜&#xff09;评测拟定于 10 月上旬发布&#xff0c;现诚挚邀请新加入的合作方参与评测。本次评测围绕强化能力维度&#xff0c;全面覆盖语言、推理、知识、代码、数学、指令跟随、智能体等七大关键领域&am…

ThreaLocal

1.概述 ThreadLoca称线程局部变量&#xff0c;用于在线程中保存数据&#xff0c;保存的数据仅属于当前线程(即对其他线程而言&#xff0c;该变量是当前线程独有的变量) threadLocal利用Thread中的ThreadLocalMap来进行数据存储 2.常用方法 存储数据至当前线程ThreadLocalMap中…

Unity引擎绘制多边形属性图

大家好&#xff0c;我是阿赵   在制作游戏的时候&#xff0c;经常会遇到需要绘制多边形属性图的需求&#xff0c;比如这种效果&#xff1a; 可以根据需要的属性的数量变化多边形的边数&#xff0c;然后每一个顶点从中心点开始到多边形的顶点的长度代表了该属性的强度&#xf…

谈对象第二弹: C++类和对象(中)

文章目录 一、类的默认成员函数二、构造函数三、析构函数四、拷贝构造函数五、运算符重载5.1运算符重载5.2赋值运算符重载5.3实现日期类<<、>>重载检查、获取天数关系运算符重载算数、赋值运算符重载Date.hDate.cpp 六、取地址运算符重载6.1const成员函数6.2取地址…