零碎04 MybatisPlus自定义模版生成代码

目录

背景

动手开干

需要的依赖包,需要注意mybatis-plus-generator的3.5+版本是没有兼容历史版本的。

定义一个CodeGenerator类,负责生成代码和配置属性

Entity模版


背景

MybatisPlus代码生成使用默认的velocity模版解决不了定制化的需求,不同的开发规范也会出现细节化的差异,在这种情况下我们需要自定义velocity模版达到实现定制化的目的,自定义模板可以让你根据项目的具体要求调整生成代码的格式、结构和内容等。

动手开干

这里不建议学习velocity语法然后直接开始盲写模版,既然是模版,优先需要的肯定是模子。所以可以先写出一套简单的通用CURD,然后根据包、类、方法、对象进行模版编辑,最后通过调试验证就完成了。

MybatisPlus代码生成,官网地址:代码生成器 | MyBatis-Plus

  • 需要的依赖包,需要注意mybatis-plus-generator的3.5+版本是没有兼容历史版本的。
     <properties><java.version>17</java.version><mybatis-plus.version>3.5.3.1</mybatis-plus.version></properties>

    包依赖:

            <!-- mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version></dependency><!-- MyBatis-Plus 代码生成器 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>${mybatis-plus.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-core</artifactId><version>${mybatis-plus.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-annotation</artifactId><version>${mybatis-plus.version}</version></dependency><!-- 模板引擎(Velocity)--><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency>
  • 定义一个CodeGenerator类,负责生成代码和配置属性
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.generator.FastAutoGenerator;
    import com.baomidou.mybatisplus.generator.config.OutputFile;
    import com.baomidou.mybatisplus.generator.config.builder.CustomFile;
    import com.baomidou.mybatisplus.generator.config.rules.DateType;
    import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
    import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
    ​
    import java.util.*;
    ​
    /*** @Author: kule* @Date: 2024/11/19 17:05* @Version: 1.0**/
    public class CodeGenerator {public static void main(String[] args) {System.out.println(System.getProperty("user.dir"));generation("sys_role");}
    ​// module配置,多module需要指定对应private static String MODULE_NAME = "backend";// 数据库链接地址private static String URL = "jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC";// 数据库用户名private static String USERNAME = "root";// 数据库密码private static String PASSWORD = "123456";
    ​public static void generation(String tableName) {// 6个主要的配置:pojo路径、dao路径、service路径、controller路径、mapper路径、xml文件路径FastAutoGenerator.create(URL, USERNAME, PASSWORD)
    ​// 全局配置.globalConfig(builder -> {builder.author("kule")// 用的knife4j,这里不需要启用swagger//.enableSwagger().disableOpenDir() // 禁止打开输出目录.dateType(DateType.TIME_PACK) // 时间类型为LocalDateTime.commentDate("yyyy-MM-dd HH:mm:ss") // 注释日期格式.outputDir(System.getProperty("user.dir") + "/" + MODULE_NAME + "/src/main/java").build(); // 指定输出目录})
    ​// 包配置.packageConfig(builder -> {builder.parent("site.lwer").entity("domain.entity").mapper("mapper").service("service").serviceImpl("service.impl").controller("controller").pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "/" + MODULE_NAME +  "/src/main/resources/mapper")).build();})
    ​// 策略配置.strategyConfig(builder -> {builder.addInclude(tableName) // 表名.addTablePrefix("sys_") // 表名前缀.enableSkipView() // 跳过视图
    ​// 自定义实体类配置.entityBuilder()//.enableLombok() 使用自定义的entityLombokModel判断是否使用lombok 用@Data注解代替默认模版的 @Getter @Setter.naming(NamingStrategy.underline_to_camel) // 数据表映射实体命名: 驼峰命名.columnNaming(NamingStrategy.underline_to_camel) // 表字段映射实体命名: 驼峰命名.idType(IdType.ASSIGN_ID)   // 主键策略 自增
    ​// 自定义mapper配置.mapperBuilder().enableBaseResultMap()// 启用xml文件中的BaseResultMap 生成.enableBaseColumnList()// 启用xml文件中的BaseColumnList.formatMapperFileName("%sMapper")// 格式化Dao类名称
    ​// 自定义service配置.serviceBuilder().formatServiceFileName("%sService")// 格式化 service 接口文件名称.formatServiceImplFileName("%sServiceImpl")// 格式化 service 接口文件名称
    ​// 自定义controller配置.controllerBuilder().formatFileName("%sController") // 格式化 controller 文件名称.enableRestStyle()
    ​.build();})
    ​// 自定义模板配置.templateConfig(builder -> {builder.entity("/templates/entity.java").mapper("/templates/mapper.java").service("/templates/service.java").serviceImpl("/templates/serviceImpl.java").controller("/templates/controller.java");})
    ​// 注入自定义配置.injectionConfig(builder -> {String pack = tableName.substring(tableName.indexOf("_") + 1);//自定义生成模板参数,在vm模版里取值使用Map<String,Object> data = new HashMap<>();data.put("entityLombokModel", true);data.put("chainModel", true);builder.customMap(data);
    ​// 自定义DTO模版List<CustomFile> customFiles = new ArrayList();
    ​// DTO实体CustomFile idReqFile = new CustomFile.Builder().fileName("IdReq.java")//生成java文件名称,要和vm模版里的文件名保持一致.templatePath("/templates/idReq.java.vm")//实体模板位置.packageName("domain.dto." + pack)//生成文件包名.build();customFiles.add(idReqFile);
    ​CustomFile queryFile = new CustomFile.Builder().fileName("Query.java")//生成java文件名称,要和vm模版里的文件名保持一致.templatePath("/templates/query.java.vm")//实体模板位置.packageName("domain.dto." + pack)//生成文件包名.build();customFiles.add(queryFile);
    ​CustomFile saveFile = new CustomFile.Builder().fileName("SaveReq.java")//生成java文件名称,要和vm模版里的文件名保持一致.templatePath("/templates/saveReq.java.vm")//实体模板位置.packageName("domain.dto." + pack)//生成文件包名.build();customFiles.add(saveFile);
    ​CustomFile updateFile = new CustomFile.Builder().fileName("UpdateReq.java")//生成java文件名称,要和vm模版里的文件名保持一致.templatePath("/templates/updateReq.java.vm")//实体模板位置.packageName("domain.dto." + pack)//生成文件包名.build();customFiles.add(updateFile);
    ​// Vo实体CustomFile customFileVO = new CustomFile.Builder().fileName("VO.java").templatePath("/templates/VO.java.vm").packageName("domain.vo").build();customFiles.add(customFileVO);
    ​builder.customFile(customFiles);})
    ​.templateEngine(new VelocityTemplateEngine()).execute();}
    }
  • Entity模版

以entity模版举例,通过比对默认模版的语法和自定义entity的代码,模仿着先写出来我们需要的自定义模版,然后运行生成代码进行微调就可以了。

Tips:

  • Velocity模版里if中的判断有些在MybatisPlus对象中封装的,有些是通过injectionConfig自定义注入的

  • 单纯自己用,逻辑性没必要写的太强,建议多数包引用或者注解直接写死

  • 模板文件代码参考:登录 - Gitee.comicon-default.png?t=O83Ahttps://gitee.com/qiuxl/kule-blog/commit/bea095147a4af43f3cf08218a00f3d956f212566

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

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

相关文章

tomcat 后台部署 war 包 getshell

1. tomcat 后台部署 war 包 getshell 首先进入该漏洞的文件目录 使用docker启动靶场环境 查看端口的开放情况 访问靶场&#xff1a;192.168.187.135:8080 访问靶机地址 http://192.168.187.135:8080/manager/html Tomcat 默认页面登录管理就在 manager/html 下&#xff0c…

MongoDB进阶篇-索引(索引概述、索引的类型、索引相关操作、索引的使用)

文章目录 1. 索引概述2. 索引的类型2.1 单字段索引2.2 复合索引2.3 其他索引2.3.1 地理空间索引&#xff08;Geospatial Index&#xff09;2.3.2 文本索引&#xff08;Text Indexes&#xff09;2.3.3 哈希索引&#xff08;Hashed Indexes&#xff09; 3. 索引相关操作3.1 查看索…

如何给 Apache 新站点目录配置 SELinux ?

在 web 服务器管理领域&#xff0c;确保服务器环境的安全性至关重要。SELinux (Security-Enhanced Linux) 是保护 Linux 服务器最有效的工具之一&#xff0c;它是一种强制访问控制 (MAC mandatory access control) 安全机制。当使用最流行的 web 服务器 Apache 提供 web 内容时…

Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持

作者&#xff1a;来自 Elastic Saikat Sarkar 使用 Elasticsearch 向量数据库构建搜索 AI 体验时如何使用 IBM watsonx™ Slate 文本嵌入。 Elastic 很高兴地宣布&#xff0c;通过集成 IBM watsonx™ Slate 嵌入模型&#xff0c;我们的开放推理 API 功能得以扩展&#xff0c;这…

【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;案例背景&#x1f4af;逻辑运算符的优先级与短路求值运算符优先级的概念短路求值的概念 &#x1f4af;分析案例代码的执行过程第一步&#xff1a;执行 && 运算第二步&#…

2024年11月21日Github流行趋势

项目名称&#xff1a;twenty 项目维护者&#xff1a;charlesBochet, lucasbordeau, Weiko, FelixMalfait, bosiraphael项目介绍&#xff1a;正在构建一个由社区支持的现代化Salesforce替代品。项目star数&#xff1a;21,798项目fork数&#xff1a;2,347 项目名称&#xff1a;p…

【算法】计算程序执行时间(C/C++)

引言 我们在写算法时要考虑到算法的执行效率&#xff0c;有的题目规定了时间限制&#xff0c;我们需要在这个时间之内去解决问题。如果我们需要比对算法的好坏&#xff0c;就需要输出这个程序运行了多长时间。 在C或C中计算程序执行时间&#xff0c;可以使用多种方法&#xf…

【题解】—— LeetCode一周小结46

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结45 11.切棍子的最小成本 题目链接&#xff1a;1547. 切棍子的最…

PH热榜 | 2024-11-22

DevNow 是一个精简的开源技术博客项目模版&#xff0c;支持 Vercel 一键部署&#xff0c;支持评论、搜索等功能&#xff0c;欢迎大家体验。 在线预览 1. Lovable 标语&#xff1a;全球首位全栈人工智能工程师 介绍&#xff1a;GPT工程师已在140多个国家拥有超过5万用户&#…

时序论文23|ICML24谷歌开源零样本时序大模型TimesFM

论文标题&#xff1a;A DECODER - ONLY FOUNDATION MODEL FOR TIME - SERIES FORECASTING 论文链接&#xff1a;https://arxiv.org/abs/2310.10688 论文链接&#xff1a;https://github.com/google-research/timesfm 前言 谷歌这篇时间序列大模型很早之前就在关注&#xff…

【UCIE协议系列-1】

UCIE协议系列-1 1 UCIE背景1.1 UCIE产生背景1.2 UCIE主要特性 2 UCIE分层协议2.1 Protocol 层2.1.1 Mode VS protocal2.1.2 PCIe 6.02.1.2.1 Raw Mode for PCIe 6.02.1.2.2 Flit Mode: Standard 256B Flit for PCIe 6.0 2.1.3 CXL3.0 256B Flit Mode2.1.3.1 Raw Mode for CXL 2…

智能安全配电装置在高校实验室中的应用

​ 摘要&#xff1a;高校实验室是科研人员进行科学研究和实验的场所&#xff0c;通常会涉及到大量的仪器设备和电气设备。电气设备的使用不当或者维护不周可能会引发火灾事故。本文将以一起实验室电气火灾事故为例&#xff0c;对事故原因、危害程度以及防范措施进行分析和总结…

ESP8266 STA模式TCP客户端 电脑手机网络调试助手

1.STA模式TCP客户端和电脑网络调试助手 2.STA模式TCP客户端和手机网络调试助手

高中-信息技术科目考试-编程题

&#xff08;24上&#xff09;1.为了响应国家低碳的倡议&#xff0c;学校请你设计一个饮料瓶回收系统&#xff0c;根据投的饮料瓶类型和数量进行奖励。具体如下图&#xff1a;假设学生投瓶10个&#xff0c;投瓶类型定义为t&#xff08;0表示塑料瓶&#xff0c;1表示易拉罐&…

如何将文件Copy到Docker镜像中

如何将文件Copy到Docker镜像中 一、使用Dockerfile的COPY指令二、使用Docker CP命令三、使用Docker Volume四、综合应用Docker作为一种轻量级的容器化技术,在软件开发和部署中得到了广泛应用。在使用Docker时,经常需要将本地文件或目录复制到Docker镜像中,以便在容器内部使用…

Figma入门-文字、样式、链接、动作

Figma入门-文字、样式、链接、动作 前言 在之前的工作中&#xff0c;大家的原型图都是使用 Axure 制作的&#xff0c;印象中 Figma 一直是个专业设计软件。 最近&#xff0c;很多产品朋友告诉我&#xff0c;很多原型图都开始用Figma制作了&#xff0c;并且很多组件都是内置的…

shell编程(8) until循环以及函数基本创建调用

声明!!! 学习视频来自B站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章 视频链接&#xff1a;泷羽sec 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 # until循环 脚本代码&#xff1a; i0 until [ ! $i -lt 1…

NVR管理平台EasyNVR多品牌NVR管理工具的流媒体视频融合与汇聚管理方案

随着信息技术的飞速发展&#xff0c;视频监控已经成为现代社会安全管理和业务运营不可或缺的一部分。无论是智慧城市、智能交通、还是大型企业、校园安防&#xff0c;视频监控系统的应用都日益广泛。NVR管理平台EasyNVR&#xff0c;作为功能强大的流媒体服务器软件&#xff0c;…

fastadmin实现站内通知功能

实现效果如下 application/admin/view/common/header.html <style>#notificationMenu {display: none;position: absolute;top: 40px;right: 0;background: #fff;border-radius: 6px;padding: 10px 0;width: 300px;box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);z-inde…

大语言模型---LoRA中损失值的计算

文章目录 概要损失计算流程小结 概要 Llama-7B模型的LoRA微调训练中&#xff0c;通过使用Cross-Entropy Loss来度量模型输出的预测分布和真实标签分布之间的距离&#xff0c;来衡量模型的准确性。 本文主要介绍LoRA中损失值的计算流程。 Cross-Entropy Loss作用&#xff1a;是…