【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