偷懒神器-->花样的代码生成工具

news2024/12/25 10:12:38

1、CRUD代码生成:
根据MyBatisPlus逆向工程改造而来,添加了showDoc文档生成,数据库脚本生成,增删改查文件生成,Po、Vo、Request对象生成等。普通的增删改查一般搞定。并预调了部份判断逻辑。
在这里插入图片描述
效果示例:

public class AddHandingPortionAdjustLogic implements ContextLogic<HandingPortionAdjustUpdateRequest> {

    @Autowired
    private HandingPortionAdjustMapper handingPortionAdjustMapper;

    @Override
    public void handleContext(HandingPortionAdjustUpdateRequest context) {
        HandingPortionAdjust handingPortionAdjust = context.getForm();
        if (null == handingPortionAdjust ) {
             throw new LocalException("调整记录参数不能为空");
        }
        handingPortionAdjustMapper.insert(handingPortionAdjust );

    }
}

2、Excel导入导出代码生成:
无他,拼字符串拼成文件,哈哈。

public class ExcelGenUtil {

    private final static Class<?> aClass = CppccMemberBackup.class;

    public static void main(String[] args) {
        String name = ZYStrUtils.firstLowerCase(aClass.getSimpleName());
        String supperName = ZYStrUtils.firstUpperCase(name);
        GenParam genParam = new GenParam();
        genParam.setAuthor("simple");
        genParam.setFileBaseDir("D:\\codeGen");
        genParam.setResponseFileName("用户");
        genParam.setExcelEntityPackageName("com.xxx.module.user.logics." + name + ".excel");
        genParam.setMapperPackageName("com.xxx.module.user.mapper." + supperName + "Mapper");
        genParam.setRequestPackageName("com.xxx.module.user.logics." + name + ".request." + supperName + "SelectRequest");
        genParam.setAClass(aClass);
        Generator.gen(genParam);
    }
}
  public static void gen(GenParam genParam) {
        ExcelExportGenerator.generateExcelModel(genParam);
        ExcelImportGenerator.generateExcelModel(genParam);
        ExcelExportModelGenerator.generateExcelModel(genParam);
        ExcelImportModelGenerator.generateExcelModel(genParam);
        System.out.println("生成完毕");
    }

在这里插入图片描述

3、脚本生成:
无他,拼字符串也。哈哈

    public static String INSERT_SQL = "INSERT INTO xxx (id,table_id,join_table_id,column_name,column_comment,column_type,column_places,java_name,is_show,show_width,is_query,is_querydefault,dict_type)" +
            "VALUES ('%s_%s','%s','','%s','%s','%s','column_places','%s',0,100,0,0,'%s');";

    public static void main(String[] args) {
    tableIds="xxx";
        String properties = "name";
        String propertiesName = "xx名称";
        String propertiesType = "string";
        String dictType = "";
        List<String> tableIdList = ZYListUtils.str2List(tableIds);

        List<String> sqls = new ArrayList<>();
        for (String tableId : tableIdList) {
            sqls.add(buildSql(tableId, properties, propertiesName, propertiesType, dictType));
        }
        String now = ZYDateUtils.formart(new Date(), "yyyy-MM-dd-HH-mm-ss");
        ZYFileUtils.writeLines(sqls, "D://form_coustom_sql" + now + ".sql", "UTF-8", true);
    }

    private static String buildSql(String tableId, String properties, String columnName, String type, String dictType) {
        String column = ZYStrUtils.camelToUnderline(properties);
        return String.format(INSERT_SQL, tableId, column, tableId, column, columnName, type, properties, dictType);
    }
}

4、get set this 代码生成:
无他,拼字符串尔,哈哈

public static <T> void writeSomeEasy(Class<T> clst, WriteType writeType) {
        Field[] declaredFields = clst.getDeclaredFields();
        StringBuilder sb = new StringBuilder();
        String clasName = clst.getSimpleName();
        String newObj = clasName + " " + ZYStrUtils.firstLowerCase(clasName) + "= new " + clasName + "();";
        sb.append(newObj).append("\r\n");
        for (Field field : declaredFields) {
            String fieldName = field.getName();
            if ("serialVersionUID".equals(fieldName)) {
                continue;
            }
            String objectName = ZYStrUtils.firstLowerCase(clst.getSimpleName());
            String simpleName = field.getType().getSimpleName();
            String text = getTestByFields(writeType, fieldName, simpleName, objectName);
            sb.append(text).append("\r\n");
        }
        System.out.println(sb.toString());
    }

    private static String getTestByFields(WriteType writeType, String fieldName, String typeName, String key) {
        switch (writeType) {
            case doc_param:
                // |id|否|string|id|
                return "|" + fieldName + " |否  |" + typeName + " |" + fieldName + "   |";
            case doc_result:
                // |id|string|id|
                return "|" + fieldName + " |" + typeName + "   |" + fieldName + " |";
            case str_json_get_str:
                // String id=model.getString("id");
                return "String " + fieldName + "= " + key + ".getString(\"" + fieldName + "\");";
            case set_model:
                // model.setId(id);
                return key + ".set" + ZYStrUtils.firstUpperCase(fieldName) + "(" + fieldName + ");";
            case set_model_withmap:
                // model.setId(id);
                return key + ".set" + ZYStrUtils.firstUpperCase(fieldName) + "(importMap.getString(\"\"));";
            case get_set:
                // model.setId(model.getId());
                return key + ".set" + ZYStrUtils.firstUpperCase(fieldName) + "(" + key + ".get"
                        + ZYStrUtils.firstUpperCase(fieldName) + "());";
            case this_get_set:
                // model.setId(this.id);
                return key + ".set" + ZYStrUtils.firstUpperCase(fieldName) + "(this." + fieldName + ");";
            case this_set:
                // this.id=model.getId();
                return "this." + fieldName + "=" + key + ".get" + ZYStrUtils.firstUpperCase(fieldName) + "();";
            case type_get:
                // String id=model.getId();
                return typeName + " " + fieldName + " = " + key + "." + "get" + ZYStrUtils.firstUpperCase(fieldName)
                        + "();";
            default:
                break;
        }
        return null;
    }

    public static enum WriteType {
        doc_param, doc_result, str_json_get_str, set_model, get_set, this_get_set, this_set, type_get, set_model_withmap,
        url_param;
    }

5、ShowDoc文档生成
无他,拼字符串尔,哈哈

    public static void toJsonParam(Class<?> oneClass) throws Exception {
        Map<String, Field> fieldMap = ZYReflectUtils.getFieldMap(oneClass);
        Map<String, String> map = new HashMap<>();
        fieldMap.forEach((name, field) -> {
            final ColumnName columnName = field.getAnnotation(ColumnName.class);
            String desc = null != columnName ? columnName.value() : field.getName();
            map.put(field.getName(), desc + "#(" + field.getType().getSimpleName() + ")");
        });
        String string = JSONObject.toJSONString(map);
        System.out.println(string);
    }

    //|groupid |int   |用户组id,1:超级管理员;2:普通用户  |
    public static void toShowDocResult(Class<?> oneClass) throws Exception {
        Map<String, Field> fieldMap = ZYReflectUtils.getFieldMap(oneClass);
        fieldMap.forEach((name, field) -> {
            final ColumnName columnName = field.getAnnotation(ColumnName.class);
            String desc = null != columnName ? columnName.value() : field.getName();
            String doc = "|%s |%s|%s|";
            String format = String.format(doc, name, field.getType().getSimpleName(), desc);
            System.out.println(format);
        });
    }
}

6、项目文档需要采集数千行源代码。需要一个个文件打开复制的解决办法

public class CollectCodeDemo {

    public static void main(String[] args) {
        // 工程目录
        String dir = "D:\\javacode\\xxx\\xxx\\module-consult\\future-module-consult-service";
        // 需要的代码行数
        String outDir = "D:\\doc\\code.txt";
        projectCodeCollect(dir, 5000, outDir);


    }

    @SneakyThrows
    public static void projectCodeCollect(String dir, int line, String outDir) {
        List<String> contents = new ArrayList<>();
        projectCodeCollect(contents, new File(dir), line);
        ZYFileUtils.writeLines(contents, new File(outDir), "UTF-8", true);
    }

    private static void projectCodeCollect(List<String> contents, File dir, int line) {
        if (contents.size() >= line) {
            return;
        }
        File[] files = dir.listFiles();
        if (null == files || files.length == 0) {
            return;
        }

        for (File fileItem : files) {
            if (fileItem.isDirectory()) {
                projectCodeCollect(contents, fileItem, line);
            } else {
                String name = fileItem.getName();
                if (!name.endsWith(".java")) {
                    continue;
                }
                try (FileInputStream fileInputStream = new FileInputStream(fileItem)) {
                    List<String> lines = IOUtils.readLines(fileInputStream, "UTF-8");
                    contents.addAll(lines);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

除去MybatisPlus逆向工程需要掌屋一些velocity或freemarker的部份语法外。其他生成工具基本都是拼接字符串生成java或其他类型文档。不是很难。关键是思路问题。当一件事件具备有规律可循、大量、重复、费时、体力劳动时,就要思考会不会有更简单的办法。有的程序员早九晚五下班,有的程序员天天加班,这就是差距。人家输入几个参数生成一大堆模板文件。随便改改套套,OK搞定。有的重复着大量的体力劳动。一行一行写脚本,一个个字母写文件。仅以此文为引子。提供一种让工作更轻松,少加班的思路。

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

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

相关文章

0801|IO进程线程day4 文件IO函数-目录相关函数

1&#xff09;opendir 功能&#xff1a;打开一个目录文件; 原型&#xff1a; #include <sys/types.h>#include <dirent.h>DIR *opendir(const char *name); 参数&#xff1a; char *name&#xff1a;指定要打开的目录的路径以及名字; 返回值&#xff1a; 成功&…

OpenCV实战:从图像处理到深度学习的全面指南

文章目录 1. OpenCV简介什么是OpenCV&#xff1f;OpenCV的历史与发展OpenCV的应用领域 2. OpenCV的安装与配置OpenCV在Windows系统下的安装OpenCV在Linux系统下的安装OpenCV在Mac OS系统下的安装配置Python环境使用OpenCV 3. OpenCV基础图像的载入、显示和保存图像的基础操作图…

java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis em

&#xfeff; 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据…

linux(一)-----osi七层模型

1.七层模型的定义 1&#xff09;物理层 &#xff08;指的是网卡&#xff0c;网线等物理层面的硬件&#xff09; 2&#xff09;数据链路层 前两层可以概括为物理链路层&#xff0c;以二进制的数据形式在物理媒介上进行传输数据&#xff08;传输协议ISO2100协议&#xff09; …

微信小程序 - 解析富文本插件版们

一、html2wxml 插件版 https://gitee.com/qwqoffice/html2wxml 申请使用注意事项 插件版本解析服务是由 QwqOffice 完成&#xff0c;存在不稳定因素&#xff0c;如对稳定性有很高的要求&#xff0c;请自行搭建解析服务&#xff0c;或在自家服务器上直接完成解析。对于有关插…

SCI论文的发文的模板(Elsevier,MDPI,IEEE)

不同的SCI期刊都有自己的出版商&#xff0c;不同的出版商有不同的发文格式。 最简单的方式就是去查官网上面&#xff0c;常用的期刊格式如下。到对应的位置下载模板即可&#xff0c;推荐使用latex。 MDPI MDPI | Preparing Manuscripts in LaTeX Elsevier Guide for authors …

P3373 【模板】线段树 2(乘法与加法)(内附封面)

【模板】线段树 2 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面三种操作&#xff1a; 将某区间每一个数乘上 x x x&#xff1b;将某区间每一个数加上 x x x&#xff1b;求出某区间每一个数的和。 输入格式 第一行包含三个整数 n , q , m n,q,m n,…

【多线程初阶】多线程案例之单例模式

文章目录 前言1. 什么是单例模式2. 饿汉模式3. 懒汉模式 --- 单线程版4. 懒汉模式 --- 多线程版5. 懒汉模式 --- 多线程改进版总结 前言 本文主要给大家讲解多线程的一个重要案例 — 单例模式. 关注收藏, 开始学习吧&#x1f9d0; 1. 什么是单例模式 单例模式是一种很经典的…

数据结构-二叉树

数据结构-二叉树 二叉树的概念二叉树的遍历分类 建立二叉树&#xff0c;并遍历二叉树的最小单元二叉树的最小单元初始化初始化二叉树前序遍历的实现中序遍历的实现后序遍历的实现计算节点的个数计算树的深度求第k层的个数查找二叉树的元素分层遍历 全部代码如下 二叉树的概念 二…

MySQL数据库服务器安装与配置(步骤简单详细,看完可学会下载MySQL所有版本)

目录 引言 一&#xff0c;5.6.51数据库服务器下载 二&#xff0c;8.1.0最新版数据库服务器下载 三&#xff0c;MySQL客户端下载 引言 个人认为MySQl数据库目前推荐的两个版本系列为5.6.51和8.系列。 至于我们为什么要下载两个版本呢&#xff1f;是因为官方在数据库下载的结构…

C++:STL的引入和string类

文章目录 STLSTL是什么STL的六大组件 stringstring类内成员函数迭代器 STL STL是什么 什么是STL&#xff1f;STL是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 STL的六大组件 要学一个新知识&#xf…

微信小程序 - scroll-view组件之上拉加载下拉刷新(解决上拉加载不触发)

前言 最近在做微信小程序项目中&#xff0c;有一个功能就是做一个商品列表分页限流然后实现上拉加载下拉刷新功能&#xff0c;遇到了一个使用scroll-viwe组件下拉刷新事件始终不触发问题&#xff0c;网上很多说给scroll-view设置一个高度啥的就可以解决&#xff0c;有些人设置了…

嵌入式软件开发有没有捷径

嵌入式软件开发有没有什么捷径&#xff1f;不定期会收到类似的问题&#xff0c;我只想说&#xff1a;嵌入式软件开发没有捷径 说实话&#xff0c;有这种想法的人&#xff0c;我其实想劝你放弃。对于绝大多数普通人&#xff0c;一步一个脚印就是捷径。 当然&#xff0c;这个问题…

若依(RuoYi)系统添加自定义的模块

RuoYi系统是干什么用的,这里不过多说明了,自己搜一下,其提供的功能己经基本满足了一些简单的系统应用,如果想进行二次开发的小伙伴,可能会想仅仅用Ruoyi的后台权限管理,但是业务功能想进行自定义,可以借鉴一下本文。我们用的是前后端分离版 一、前端的自定义模块 其实在…

Drools用户手册翻译——第四章 Drools规则引擎(九)Phreak算法

这个地方我是先了解了Rete算法&#xff0c;才来看得这一部分&#xff0c;结果发现好像没有什么用......完全不知道讲的什么&#xff0c;估计之后在用的时候慢慢会明白。 RETE算法笔记&#xff1a;http://t.csdn.cn/iNZ8V 甩锅声明&#xff1a;本人英语一般&#xff0c;翻译只…

二叉树的最近公共祖先,二叉搜索树的最近公共祖先(同一个思路)

题目链接   二叉树的最近公共祖先   给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。   百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可…

GD32F103输入捕获

GD32F103输入捕获程序&#xff0c;经过多次测试&#xff0c;终于完成了。本程序将TIMER2_CH2通道映射到PB0引脚&#xff0c;捕获PB0引脚低电平脉冲时间宽度。PB0是一个按钮&#xff0c;第1次按下采集一个值保存到TIMER2_CountValue1中&#xff0c;第2次按下采集一个值保存到TIM…

如何使jwt生成的 token在用户登出之后失效?

问题1:如何使jwt生成的 token在用户登出之后失效? 由于jwt生成的token是无状态的,这体现在我们在每一次请求时 request都会新建一个session对象: 举个例子: @PostMapping(value = "/authentication/logout") public ResponseEntity<BaseResult> logOut(Htt…

第十次CCF计算机软件能力认证

第一题&#xff1a;分蛋糕 小明今天生日&#xff0c;他有 n 块蛋糕要分给朋友们吃&#xff0c;这 n 块蛋糕&#xff08;编号为 1 到 n&#xff09;的重量分别为 a1,a2,…,an。 小明想分给每个朋友至少重量为 k 的蛋糕。 小明的朋友们已经排好队准备领蛋糕&#xff0c;对于每个朋…

Spring之浅谈AOP技术

前言 AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程&#xff09;&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结构。 OOP&#xff08;Object Oriented Programming&#xff09;面向对象编程 AOP和OOP一样都是一种编程思想&#xff0c…