springboot框架使用mybatis-plus3.5.1以下版本的代码生成器工具类

news2024/12/23 23:21:02

我们在使用springboot 框架 和mybatis-plus 开发web项目的时候,像 控制器 这类的文件 有了这个基于mybatis-plus 的 代码生成器 我们就不必自己创建了 ,直接执行后 自动帮我们生成好控制器、服务处、实现层 等等 非常的方便 。

废话不多说,还是直接分享代码生成器的工具类~

package com.jsonl.base.db;


import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.jsonl.base.entities.BaseEntity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;
/**
 * 老代码生成器适用于 3.5.1 以下版本
 * 提醒:
 * 在使用之前 需要把 文件里的 xxx  替换成 自己的com.xxx 的包前缀
 * mysqlIp  改为 自己的数据库 ip 包括账户密码
 * 把 java.vm  模板放到 resources 文件夹下
 * **/
public class CodeGenerator {

    /**
     * <p>
     * 读取控制台内容
     * </p>
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotBlank(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

    public static void Cg() {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        System.out.println(projectPath);
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setOpen(false);
        gc.setSwagger2(true); //实体属性 Swagger2 注解
        mpg.setGlobalConfig(gc);

        String moduleName = scanner("模块名");
        String packageName = scanner("包名");
        String Author = scanner("创建人");
        gc.setAuthor(Author);
        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        String db = scanner("数据库名");
        dsc.setUrl("jdbc:mysql://mysqlIp:3306/" + db + "?useUnicode=true&useSSL=false&characterEncoding=utf8");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("root");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
//        pc.setModuleName(moduleName);
        pc.setParent("");
        pc.setEntity("com.xxx." + packageName + ".entities");
        pc.setService("com.xxx." + packageName + ".service.inteface");
        pc.setServiceImpl("com.xxx." + packageName + ".service.impl");
        pc.setController("com.xxx." + packageName + ".controller");
        pc.setMapper("com.xxx." + packageName + ".mapper");
        HashMap<String, String> pathMap = new HashMap<>();
        pathMap.put(ConstVal.ENTITY, projectPath + "/" + "service/" + moduleName + "/src/main/java/com/xxx/" + packageName + "/entities");
        pathMap.put(ConstVal.SERVICE, projectPath + "/" + "service/" + moduleName + "/src/main/java/com/xxx/" + packageName + "/service/inteface");
        pathMap.put(ConstVal.MAPPER, projectPath + "/" + "service/" + moduleName + "/src/main/java/com/xxx/" + packageName + "/mapper");
        pathMap.put(ConstVal.SERVICE_IMPL, projectPath + "/" + "service/" + moduleName + "/src/main/java/com/xxx/" + packageName + "/service/impl");
        pathMap.put(ConstVal.CONTROLLER, projectPath + "/" + "service/" + moduleName + "/src/main/java/com/xxx/" + packageName + "/controller");
        pc.setPathInfo(pathMap);
        mpg.setPackageInfo(pc);

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };

        String mapperJavaPath = "/templates/mapper.java.vm";
        String entityPath = "/templates/entity.java.vm";
        String servicePath = "/templates/service.java.vm";
        String serviceImplPath = "/templates/serviceImpl.java.vm";
        String controllxxxath = "/templates/controller.java.vm";

        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(entityPath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return projectPath + "/service/" + moduleName + "/src/main/java/com/xxx/" + packageName + "/entities/" + tableInfo.getEntityName() + StringPool.DOT_JAVA;
            }
        });
        focList.add(new FileOutConfig(mapperJavaPath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return projectPath + "/service/" + moduleName + "/src/main/java/com/xxx/" + packageName + "/mapper/" + tableInfo.getMapperName() + StringPool.DOT_JAVA;
            }
        });
        focList.add(new FileOutConfig(servicePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return projectPath + "/service/" + moduleName + "/src/main/java/com/xxx/" + packageName + "/service/inteface/" + tableInfo.getServiceName() + StringPool.DOT_JAVA;
            }
        });
        focList.add(new FileOutConfig(serviceImplPath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return projectPath + "/service/" + moduleName + "/src/main/java/com/xxx/" + packageName + "/service/impl/" + tableInfo.getServiceImplName() + StringPool.DOT_JAVA;
            }
        });
        focList.add(new FileOutConfig(controllxxxath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return projectPath + "/service/" + moduleName + "/src/main/java/com/xxx/" + packageName + "/controller/" + tableInfo.getControllerName() + StringPool.DOT_JAVA;
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.setXml(null);
        mpg.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setSuperEntityClass(BaseEntity.class);
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        strategy.setChainModel(true);

        // 公共父类
        strategy.setSuperControllerClass("com.xxx." + packageName + ".BaseController");
        // 写于父类中的公共字段
        strategy.setSuperEntityColumns("id","created_at","updated_at","is_deleted");
        String[] tables = scanner("表名,多个英文逗号分割").split(",");
        strategy.setInclude(tables);
        strategy.setControllerMappingHyphenStyle(true);
//        String[] prefix = tables[0].split("_");
//        if (prefix.length > 1)
//            strategy.setTablePrefix(prefix[0]);
        strategy.setTablePrefix(moduleName);
        strategy.setEntityTableFieldAnnotationEnable(true);
        mpg.setStrategy(strategy);
//        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();

    }

    public static void main(String[] args) {
        Cg();
    }

//    private static Map<String, String> path = new HashMap() {{
//        put("skeleton", "/service/aaa");
//    }};


}

实际代码生成工具类的实现方式 就是根据 预先写好的 代码模板,然后 生成出来我们想要的代码
像这种 就是代码的模板
在这里插入图片描述

因为模板文件过多 我直接整理好了。配合工具类 一起使用,有需要的小伙伴可用去下载使用~

https://www.wwwoop.com/home/Index/projectInfo?goodsId=32&typeParam=2

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

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

相关文章

价值为王,浅析基础大模型行业应用创新发展新路径

在2024年7月的世界人工智能大会&#xff08;WAIC&#xff09;上&#xff0c;百度董事长兼首席执行官李彦宏关于大模型的演讲引起了广泛关注。他在演讲中强调了大模型应用的重要性&#xff0c;并提出了一个观点&#xff1a;“没有应用的大模型一文不值”。这一观点直指当前人工智…

Linux中部署PostgreSQL保姆级教程

一、版本说明 本文采用的版本号是postgresql-14.4。 官网资源包下载地址&#xff1a;PostgreSQL: File Browser 二、安装前的准备 2.1安装依赖 2.1.1安装编译工具 yum install -y gcc gcc-c这个命令安装了 GNU 编译器集合&#xff08;gcc&#xff09;和 GNU C 编译器&#x…

11月1日笔记(UAC绕过)

Bypass UAC 用户账户控制(User Account Control&#xff0c;UAC)是 Windows 操作系统采用的一种控制机制&#xff0c;可以阻止自动安装未经授权的应用并防止意外更改系统设置&#xff0c;有助于防止恶意软件损坏计算机。用户账户控制使应用程序和任务始终在非管理员账户的安全…

什么是计算机视觉算法?——深度剖析背后的技术与应用

计算机视觉&#xff08;Computer Vision&#xff09;作为人工智能的重要分支&#xff0c;正在逐渐改变我们的生活。从人脸识别到自动驾驶&#xff0c;从医疗影像诊断到视频监控&#xff0c;计算机视觉的应用无处不在&#xff0c;而支撑这一切的正是计算机视觉算法。那么&#x…

客户案例 | Ansys助力Lumotive将设计周期缩短两到三个数量级

“我们使用Ansys Lumerical FDTD、亚马逊云科技&#xff08;AWS&#xff09;和 Python API设计了这种超表面&#xff0c;同时使其与CMOS制造公差兼容。Lumerical的AWS解决方案有助于Lumotive将设计周期缩短两到三个数量级&#xff0c;而且不会增加成本或降低准确性。” —— P…

如何打开/关闭 GitLab 的版本检查功能?

本文分享如何打开/关闭 GitLab 的版本检查功能。 极狐GitLab 是 GitLab 的中国发行版【https://dl.gitlab.cn/ncecn6kb】&#xff0c;中文版本对中国用户更友好&#xff0c;文章以私有化部署的极狐GitLab 实例来演示版本检查功能的开启和关闭。强烈不建议关闭该功能&#xff0…

软件测试学习笔记丨Selenium复用已打开浏览器

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22520 本文为霍格沃兹测试开发学社的学习经历分享&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 说明&#xff1a;本篇博客基于sel…

Java并发常见面试题总结(下)

Map&#xff08;重要&#xff09; HashMap 和 Hashtable 的区别 线程是否安全&#xff1a; HashMap 是非线程安全的&#xff0c;Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。&#xff08;如果你要保证线程安全的话就使用 ConcurrentHashMa…

从比亚迪超越特斯拉,看颠覆全球市场的中国力量

这是比亚迪CEO王传福早年在日本调研电池供应链时发出的感慨。 那时的人们谁也没有想到&#xff0c;比亚迪会从深圳的一家普通的电池供应商开始做起&#xff0c;拼出一条属于自己的“血路”&#xff0c;摇身一变成为名副其实的“电车之王”&#xff0c;并让全球车企仰望。 比亚…

最长方连续方波信号

更多关于刷题的内容欢迎订阅我的专栏华为刷题笔记 该专栏题目包含两部分&#xff1a; 100 分值部分题目 200 分值部分题目 所有题目都会陆续更新&#xff0c;订阅防丢失 题目描述 输入一串方波信号&#xff0c;求取最长的完全连续交替方波信号&#xff0c;并将其输出&#x…

Mac “屏幕保护程序启动或显示器关闭后需要密码“无效

屏幕保护程序启动或显示器关闭后需要密码只能选择“立即”的解决方法&#xff1a; 在 iPhone mirror中设置&#xff0c;每次询问权限。 参考&#xff1a;https://support.apple.com/en-us/120421

Unity自定义数组在Inspector窗口的显示方式

了解 单行高度:EditorGUIUtility.singleLineHeight获取 PropertyField 控件所需的高度:EditorGUI.GetPropertyHeight属性是否在Inspector窗口展开&#xff1a;SerializedProperty.isExpanded可重新排序列表类&#xff1a;ReorderableList绘制纯色矩形&#xff1a;EditorGUI.Dr…

LBPH算法实现人脸匹配

在当今数字化时代&#xff0c;人脸检测技术在众多领域都发挥着至关重要的作用&#xff0c;从安防监控到智能手机的解锁功能等。今天&#xff0c;就让我们深入了解一下其中一种常用的人脸检测方法 ——LBPH&#xff08;Local Binary Patterns Histograms&#xff09;&#xff0c…

遥感图像Trento原始数据集下载

遥感图像Trento原始数据集下载 偶然间在某个项目里发现了Trento的完整数据集&#xff0c;不过那个数据集有些奇怪的小改动 虽然我已经不做遥感方向了&#xff0c;不过当初我找这个数据集也是花了很长时间 于是重新整理了一下&#xff0c;就当是方便后来的研究者使用吧 githu…

洛雪音乐 1.6.1| 全网音乐免费听,附加音源

洛雪音乐汇集了多个平台的音乐资源&#xff0c;让你可以免费播放各种热门音乐。有经典怀旧的老歌&#xff0c;有最近火爆网络的热曲&#xff0c;还有很多原创音乐人发布的最新作品。因触动资本利益&#xff0c;现已转为空壳软件&#xff0c;需要导入音源来使用。功能特点包括&a…

Flutter学习笔记(二)------ 第一个flutter项目

一、Dart语法 dart语法较为简单&#xff0c;学过python和c后发现大同小异。不过多介绍 1.函数可变参数 可以类比*args, **kwargs&#xff0c;与之不同的是dart中&#xff0c;*args **kwargs不能同时存在 void a(int a, [float x, double b0.0]) {//do something... }a(10, …

【项目小技巧】【C++】 Debug 日志输出 调用者的函数名,所在文件名和行号

文章目录 一、先编写好输出日志的函数二、使用宏定义新的函数三、效果展示 一、先编写好输出日志的函数 /*** 输出 Debug 信息* param [message] [debug 信息]* param [fileName] [调用该函数的文件名字]* param [line] [在文件的第几行]**/ void DebugLog(std::string messag…

行业应用 | 克劳斯玛菲磁力换模项目案例分享

包装行业的发展趋势表明&#xff0c;绿色包装和技术创新是未来的重要方向。双色注塑机的应用正好符合这一趋势&#xff0c;因为它能够减少材料使用&#xff0c;提高生产效率&#xff0c;同时生产出更具吸引力和功能性的包装产品。随着技术的进步和市场需求的增长&#xff0c;双…

音视频入门基础:FLV专题(22)——FFmpeg源码中,获取FLV文件音频信息的实现(中)

本文接着《音视频入门基础&#xff1a;FLV专题&#xff08;21&#xff09;——FFmpeg源码中&#xff0c;获取FLV文件音频信息的实现&#xff08;上&#xff09;》&#xff0c;继续讲解FFmpeg获取FLV文件的音频信息到底是从哪个地方获取的。本文的一级标题从“四”开始。 四、音…

Hudi Upsert原理

1. 前言 如果要深入了解Apache Hudi技术的应用或是性能调优&#xff0c;那么明白源码中的原理对我们会有很大的帮助。Upsert是Apache Hudi的核心功能之一&#xff0c;主要完成增量数据在HDFS/对象存储上的修改&#xff0c;并可以支持事务。而在Hive中修改数据需要重新分区或重…