springboot mybatis-plus 代码生成工具

news2024/11/8 11:09:50

介绍

基于mybatis-plus代码生成工具
后续会不断完善

规划

后续会基于此功能搞低代码平台,会有前端VUE

mybatis-plus介绍&特性

• 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
• 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
• 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
• 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
• 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
• 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
• 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
• 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
• 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
• 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
• 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
• 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

代码生成

  • 自定义模版
  • 生成内容
    controller/entity/dto/vo/convertor/service/serviceImpl/dao/mapper

功能说明

基于模版生成,模版在templates下
restful接口和基础功能实现
service服务实现和基础功能实现
entity/dto/vo/convertor,不同传输对象和转化
使用分页插件
使用逻辑删除标识

使用说明

CodeGeneration,直接执行即可
如需要做个性化配置,则自己改即可

测试类

测试sql在resources/sql/test.sql
查看TestGeneration.http实现

模块结构

在这里插入图片描述

CodeGeneration 代码

package org.lwd.microservice.boot.generation;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.keywords.MySqlKeyWordsHandler;
import org.lwd.microservice.boot.generation.engine.EnhanceFreemarkerTemplateEngine;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.INTEGER;

/**
 * @author weidong
 * @version V1.0.0
 * @description
 * @since 2023/5/26
 */
public class CodeGeneration {
    public static void main(String[] args) {

        String projectPath = System.getProperty("user.dir")+"/microservice-boot-middle/microservice-boot-middle-generation"; //获取项目路径
        String outerFilePath = projectPath + "/src/main/java";  //java下的文件路径
        String tempFilePath = projectPath + "/src/main/resources";
        String packageName = "org.lwd.microservice.boot.generation";

        System.out.println(projectPath);
        FastAutoGenerator.create(
                new DataSourceConfig.Builder("jdbc:mysql://" + "127.0.0.1:3306/test", "root", "123456")
                    .dbQuery(new MySqlQuery())
                    .typeConvert(new MySqlTypeConvert() {
                        @Override
                        public IColumnType processTypeConvert(GlobalConfig config, String fieldType) {
                            if (fieldType.toLowerCase().contains("tinyint")) {
                                return INTEGER;
                            }
                            return super.processTypeConvert(config, fieldType);
                        }
                    })
                    .keyWordsHandler(new MySqlKeyWordsHandler()))
                //全局配置
                .globalConfig(builder -> {
                    builder.outputDir(outerFilePath)//生成的输出路径
                            .author("lwd")//生成的作者名字
                            //.enableSwagger()开启swagger,需要添加swagger依赖并配置
                            .dateType(DateType.ONLY_DATE)//时间策略
                            .commentDate("yyyy-MM-dd")//格式化时间格式
                            .disableOpenDir();//禁止打开输出目录,默认false
                })
                //包配置
                .packageConfig(builder -> {
                    builder.entity("entity")//实体类包名
                            .parent(packageName)//父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名
                            .controller("controller")//控制层包名
                            .mapper("dao")//mapper层包名
                            .xml("mapper.xml")//数据访问层xml包名
                            .service("service")//service层包名
                            .serviceImpl("service.impl")//service实现类包名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, projectPath + "/src/main/resources/mapper")); //路径配置信息,就是配置各个文件模板的路径信息,这里以mapper.xml为例
                })
                //模版配置
                .templateConfig(builder -> {
//                    builder.disable()//禁用所有模板
//                    builder.disable(TemplateType.ENTITY)
                    builder.service("templates/service.java")//service模板路径
                    .serviceImpl("templates/serviceImpl.java")//实现类模板路径
//                .mapper("templates/mapper.java")//mapper模板路径
//                .mapperXml("/templates/mapper.xml")//xml文件模板路路径
                    .controller("templates/controller.java"); //controller层模板路径
                }).templateEngine(new FreemarkerTemplateEngine())
                .injectionConfig(consumer -> {
                    Map<String, String> customFile = new HashMap<>();
                    // DTO 下面的key会作为类名后缀,进而生成新类
                    customFile.put("DTO.java", "templates/other/dto.java.ftl");
                    customFile.put("VO.java", "templates/other/vo.java.ftl");
                    customFile.put("Convertor.java", "templates/other/convertor.java.ftl");
                    consumer.customFile(customFile);
                }).templateEngine(new EnhanceFreemarkerTemplateEngine())
                // EnhanceFreemarkerTemplateEngine 里主要重写对自定义类的处理 如vo dto convert等
                //策略配置开始
                .strategyConfig(builder -> {
                    builder.enableCapitalMode()//开启全局大写命名
                            //.likeTable()模糊表匹配
                            .addInclude("t_friendly_link")//添加表匹配,指定要生成的数据表名,不写默认选定数据库所有表
                            //.disableSqlFilter()禁用sql过滤:默认(不使用该方法)true
                            //.enableSchema()启用schema:默认false
                            .addTablePrefix("t_")//增加过滤表前缀
                            .entityBuilder() //实体策略配置
                            //.disableSerialVersionUID()禁用生成SerialVersionUID:默认true
                            .enableChainModel()//开启链式模型
                            .enableLombok()//开启lombok
                            .enableRemoveIsPrefix()//开启 Boolean 类型字段移除 is 前缀
                            .enableTableFieldAnnotation()//开启生成实体时生成字段注解
                            //.addTableFills()添加表字段填充
                            .naming(NamingStrategy.underline_to_camel)//数据表映射实体命名策略:默认下划线转驼峰underline_to_camel
                            .columnNaming(NamingStrategy.underline_to_camel)//表字段映射实体属性命名规则:默认null,不指定按照naming执行
                            .idType(IdType.AUTO)//添加全局主键类型
                            .formatFileName("%s")//格式化实体名称,%s取消首字母I
                            .logicDeleteColumnName("deleted_tag")//逻辑删除标识

                            .mapperBuilder()//mapper文件策略
                            .enableMapperAnnotation()//开启mapper注解
                            .enableBaseResultMap()//启用xml文件中的BaseResultMap 生成
                            .enableBaseColumnList()//启用xml文件中的BaseColumnList
                            //.cache(缓存类.class)设置缓存实现类
                            .formatMapperFileName("%sMapper")//格式化Dao类名称
                            .formatXmlFileName("%sMapper")//格式化xml文件名称

                            .serviceBuilder()//service文件策略
                            .formatServiceFileName("%sService")//格式化 service 接口文件名称
                            .formatServiceImplFileName("%sServiceImpl")//格式化 service 接口文件名称

                            .controllerBuilder()//控制层策略
                            //.enableHyphenStyle()开启驼峰转连字符,默认:false
                            .enableRestStyle()//开启生成@RestController
                            .formatFileName("%sController");//格式化文件名称
                }).execute();

    }

}

代码地址

https://github.com/OrderDong/microservice-boot
分支:microservice-boot-1.0.1-generator
模块:microservice-boot-middle-generation

外传

😜 原创不易,如若本文能够帮助到您的同学
🎉 支持我:关注我+点赞👍+收藏⭐️
📝 留言:探讨问题,看到立马回复
💬 格言:己所不欲勿施于人 扬帆起航、游历人生、永不言弃!🔥

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

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

相关文章

【玩转Linux操作】查找命令时间日期指令

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;查找⭐find命令&#x1f388;按文件名&#x1f388…

Mac 远程连接Windows服务器

要从 Mac 电脑远程连接到 Windows 服务器&#xff0c;您可以使用 macOS 上内置的远程桌面连接 (RDC) 客户端。 方法如下&#xff1a; 确保您要连接的 Windows 服务器已启用远程桌面并且可以从您的网络访问。 您可能需要配置服务器的防火墙设置以允许远程桌面连接。 在您的 Ma…

Knife4j的请求示例当中有很多空白行

问题描述&#xff1a; 按正常来说不应该有上方的空白&#xff0c;当然如果只是查看我也不至于非要解决他&#xff0c;主要是假如接口是json传参&#xff0c;调试界面都没办法修改参数…网上相关的资料又非常少&#xff0c;我别的项目引用的同样的依赖并没有出现如此情况。 引入…

Java中泛型的?和T的区别

文章目录 1、前言2、java中泛型&#xff1f;、T2.1、&#xff1f;、T的概念2.2、&#xff1f;、T的用法2.1.1、T用法2.1.2、&#xff1f;用法 2.3、T、&#xff1f;在继承上的体现2.4、有限制通配符2.4.1、? extends A:2.4.2、? super A: 2.5、无限制通配符和有限制通配符的数…

峰会回顾 | 圆桌对话:低代码行业应用激发产业创新势能

编者荐语&#xff1a; 在万应低代码CMO徐智峰的主持下&#xff0c;中铁城建集团信息化管理部技术经理熊杰、中电信数智科技有限公司湖南分公司总经理助理施晓辉、湖南省建筑设计院集团数字科技中心开发部部长母建玉、长沙市规划信息服务中心技术总监尹彦围绕进行了精彩的圆桌对…

电脑监控系统有什么用处?

相信很多企业用户对电脑监控系统并不陌生&#xff0c;该系统存在于我们的日常工作中。我们都知道它会监管在工作时的行为&#xff0c;所以减少了很多摸鱼时间&#xff0c;只能一心工作。除此之外还有其他的很多功能&#xff0c;主要分为四大部分&#xff0c;下面让我们来一起了…

基于HAL库的STM32单定时器多路输入捕获测量PWM的频率和占空比实现(状态机方式实现)

目录 写在前面 先回顾下定时器的单路捕获PWM 多路捕获PWM的频率和占空比&#xff08;状态机实现) 我的思路: 状态图 配置 给出示例代码 测试效果 写在前面 先有了这篇文章实现了单定时器的多通道测量频率&#xff0c;以外部时钟的方式可测量任意频率的方波),奈何不能多路…

教你如何多人播报配音把

你们有没有在日常生活中遇到短视频的配音呢&#xff1f;那你们知不知道多人播报配音呢&#xff1f;其实它就是指通过合成多个不同的声音&#xff0c;实现多人对话或演唱的效果&#xff0c;并且可选择不同的声音和语速进行播报。而且它可以应用在广告宣传、盲人听书、电影动画、…

FPGA实战开发-基于DDR的图像缓存(下)

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 例如&#xff1a; 基于米联科的学习资料&#xff0c;分享和学习同步&#xff0c;欢迎大家一起探讨。 整体架构流程 提示&#xff1a;这里可以添加技术整体架构 例如&#xff1a; image_data_gen产生了测试图片&…

1.1 C++友元函数与友元类

C友元 C中的友元&#xff08;friend&#xff09;是一种特殊的关系&#xff0c;它允许一个非成员函数或非当前类的成员函数访问一个类的私有成员。 具体来说&#xff0c;友元可以是一个函数、一个类或一个整个命名空间。 友元的声明通常在类定义中&#xff0c;它们可以被用来…

100G中长距离光模块,你选对了吗?

随着数据中心的快速发展&#xff0c;100G SR4支持的距离太短且成本又过高&#xff0c;在这种情况下&#xff0c;市场迎来了100G中长距离的解决方案&#xff1a;100G CWDM4和100G PSM4。对于100G中长距离方案选择也是各有千秋&#xff0c;下面就跟着小易来了解如何选择才是最合适…

idea中的快捷键大全, idea常用快捷键

文章目录 前言常用快捷键查找及修改快捷键根据快捷键名称查询根据快捷键查询修改快捷键 快捷键含义Alt/&#xff08;代码提示&#xff09;Ctrl/&#xff08;注释当前行&#xff09;CtrlF&#xff08;在当前文件中搜索&#xff09;CtrlShiftF&#xff08;全局搜索&#xff09;Ct…

自定义View中构造函数相关问题

目录 自定义View时&#xff0c;一个构造函数都不写&#xff0c;行不行&#xff1f;自定义View必须写构造函数&#xff0c;带几个参数&#xff1f; 自定义View时&#xff0c;一个构造函数都不写&#xff0c;行不行&#xff1f; 不行。 编译通不过。会提示&#xff1a; 为什么…

分布式系统概念和设计——复制技术

分布式系统概念和设计 复制 分布式系统中&#xff0c;复制是提高可用性和容错的关键技术。数据复制的技术&#xff0c;在多个计算机中维护数据的副本。复制是一种增强服务的技术。进行复制的动机包括改善服务性能&#xff0c;提高可用性&#xff0c;增强容错能力。 增强性能&…

遥感影像/无人机航片的空间分辨率GSD计算推导

遥感影像/无人机航片的空间分辨率GSD计算推导 参考资料1 参考资料2-地面分辨率&#xff0c;空间分辨率(GSD为地面采样间隔) GSD&#xff1a;无人机/遥感卫星的空间分辨率&#xff0c;指航片/遥感影像一个像素点代表的空间距离。 IFoV&#xff1a;单个像素代表的空间范围。 幅…

STM32开发——感应垃圾桶(舵机、超声波测距、振动检测)

目录 1.项目需求 2.sg90舵机介绍及实战 3.声波测距 4.感应垃圾桶 4.1GPIO口设置 4.2代码实现 1.项目需求 检测靠近时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c;2秒后关盖发生震动时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c;2秒后关盖按下按键时&…

ChatGPT 使用 拓展资料:吴恩达大咖 Building Systems with the ChatGPT API 输出检查

ChatGPT 使用 拓展资料:吴恩达大咖 Building Systems with the ChatGPT API 输出检查 在本视频中,将重点检查系统生成的输出。在向用户展示输出之前检查输出对于确保质量非常重要,提供给他们的响应的相关性和安全性,或者使用自动化或学习如何使用Moderation API。 Moderati…

labview 多位组合成1个字、1个字拆成多位

如果你需要将多位组合成1个字&#xff0c;以及将1个字拆成多位&#xff0c;本文能给你帮助。 在文章最后有下载链接&#xff08;labview 2018平台写的&#xff09; 1.多个布尔量和数字的转换 1.1多个布尔量转换为数字 图1-前面板(多个布尔量转换为数字) …

阿里巴巴内网开源的SpringCloudAlibaba笔记,把微服务玩的出神入化

SpringCloud Alibaba 为什么会出现&#xff1f; Spring Cloud Netflix 项目进入维护模式&#xff0c;Spring Cloud Netflix 将不再开发新的组件&#xff0c;我们知道 Spring Cloud 版本迭代算是比较快的&#xff0c;因而出现了很多中岛的 ISSUE 都来不及 Fix 就又推另一个 Rel…

做开发5年,这8个高效开发好习惯我悟了

优秀的Web开发人员工作效率更高&#xff0c;因为他们拥有丰富的经验和良好的习惯。工作多年&#xff0c;我有一些自己了解的习惯分享给大家&#xff0c;都曾让我受益&#xff0c;做开发5年了&#xff0c;今天来跟大家分享一下我的感想。✍&#x1f3fb; 首先&#xff0c;很多人…