Java代码生成器,一键在线生成,支持自定义模板

【Java代码生成神器】自动化生成Java实体类、代码、增删改查功能!点击访问

推荐一个自己每天都在用的Java代码生成器!这个网站支持在线生成Java代码,包含完整的Controller\Service\Entity\Dao代码,完整的增删改查功能!

还可以自定义自己的代码模板、自由配置高级选项,指定是否集成Lombok和Swagger等常用库,一键生成,省去了大量时间和精力!
快来试试吧!在线地址
在这里插入图片描述

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

以下为开源版本
源码:

  • 前端:https://github.com/dengweiping4j/code-generator-ui.git
  • 后端:https://github.com/dengweiping4j/CodeGenerator.git

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

关键代码:

 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);//添加到zipzip.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

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

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

相关文章

虾皮买手号怎么弄的

想要拥有虾皮买手号&#xff0c;可以使用shopee买家通系统进行自动化注册&#xff0c;这款软件目前支持菲律宾、泰国、马来西亚、越南、巴西、印度尼西亚等国家使用。 软件注册流程简单方便&#xff0c;首先我们需要先准备好手机号&#xff0c;因为现在注册虾皮买家号基本上都是…

学习.NET验证模块FluentValidation的基本用法(续3:ASP.NET Core中的调用方式)

FluentValidation模块支持在ASP.NET Core项目中进行手工或自动验证&#xff0c;主要验证方式包括以下三种&#xff1a;   1&#xff09;手工注册验证类&#xff0c;并在控制器或其它模块中调用验证&#xff1b;   2&#xff09;基于ASP.NET验证管道&#xff08;validation …

COMP2121 Discrete Mathematics

COMP2121 Discrete Mathematics 需要可WeChat: zh6-86

Java 注解在 Android 中的使用场景

Java 元注解有 5 种&#xff0c;常用的是 Target 和 Retention 两个。 其中 Retention 表示保留级别&#xff0c;有三种&#xff1a; RetentionPolicy.SOURCE - 标记的注解仅保留在源码级别中&#xff0c;并被编译器忽略RetentionPolicy.CLASS - 标记的注解在编译时由编译器保…

【C++高阶(五)】哈希思想--哈希表哈希桶

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 哈希结构 1. 前言2. unordered系列容器3. 哈希概…

EM32DX-C1【分布式io】

1设备类型&#xff1a; 电压&#xff1a;DC24V 输入16点 输出16点雷赛 EM32DX-C1 模块是一款基于 ASIC 技术的高性能、高可靠性的 CANopen 总线数字 量输入输出扩展模块&#xff0c;具有 16 路通用输入接口和 16 路通用输出接口。输入输出接口均采用光 电隔离和…

手机爬虫用Fiddler详细教程

如果你正在进行手机爬虫的工作&#xff0c;那么一款强大而又实用的网络调试工具Fiddler将会是你的好帮手。今天&#xff0c;我将和大家分享一份详细的Fiddler教程&#xff0c;教你如何使用它来轻松捕获和分析手机App的网络请求。让我们一起来探索Fiddler的功能和操作&#xff0…

visual Studio MFC 绘制单一颜色三角形、渐变颜色边框三角形、渐变填充三角形、边框渐变的正方形与填充渐变的正方形实例

MFC 绘制三角形 本文使用visual Studio MFC 平台实现绘制单一颜色三角形、渐变颜色边框三角形、渐变填充三角形、边框渐变的正方形与填充渐变的正方形. 关于基础工程的创建请参考Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线 文章目录 MFC 绘制三角形…

IO和NIO的区别 BIO,NIO,AIO 有什么区别? Files的常用方法都有哪些?

文章目录 IO和NIO的区别BIO,NIO,AIO 有什么区别?Files的常用方法都有哪些&#xff1f; 今天来对java中的io, nio, bio, aio进行了解&#xff0c;有何区别。 IO和NIO的区别 NIO与IO区别 IO是面向流的&#xff0c;NIO是面向缓冲区的Java IO面向流意味着每次从流中读一个或多个字…

《经济学人》深度解析之OpenAI董事会风波

上周全球最受瞩目的财经事件莫过于如日中天的OpenAI董事会风波所带来的反转之反转剧情。 故事的结局相信大家都已知悉&#xff1a;OpenAI在开除创始人山姆奥特曼&#xff08;Sam Altman&#xff09;几天后&#xff0c;重新任命他为首席执行官&#xff0c;并成立了一个新的董事…

linux LVM /dev/sdb mount dir /data【linux LVM 磁盘挂载目录】

添加磁盘 /dev/sdb rootregistry01 ~]# fdisk -lDisk /dev/sda: 53.7 GB, 53687091200 bytes, 104857600 sectors Units sectors of 1 * 512 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk lab…

机器学习(1)机器学习类型和机器学习的主要概念

0.前提 深度学习&#xff08;Deep Learing&#xff09;是机器学习&#xff08;Machine Learning&#xff09;领域中的一个新的研究方向&#xff0c;在如今的时代研究深度学习的大模型是十分热门的。我不知道有多少人有关注到最近openai的事件啊&#xff0c;说个比较让我惊讶的…