零碎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.mzph.cn/news/887506.shtml

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

相关文章

CentOS8.5.2111(7)完整的Apache综合实验

一、实验目标 1.掌握Linux系统中Apache服务器的安装与配置&#xff1b; 2.掌握个人主页、虚拟目录、基于用户和主机的访问控制及虚拟主机的实现方法。 二、实验要求 练习使用linux系统下WEB服务器的配置方法。 三、实验背景 重庆工程学院为筹备“重庆工程大学”特申请了c…

Cocos编辑器

1、下载 下载地址&#xff1a;https://www.cocos.com/creator-download 2、编辑器界面介绍 官方链接&#xff1a;https://docs.cocos.com/creator/3.8/manual/zh/editor/ 3、项目结构 官方链接&#xff1a;https://docs.cocos.com/creator/3.8/manual/zh/getting-started/…

Easyui 实现订单拆分开票功能

Easyui 实现订单拆分开票功能 需求 1、实现一个订单开具多分发票功能&#xff1b; 2、支持拆行&#xff1b; 3、支持拆数量&#xff1b; 流程设计 1、操作页面展示订订单头信息&#xff0c;订单明细信息 2、点击新增发票按钮弹出一个弹出框用于创建一张拆分发票&#xff0c;弹…

解决 java -jar 报错:xxx.jar 中没有主清单属性

问题复现 在使用 java -jar xxx.jar 命令运行 Java 应用程序时&#xff0c;遇到了以下错误&#xff1a; xxx.jar 中没有主清单属性这个错误表示 JAR 文件缺少必要的启动信息&#xff0c;Java 虚拟机无法找到应用程序的入口点。本文将介绍该错误的原因以及如何通过修改 pom.xm…

推荐一款龙迅HDMI2.0转LVDS芯片 LT6211UX LT6211UXC

龙迅的HDMI2.0转LVDS芯片LT6211UX和LT6211UXC是两款高性能的转换器芯片&#xff0c;它们在功能和应用上有所差异&#xff0c;同时也存在一些共同点。以下是对这两款芯片的详细比较和分析&#xff1a; 一、LT6211UX 主要特性&#xff1a; HDMI2.0至LVDS和MIPI转换器。HDMI2.0输…

flink学习(7)——window

概述 窗口的长度(大小): 决定了要计算最近多长时间的数据 窗口的间隔: 决定了每隔多久计算一次 举例&#xff1a;每隔10min,计算最近24h的热搜词&#xff0c;24小时是长度&#xff0c;每隔10分钟是间隔。 窗口的分类 1、根据window前是否调用keyBy分为键控窗口和非键控窗口…

C语言解析命令行参数

原文地址&#xff1a;C语言解析命令行参数 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 C语言有一个 getopt 函数&#xff0c;可以对命令行进行解析&#xff0c;下面给出一个示例&#xff0c;用的时候可以直接copy过去修改&#xff0c;很方便…

精密工装夹具加工:打造高精度产品

在现代制造业中&#xff0c;精密工装夹具加工扮演着关键角色&#xff0c;是打造高精度产品不可缺少的环节。 精密工装夹具的设计与制造&#xff0c;首先依赖于对加工工艺的深入理解与精准把握。工程师们需要根据待加工产品的形状、尺寸、精度要求以及加工设备的特性&#xff0c…

C++ 优先算法 —— 无重复字符的最长子串(滑动窗口)

目录 题目&#xff1a; 无重复字符的最长子串 1. 题目解析 2. 算法原理 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口&#xff08;同向双指针&#xff09; 3. 代码实现 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口 题目&#xff1a; 无重复字符的最长子串 1. 题目解析 题目截图&#xff1a; 此题所说的…

huggingface使用

import warnings warnings.filterwarnings("ignore") from transformers import pipeline#用人家设计好的流程完成一些简单的任务 classifier pipeline("sentiment-analysis") classifier( [ "Ive been waiting for a HuggingFace cours…

第六届机器人、智能控制与人工智能国际(RICAI 2024)

会议信息 会议时间与地点&#xff1a;2024年12月6-8日&#xff0c;中国南京 会议官网&#xff1a;www.ic-ricai.org &#xff08;点击了解大会参会等详细内容&#xff09; 会议简介 第六届机器人、智能控制与人工智能国际学术会议&#xff08;RICAI 2024&#xff09;将于20…

【设计模式】创建型模式之单例模式(饿汉式 懒汉式 Golang实现)

定义 一个类只允许创建一个对象或实例&#xff0c;而且自行实例化并向整个系统提供该实例&#xff0c;这个类就是一个单例类&#xff0c;它提供全局访问的方法。这种设计模式叫单例设计模式&#xff0c;简称单例模式。 单例模式的要点&#xff1a; 某个类只能有一个实例必须…

C++11特性(详解)

目录 1.C11简介 2.列表初始化 3.声明 1.auto 2.decltype 3.nullptr 4.范围for循环 5.智能指针 6.STL的一些变化 7.右值引用和移动语义 1.左值引用和右值引用 2.左值引用和右值引用的比较 3.右值引用的使用场景和意义 4.右值引用引用左值及其一些更深入的使用场景分…

C++-右值引用和移动构造

目录 1. 两种引用方式: 1.1 左值引用&#xff1a; 1.2右值引用 1.3如何判断左右值&#xff1a; 1.4左值引用与右值引用比较 2. 浅拷贝、深拷贝 3.1右值引用的意义&#xff1a; 函数参数传递 函数返还值传递 万能引用 引用折叠 完美转发 std::forward &#x1f33c;&…

新能源汽车充电插口类型识别-YOLO标记,可识别Type1,ccs2的充电标准

前言: CCS标准定义的Type-2 CCS汽车充电端口&#xff0c;右侧装有直流充电枪的插头。汽车的充电端口设计巧妙地将交流部分&#xff08;上半部分&#xff09;与直流部分&#xff08;下半部分的两个粗大的接口&#xff09;集于一体。在交流和直流充电过程中&#xff0c;电动汽车…

Pytest使用Jpype调用jar包报错:Windows fatal exception: access violation

问题描述 ​   之前我们有讲过如何使用Jpype调用jar包&#xff0c;在成功调用jar包后&#xff0c;接着在Pytest框架下编写自动测试用例。但是在Pytest下使用Jpype加载jar包&#xff0c;并调用其中的方法会以下提示信息&#xff1a; ​   虽然提示信息显示有Windows显示致命…

Netty基本原理

目录 前言 原生NIO VS Netty 原生NIO存在的问题 Netty的优点 线程模型 传统阻塞 I/O (Blocking I/O) 2. 非阻塞 I/O (Non-blocking I/O) 3. 多路复用 I/O (Multiplexed I/O) 4. Reactor 模式 常见的 Reactor 模式的变体&#xff1a; Netty线程模型 工作原理 前言 N…

MySQL系列之数据类型(Numeric)

导览 前言一、数值类型综述二、数值类型详解1. NUMERIC1.1 UNSIGNED或SIGNED1.2 数据类型划分 2. Integer类型取值和存储要求3. Fixed-Point类型取值和存储要求4. Floating-Point类型取值和存储要求 结语精彩回放 前言 MySQL系列最近三篇均关注了和我们日常工作或学习密切相关…

一学就废|Python基础碎片,格式化F-string

Python 3.6 中引入了 f-string语法&#xff0c;提供了一种简洁直观的方法来将表达式和变量直接嵌入到字符串中进行字符串格式化&#xff0c;f -string背后的想法是使字符串插值更简单。 要创建 f -string&#xff0c;在字符串前加上字母 “f”即可&#xff0c;与字符串本身的格…

在 Mac(ARM 架构)上安装 JDK 8 环境

文章目录 步骤 1&#xff1a;检查系统版本步骤 2&#xff1a;下载支持 ARM 的 JDK 8步骤 3&#xff1a;安装 JDK步骤 4&#xff1a;配置环境变量步骤 5&#xff1a;验证安装步骤 6&#xff1a;注意事项步骤7&#xff1a;查看Java的安装路径 在 Mac&#xff08;ARM 架构&#xf…