Java代码一键生成神器,支持Jpa/Mybatis/plus多种ORM框架,亲测好用

2023-11-01

2023年08月11日重磅升级:
首页

点击访问

Java代码生成神器】自动化生成Java实体类、代码、增删改查功能!
今天给大家介绍一款绝对让你惊艳的Java代码生成器!这款神器可以支持输入json、sql和Java实体类,自动识别语言类型,并生成对应的Java实体类和Java代码,包含完整的增删改查功能!

代码生成

是不是觉得写Java代码很繁琐?有了这个神器,一切都变得轻松起来!你可以自由配置高级选项,指定要生成的字段,是否集成Lombok和Swagger等常用库,一键生成,省去了大量时间和精力!

高级选项

除此之外,这个代码生成器还支持多种语言类型,不管你是前端工程师还是后端开发者,都能轻松转换各种语言,让你的项目更加高效、稳定!

让你的编程之路更加顺畅,不再为写代码而烦恼!
快来试试吧!访问地址:http://119.29.247.153(域名正在办理中)

以下为原文:
一款支持多种ORM框架的Java代码生成器,基于模板引擎实现,具有非常高的自由度,可随意修改为适合你的代码风格
支持JPA、Mybatis、MybatisPlus等ORM框架

项目地址在文章末尾

界面展示:在这里插入图片描述
在这里插入图片描述

关键代码:

 package com.dwp.codegenerator.utils;

import com.dwp.codegenerator.domain.ColumnEntity;
import com.dwp.codegenerator.domain.DatabaseColumn;
import com.dwp.codegenerator.domain.GeneratorParams;
import com.dwp.codegenerator.domain.TableEntity;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.WordUtils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class GeneratorUtil {

    /**
     * 生成代码
     *
     * @param generatorParams
     * @param zip
     */
    public static void generatorCode(GeneratorParams generatorParams, ZipOutputStream zip) {
        //参数处理
        TableEntity tableEntity = formatParams(generatorParams);
        //设置velocity资源加载器
        initVelocity();
        //封装模板数据
        VelocityContext context = getVelocityContext(generatorParams, tableEntity);
        //渲染模板
        apply(context, zip, tableEntity, generatorParams);
    }

    private static void apply(VelocityContext context, ZipOutputStream zip, TableEntity tableEntity, GeneratorParams generatorParams) {
        List<String> templates = getTemplates(generatorParams.getGeneratorType());
        templates.forEach(template -> {
            StringWriter sw = new StringWriter();
            Template tpl = Velocity.getTemplate(template, "UTF-8");
            tpl.merge(context, sw);
            try {
                String fileName = getFileName(template, tableEntity.getUpperClassName(), generatorParams);
                //添加到zip
                zip.putNextEntry(new ZipEntry(fileName));
                IOUtils.write(sw.toString(), zip, "UTF-8");
                IOUtils.closeQuietly(sw);
                zip.closeEntry();
            } catch (IOException e) {
                throw new RuntimeException("渲染模板失败,表名:" + tableEntity.getTableName(), e);
            }
        });
    }

    /**
     * 使用自定义模板
     *
     * @param generatorType
     * @return
     */
    private static List<String> getTemplates(String generatorType) {
        List<String> templates = new ArrayList<>();
        switch (generatorType) {
            case "jpa":
                templates.add("template/jpa/Repository.java.vm");
                templates.add("template/jpa/Specifications.java.vm");
                templates.add("template/jpa/Service.java.vm");
                templates.add("template/jpa/Controller.java.vm");
                templates.add("template/jpa/Domain.java.vm");
                break;
            case "mybatis":
                templates.add("template/mybatis/Mapper.java.vm");
                templates.add("template/mybatis/Mapper.xml.vm");
                templates.add("template/mybatis/Service.java.vm");
                templates.add("template/mybatis/ServiceImpl.java.vm");
                templates.add("template/mybatis/Controller.java.vm");
                templates.add("template/mybatis/Entity.java.vm");
                templates.add("template/mybatis/EntityParam.java.vm");
                templates.add("template/mybatis/PageResult.java.vm");
                templates.add("template/mybatis/RestResp.java.vm");
                break;
            case "mybatis-plus":
                templates.add("template/mybatis-plus/Mapper.java.vm");
                templates.add("template/mybatis-plus/Mapper.xml.vm");
                templates.add("template/mybatis-plus/Service.java.vm");
                templates.add("template/mybatis-plus/ServiceImpl.java.vm");
                templates.add("template/mybatis-plus/Controller.java.vm");
                templates.add("template/mybatis-plus/Entity.java.vm");
                templates.add("template/mybatis-plus/EntityParam.java.vm");
                templates.add("template/mybatis-plus/PageResult.java.vm");
                templates.add("template/mybatis-plus/RestResp.java.vm");
                break;
        }
        return templates;
    }


    private static String getPackagePath(GeneratorParams generatorParams) {
        //配置信息
        Configuration config = getConfig();
        String packageName = StringUtils.isNotBlank(generatorParams.getPackageName())
                ? generatorParams.getPackageName()
                : config.getString("package");
        String moduleName = StringUtils.isNotBlank(generatorParams.getModuleName())
                ? generatorParams.getModuleName()
                : config.getString("moduleName");
        String packagePath = "main" + File.separator + "java" + File.separator;
        if (StringUtils.isNotBlank(packageName)) {
            packagePath += packageName.replace(".", File.separator) + File.separator + moduleName + File.separator;
        }
        return packagePath;
    }

    private static VelocityContext getVelocityContext(GeneratorParams generatorParams, TableEntity tableEntity) {
        Configuration config = getConfig();
        Map<String, Object> map = new HashMap<>();
        map.put("generatorType", generatorParams.getGeneratorType());
        map.put("tableName", tableEntity.getTableName());
        map.put("comments", tableEntity.getComments());
        map.put("pk", tableEntity.getPk());
        map.put("className", tableEntity.getUpperClassName());
        map.put("classname", tableEntity.getLowerClassName());
        map.put("pathName", tableEntity.getLowerClassName().toLowerCase());
        map.put("columns", tableEntity.getColumns());
        map.put("mainPath", StringUtils.isBlank(config.getString("mainPath")) ? "com.dwp" : config.getString("mainPath"));
        map.put("package", StringUtils.isNotBlank(generatorParams.getPackageName()) ? generatorParams.getPackageName() : config.getString("package"));
        map.put("moduleName", StringUtils.isNotBlank(generatorParams.getModuleName()) ? generatorParams.getModuleName() : config.getString("moduleName"));
        map.put("author", StringUtils.isNotBlank(generatorParams.getAuthor()) ? generatorParams.getAuthor() : config.getString("author"));
        map.put("email", config.getString("email"));
        map.put("datetime", DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN));
        VelocityContext context = new VelocityContext(map);
        return context;
    }

    private static void initVelocity() {
        Properties prop = new Properties();
        prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
        Velocity.init(prop);
    }

    /**
     * 表、字段参数处理
     *
     * @param generatorParams
     * @return
     */
    private static TableEntity formatParams(GeneratorParams generatorParams) {
        TableEntity tableEntity = new TableEntity();
        //表信息
        setTableEntity(tableEntity, generatorParams);
        //设置列信息
        setColumns(tableEntity, generatorParams);
        //没主键,则第一个字段为主键
        if (tableEntity.getPk() == null) {
            tableEntity.setPk(tableEntity.getColumns().get(0));
        }
        return tableEntity;
    }

    private static void setColumns(TableEntity tableEntity, GeneratorParams generatorParams) {
        List<ColumnEntity> columnsList = new ArrayList<>();
        for (DatabaseColumn column : generatorParams.getColumns()) {
            ColumnEntity columnEntity = new ColumnEntity();
            columnEntity.setColumnName(column.getColumnName());
            //列名转换成Java属性名
            String attrName = columnToJava(column.getColumnName());
            columnEntity.setUpperAttrName(attrName);
            columnEntity.setLowerAttrName(StringUtils.uncapitalize(attrName));
            columnEntity.setComments(column.getColumnComment());

            //列的数据类型,转换成Java类型
            Configuration config = getConfig();
            String attrType = config.getString(column.getColumnType(), "unknowType");
            columnEntity.setAttrType(attrType);
            //是否主键
            if (column.isPrimary()) {
                tableEntity.setPk(columnEntity);
            }
            columnsList.add(columnEntity);
        }
        tableEntity.setColumns(columnsList);
    }

    private static void setTableEntity(TableEntity tableEntity, GeneratorParams generatorParams) {
        tableEntity.setTableName(generatorParams.getTableName());
        tableEntity.setComments(generatorParams.getTableComment());
        //表名转换成Java类名
        Configuration config = getConfig();
        String className = tableToJava(tableEntity.getTableName(), config.getString("tablePrefix"));
        tableEntity.setUpperClassName(className);
        tableEntity.setLowerClassName(StringUtils.uncapitalize(className));
    }

    /**
     * 列名转换成Java属性名
     */
    private static String columnToJava(String columnName) {
        return WordUtils.capitalizeFully(columnName, new char[]{'_'}).replace("_", "");
    }

    /**
     * 表名转换成Java类名
     */
    private static String tableToJava(String tableName, String tablePrefix) {
        if (StringUtils.isNotBlank(tablePrefix)) {
            tableName = tableName.replaceFirst(tablePrefix, "");
        }
        return columnToJava(tableName);
    }

    /**
     * 获取配置信息
     */
    private static Configuration getConfig() {
        try {
            return new PropertiesConfiguration("generator.properties");
        } catch (ConfigurationException e) {
            throw new RuntimeException("获取配置文件失败,", e);
        }
    }

    /**
     * 获取文件名
     */
    private static String getFileName(String templateName, String className, GeneratorParams generatorParams) {
        String packagePath = getPackagePath(generatorParams);
        if (StringUtils.isNotBlank(templateName)) {
            String afterClassName = templateName.substring(templateName.lastIndexOf("/") + 1, templateName.indexOf("."));
            if (templateName.contains("template/jpa/Specifications.java.vm")) {
                return packagePath + "repository" + File.separator + className + "Specifications.java";
            }
            if (templateName.endsWith("Mapper.xml.vm")) {
                return packagePath + afterClassName.toLowerCase() + File.separator + className + afterClassName + ".xml";
            }
            if (templateName.contains("template/jpa/Domain.java.vm")
                    || templateName.endsWith("Entity.java.vm")) {
                return packagePath + afterClassName.toLowerCase() + File.separator + className + ".java";
            }
            if (templateName.endsWith("EntityParam.java.vm")) {
                return packagePath + "entity/param" + File.separator + className + "Param.java";
            }
            if (templateName.endsWith("ServiceImpl.java.vm")) {
                return packagePath + "service/impl" + File.separator + className + afterClassName + ".java";
            }
            if (templateName.endsWith("PageResult.java.vm")) {
                return packagePath + "util" + File.separator + "PageResult.java";
            }
            if (templateName.endsWith("RestResp.java.vm")) {
                return packagePath + "util" + File.separator + "RestResp.java";
            }
            return packagePath + afterClassName.toLowerCase() + File.separator + className + afterClassName + ".java";
        }
        return null;
    }
}

项目地址:
前端:https://github.com/dengweiping4j/code-generator-ui.git
后端:https://github.com/dengweiping4j/CodeGenerator.git

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java代码一键生成神器,支持Jpa/Mybatis/plus多种ORM框架,亲测好用 的相关文章

随机推荐

  • 以 Nodejs 为例谈谈如何向开源项目贡献

    前一段时间因为兴趣阅读 Nodejs 的 EventEmitter 相关代码的时候 发现了其中的一个 bug 所以修复后向 Nodejs 提了个 pr 同时也想以此次经历为例谈谈如何向开源项目贡献 发现问题 Returns the numb
  • 【JavaScript】你从未如此了解const、let与var

    引言 ES2015 ES6 推出了许多闪亮的新功能 而let和const却是其中非常亮眼的功能 可用于变量声明 那么它们与var有和不同呢 内容速递 看了本文您能了解到的知识 在本文中 我们将讨论var let和const的作用域 用途和变
  • MFC/C++ CFile写入文件数据,输出utf-8的文本。(防止中文乱码)

    需求说明 有时候用CFile写入文件的内容会出现中文乱码问题 这时候就需要把写入的文件编码类型改为utf 8的类型 代码功能 输出utf 8格式的内容到文件中 作者 weekdawn try 创建mht文件 并写入数据 mhtFile Op
  • 第16课:生活中的备忘模式——好记性不如烂笔头

    用程序来模拟生活 从剧情中思考备忘模式 备忘录模式 备忘录模式的模型抽象 类图 代码框架 模型说明 实战应用 应用场景 故事剧情 经过两三年的工作 Tony 学到的东西越来越多 业务也越来越熟 终于到了他该带领一个小组进行独立开发的时候了
  • 21天Jenkins打卡Day16-清理工作空间

    参考文章 http istester com jenkins 447 html
  • 【Python】ftfy 包的理解和使用

    一 介绍 ftfy 是一个用于修复和清理 Unicode 文本的 Python 软件包 它的全称是 fixes text for you 意思是它可以自动检测和纠正常见的 Unicode 文本问题 Unicode 是一种字符编码标准 用于表
  • 样式兼容性的问题。

    这里的所属公司 公司名有时候长 有时候短 要考虑长度问题 高度要写活 让他换行 使用pading 去控制高度
  • 如何快速实现Modbus RTU和Modbus TCP协议转换?

    Modbus协议是工业现场串口设备之间常用的连接方式 其中最常见的就是Modbus RTU和Modbus TCP两种 许多工厂需要将现场各种不同型号设备的数据都能够通过一个上位机软件或者设备触摸屏整合起来监控管理 目前上位机大部分用的Mod
  • element table表格滚动条

    项目场景 table表头过长需要添加滚动条 问题描述 原因 一般情况表头过长 会自动出现滚动条 但是在大型项目开发过程中 有的情况会在总的母版文件中设置禁用滚动条 所以当需要滚动条时 找不到 解决方案 添加css样式 display blo
  • VS中写QT的软件如何输出安装包exe文件

    1 选择Release 和对应的平台 我这里是X64的 2 点击本地Windows调试器 在项目文件当中找到release中找到自己的exe文件 3 复制exe文件到新的文件夹 然后打开对应平台的命令行 我这里是64位的所以要选VS 201
  • 奖励模型Reward Model如何训练?

    image png 如上图所示 ChatGPT 并不是直接让人工去标注每一句话的真实得分是多少 尽管模型最终要预测的就是每句话的得分 而是让人去对 4 句话按照好坏程度进行 排序 通过这个 排序序列 模型将会学习如何为每一个句子进行打分 用
  • Fabric模块功能介绍(一)

    主要有5个模块 分别是peer orderer cryptogen configtxgen configtxlator 模块 功能 peer 主节点模块 负责存储区块链数据 运行维护链码 orderer 交易打包 排序模块 cryptoge
  • python爬虫+数据分析(MySQL)+可视化(echarts,词云)bootstrap前端界面展示

    以下需要一些html css mysql python bootstrap基础 python爬虫 数据分析 准备 在pycharm python的开发环境 需下载 该项目下下载相应需要的包 代码有 import re from bs4 im
  • 在网页中嵌入天气信息

    方式1 在后台通过webservice天气接口信息 比较好自定义和灵活设置但是代码量和复杂度都比较大 方式2 使用js库调用 原始漂亮 但是局限性比较大 方式3 使用一些平台开放的代码 可以直接使用 样式多样 分享 http weather
  • 数据库驱动mysql-connector-java-5.1.46-bin.jar下载及在idea中导入该jar包

    数据库驱动mysql connector java 5 1 46 bin jar下载及在idea中导入该jar包 参考资料 https www cnblogs com bj171104 p 12705567 html https blog
  • Object.setPrototypeOf 与 Object.create() 的区别

    在讲之前 我们先回顾下创建对象的几种方式 并且Object new Object 和 Object create 的区别 字面量方式创建对象 let person name nick 构造函数式创建对象 let person new Obj
  • 【yarn】yarn LocalizedResource 状态机正常执行流程

    1 概述 上一篇文章 Yarn Yarn Service端如何处理客户端提交的任务 在上一篇文章中 我们知道服务器接收到客户端提交的任务之后 会启动多个状态机进行联合操作 最终来解决任务提交之后的全流程 多个状态机合作完成任务 然后我们看了
  • 移植Opencv 1.10到WINCE/WM

    本文来自http blog csdn net hellogv 引用必须注明出处 如何把opencv1 10移植到wince WM 因为如果懂得裁剪opencv 那么就可以在更多设备 PC 手机 开发板 上玩更多更好玩的算法 因此 移植和裁剪
  • Unity小技巧之发射弓箭,弓箭朝向问题

    很多初学的小伙伴 遇到一个问题就是在实例化弓箭或其他物体时 弓箭的朝向会随着人物的转向而改变 例如这样 错误演示 那如何解决呢 只需要将箭的正前方作为添加力的方向代码如下所示 GameObject game Instantiate Reso
  • Java代码一键生成神器,支持Jpa/Mybatis/plus多种ORM框架,亲测好用

    2023年08月11日重磅升级 点击访问 Java代码生成神器 自动化生成Java实体类 代码 增删改查功能 今天给大家介绍一款绝对让你惊艳的Java代码生成器 这款神器可以支持输入json sql和Java实体类 自动识别语言类型 并生成