编辑
2024-08-13
后端
00
请注意,本文编写于 270 天前,最后修改于 270 天前,其中某些信息可能已经过时。

这个代码生成器是我按照我喜欢的模版写的,可以生成基本的CRUD代码,对我来说够用,但是不具有通用性

java
package com.reservoir.core.gen; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.Field; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; public class CodeGenerator { private static final String BASE_PACKAGE = "com.reservoir"; private static final String ENTITY_PACKAGE = BASE_PACKAGE + ".entity"; private static final String MAPPER_PACKAGE = BASE_PACKAGE + ".gencode.mapper"; private static final String SERVICE_PACKAGE = BASE_PACKAGE + ".gencode.service"; private static final String SERVICE_IMPL_PACKAGE = BASE_PACKAGE + ".gencode.service.impl"; private static final String CONTROLLER_PACKAGE = BASE_PACKAGE + ".gencode.controller"; private static final String CORE_ENTITY_PACKAGE = BASE_PACKAGE + ".core.entity"; private static final String MAPPER_DIR = "src/main/java/" + BASE_PACKAGE.replace('.', '/') + "/gencode/mapper"; private static final String SERVICE_DIR = "src/main/java/" + BASE_PACKAGE.replace('.', '/') + "/gencode/service"; private static final String SERVICE_IMPL_DIR = "src/main/java/" + BASE_PACKAGE.replace('.', '/') + "/gencode/service/impl"; private static final String CONTROLLER_DIR = "src/main/java/" + BASE_PACKAGE.replace('.', '/') + "/gencode/controller"; public static void main(String[] args) { try { List<Class<?>> entityClasses = getClasses(ENTITY_PACKAGE); generateCode(entityClasses); } catch (Exception e) { e.printStackTrace(); } } private static List<Class<?>> getClasses(String packageName) throws IOException, ClassNotFoundException { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); assert classLoader != null; String path = packageName.replace('.', '/'); Enumeration<URL> resources = classLoader.getResources(path); List<File> dirs = new ArrayList<>(); while (resources.hasMoreElements()) { URL resource = resources.nextElement(); dirs.add(new File(resource.getFile())); } ArrayList<Class<?>> classes = new ArrayList<>(); for (File directory : dirs) { classes.addAll(findClasses(directory, packageName)); } return classes; } private static List<Class<?>> findClasses(File directory, String packageName) throws ClassNotFoundException { List<Class<?>> classes = new ArrayList<>(); if (!directory.exists()) { return classes; } File[] files = directory.listFiles(); for (File file : files) { if (file.isDirectory()) { assert !file.getName().contains("."); classes.addAll(findClasses(file, packageName + "." + file.getName())); } else if (file.getName().endsWith(".class")) { classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6))); } } return classes; } private static void generateCode(List<Class<?>> entityClasses) { for (Class<?> entityClass : entityClasses) { String entityName = entityClass.getSimpleName(); String mapperName = entityName + "Mapper"; String serviceName = entityName + "Service"; String serviceImplName = entityName + "ServiceImpl"; String controllerName = entityName + "Controller"; String mapperContent = generateMapperContent(entityClass, mapperName); String serviceContent = generateServiceContent(entityClass, serviceName); String serviceImplContent = generateServiceImplContent(entityClass, serviceImplName, mapperName, serviceName); String controllerContent = generateControllerContent(entityClass, controllerName, serviceName); writeFile(MAPPER_DIR, mapperName, mapperContent); writeFile(SERVICE_DIR, serviceName, serviceContent); writeFile(SERVICE_IMPL_DIR, serviceImplName, serviceImplContent); writeFile(CONTROLLER_DIR, controllerName, controllerContent); } } private static String generateMapperContent(Class<?> entityClass, String mapperName) { StringBuilder content = new StringBuilder(); content.append("package ").append(MAPPER_PACKAGE).append(";\n\n"); content.append("import ").append(entityClass.getName()).append(";\n"); content.append("import com.baomidou.mybatisplus.core.mapper.BaseMapper;\n"); content.append("import org.apache.ibatis.annotations.Mapper;\n\n"); content.append("@Mapper\n"); content.append("public interface ").append(mapperName).append(" extends BaseMapper<").append(entityClass.getSimpleName()).append("> {\n\n"); content.append(" // Custom methods for ").append(entityClass.getSimpleName()).append(" entity\n"); content.append("}\n"); return content.toString(); } private static String generateServiceContent(Class<?> entityClass, String serviceName) { StringBuilder content = new StringBuilder(); String entityName = entityClass.getSimpleName(); content.append("package ").append(SERVICE_PACKAGE).append(";\n\n"); content.append("import ").append(entityClass.getName()).append(";\n"); content.append("import java.util.List;\n\n"); content.append("import ").append(CORE_ENTITY_PACKAGE).append(".Result;\n"); content.append("public interface ").append(serviceName).append(" {\n\n"); content.append(" Result<?>").append(" getAll();\n"); content.append(" ").append("Result<?>").append(" getById(Long id);\n"); for (Field field : entityClass.getDeclaredFields()) { String fieldName = field.getName(); String fieldType = field.getType().getSimpleName(); if (!fieldName.equals("id") && !fieldName.equals("serialVersionUID")) { content.append(" Result<?> getBy").append(capitalize(fieldName)).append("(").append(fieldType).append(" ").append(fieldName).append(");\n"); } } content.append(" Result<?> save(").append(entityName).append(" ").append(entityName.toLowerCase()).append(");\n"); content.append(" Result<?> update(").append(entityName).append(" ").append(entityName.toLowerCase()).append(");\n"); content.append(" Result<?> delete(Long id);\n"); content.append("}\n"); return content.toString(); } private static String generateServiceImplContent(Class<?> entityClass, String serviceImplName, String mapperName, String serviceName) { StringBuilder content = new StringBuilder(); String entityName = entityClass.getSimpleName(); content.append("package ").append(SERVICE_IMPL_PACKAGE).append(";\n\n"); content.append("import ").append(entityClass.getName()).append(";\n"); content.append("import ").append(MAPPER_PACKAGE).append(".").append(mapperName).append(";\n"); content.append("import ").append(SERVICE_PACKAGE).append(".").append(serviceName).append(";\n"); content.append("import org.springframework.stereotype.Service;\n"); content.append("import jakarta.annotation.Resource;\n"); content.append("import ").append(CORE_ENTITY_PACKAGE).append(".Result;\n"); content.append("import java.util.List;\n"); content.append("import org.slf4j.Logger;\n"); content.append("import org.slf4j.LoggerFactory;\n"); content.append("import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\n\n"); content.append("@Service\n"); content.append("public class ").append(serviceImplName).append(" implements ").append(serviceName).append(" {\n\n"); content.append(" private static final Logger logger = LoggerFactory.getLogger(").append(serviceImplName).append(".class);\n\n"); content.append(" @Resource\n"); content.append(" private ").append(mapperName).append(" ").append(mapperName.toLowerCase()).append(";\n\n"); content.append(" @Override\n"); content.append(" public Result<?>").append(" getAll() {\n"); content.append(" try {\n"); content.append(" List<").append(entityName).append("> entities = ").append(mapperName.toLowerCase()).append(".selectList(new QueryWrapper<>());\n"); content.append(" return ").append("Result.success(entities);\n"); content.append(" } catch (Exception e) {\n"); content.append(" logger.error(\"Get all ").append(entityName).append(" failed: \", e);\n"); content.append(" return ").append("Result.error(501, \"Get all ").append(entityName).append(" failed\");\n"); content.append(" }\n"); content.append(" }\n\n"); content.append(" @Override\n"); content.append(" public ").append("Result<?>").append(" getById(Long id) {\n"); content.append(" try {\n"); content.append(" ").append(entityName).append(" ").append(entityName.toLowerCase()).append(" = ").append(mapperName.toLowerCase()).append(".selectById(id);\n"); content.append(" return ").append("Result.success(").append(entityName.toLowerCase()).append(");\n"); content.append(" } catch (Exception e) {\n"); content.append(" logger.error(\"Get ").append(entityName).append(" by id failed: \", e);\n"); content.append(" return ").append("Result.error(501, \"Get ").append(entityName).append(" by id failed\");\n"); content.append(" }\n"); content.append(" }\n\n"); for (Field field : entityClass.getDeclaredFields()) { String fieldName = field.getName(); String fieldType = field.getType().getSimpleName(); if (!fieldName.equals("id") && !fieldName.equals("serialVersionUID")) { content.append(" @Override\n"); content.append(" public Result<?> getBy").append(capitalize(fieldName)).append("(").append(fieldType).append(" ").append(fieldName).append(") {\n"); content.append(" try {\n"); content.append(" QueryWrapper<").append(entityName).append("> queryWrapper = new QueryWrapper<>();\n"); content.append(" queryWrapper.eq(\"").append(fieldName).append("\", ").append(fieldName).append(");\n"); content.append(" List<").append(entityName).append("> entities = ").append(mapperName.toLowerCase()).append(".selectList(queryWrapper);\n"); content.append(" return ").append("Result.success(entities);\n"); content.append(" } catch (Exception e) {\n"); content.append(" logger.error(\"Get ").append(entityName).append(" by ").append(fieldName).append(" failed: \", e);\n"); content.append(" return ").append("Result.error(501, \"Get ").append(entityName).append(" by ").append(fieldName).append(" failed\");\n"); content.append(" }\n"); content.append(" }\n\n"); } } content.append(" @Override\n"); content.append(" public Result<?> save(").append(entityName).append(" ").append(entityName.toLowerCase()).append(") {\n"); content.append(" try {\n"); content.append(" ").append(mapperName.toLowerCase()).append(".insert(").append(entityName.toLowerCase()).append(");\n"); content.append(" return ").append("Result.success(\"save success!\");\n"); content.append(" } catch (Exception e) {\n"); content.append(" logger.error(\"Save ").append(entityName).append(" failed: \", e);\n"); content.append(" return ").append("Result.error(501, \"Save ").append(entityName).append(" failed\");\n"); content.append(" }\n"); content.append(" }\n\n"); content.append(" @Override\n"); content.append(" public Result<?> update(").append(entityName).append(" ").append(entityName.toLowerCase()).append(") {\n"); content.append(" try {\n"); content.append(" ").append(mapperName.toLowerCase()).append(".updateById(").append(entityName.toLowerCase()).append(");\n"); content.append(" return ").append("Result.success(\"update success\");\n"); content.append(" } catch (Exception e) {\n"); content.append(" logger.error(\"Update ").append(entityName).append(" failed: \", e);\n"); content.append(" return ").append("Result.error(501, \"Update ").append(entityName).append(" failed\");\n"); content.append(" }\n"); content.append(" }\n\n"); content.append(" @Override\n"); content.append(" public Result<?> delete(Long id) {\n"); content.append(" try {\n"); content.append(" ").append(mapperName.toLowerCase()).append(".deleteById(id);\n"); content.append(" return ").append("Result.success(\"delete success\");\n"); content.append(" } catch (Exception e) {\n"); content.append(" logger.error(\"Delete ").append(entityName).append(" failed: \", e);\n"); content.append(" return ").append("Result.error(501, \"Delete ").append(entityName).append(" failed\");\n"); content.append(" }\n"); content.append(" }\n"); content.append("}\n"); return content.toString(); } private static String generateControllerContent(Class<?> entityClass, String controllerName, String serviceName) { StringBuilder content = new StringBuilder(); String entityName = entityClass.getSimpleName(); content.append("package ").append(CONTROLLER_PACKAGE).append(";\n\n"); content.append("import ").append(entityClass.getName()).append(";\n"); content.append("import ").append(SERVICE_PACKAGE).append(".").append(serviceName).append(";\n"); content.append("import org.springframework.web.bind.annotation.*;\n"); content.append("import io.swagger.v3.oas.annotations.tags.Tag;\n"); content.append("import jakarta.annotation.Resource;\n"); content.append("import io.swagger.v3.oas.annotations.Operation;\n"); content.append("import ").append(CORE_ENTITY_PACKAGE).append(".Result;\n"); content.append("import java.util.List;\n\n"); content.append("@RestController\n"); content.append("@RequestMapping(\"/").append(entityName.toLowerCase()).append("\")\n"); content.append("@Tag(name = \"").append(entityName).append(" API\")\n"); content.append("public class ").append(controllerName).append(" {\n\n"); content.append(" @Resource\n"); content.append(" private ").append(serviceName).append(" ").append(serviceName.toLowerCase()).append(";\n\n"); content.append(" @GetMapping(value = \"getAll\")\n"); content.append(" @Operation(summary = \"获取所有").append(entityName).append("\", description = \"获取所有").append(entityName).append("记录\")\n"); content.append(" public Result<?> ").append(" getAll() {\n"); content.append(" return ").append(serviceName.toLowerCase()).append(".getAll();\n"); content.append(" }\n\n"); content.append(" @GetMapping(value = \"/getById/{id}\")\n"); content.append(" @Operation(summary = \"根据ID获取").append(entityName).append("\", description = \"根据ID获取").append(entityName).append("记录\")\n"); content.append(" public ").append("Result<?>").append(" getById(@PathVariable Long id) {\n"); content.append(" return ").append(serviceName.toLowerCase()).append(".getById(id);\n"); content.append(" }\n\n"); for (Field field : entityClass.getDeclaredFields()) { String fieldName = field.getName(); String fieldType = field.getType().getSimpleName(); if (!fieldName.equals("id") && !fieldName.equals("serialVersionUID")) { content.append(" @GetMapping(value = \"/getBy").append(capitalize(fieldName)).append("\")\n"); content.append(" @Operation(summary = \"根据").append(fieldName).append("获取").append(entityName).append("\", description = \"根据").append(fieldName).append("获取").append(entityName).append("记录\")\n"); content.append(" public Result<?> getBy").append(capitalize(fieldName)).append("(@RequestParam ").append(fieldType).append(" ").append(fieldName).append(") {\n"); content.append(" return ").append(serviceName.toLowerCase()).append(".getBy").append(capitalize(fieldName)).append("(").append(fieldName).append(");\n"); content.append(" }\n\n"); } } content.append(" @PostMapping(value = \"/save\")\n"); content.append(" @Operation(summary = \"保存").append(entityName).append("\", description = \"保存").append(entityName).append("记录\")\n"); content.append(" public Result<?> save(@RequestBody ").append(entityName).append(" ").append(entityName.toLowerCase()).append(") {\n"); content.append(" return ").append(serviceName.toLowerCase()).append(".save(").append(entityName.toLowerCase()).append(");\n"); content.append(" }\n\n"); content.append(" @PutMapping(value = \"/update\")\n"); content.append(" @Operation(summary = \"更新").append(entityName).append("\", description = \"更新").append(entityName).append("记录\")\n"); content.append(" public Result<?> update(@RequestBody ").append(entityName).append(" ").append(entityName.toLowerCase()).append(") {\n"); content.append(" return ").append(serviceName.toLowerCase()).append(".update(").append(entityName.toLowerCase()).append(");\n"); content.append(" }\n\n"); content.append(" @DeleteMapping(value = \"/delete/{id}\")\n"); content.append(" @Operation(summary = \"删除").append(entityName).append("\", description = \"根据ID删除").append(entityName).append("记录\")\n"); content.append(" public Result<?> delete(@PathVariable Long id) {\n"); content.append(" return ").append(serviceName.toLowerCase()).append(".delete(id);\n"); content.append(" }\n"); content.append("}\n"); return content.toString(); } private static void writeFile(String dir, String fileName, String content) { String filePath = dir + "/" + fileName + ".java"; File file = new File(filePath); file.getParentFile().mkdirs(); try (FileWriter writer = new FileWriter(file)) { writer.write(content); } catch (IOException e) { e.printStackTrace(); } } private static String capitalize(String str) { return str.substring(0, 1).toUpperCase() + str.substring(1); } }

尝试一下,只需要修改一下包路径就好

image.png

运行之后生成的代码,你只需要写对应的实体类就好了,直接启动应用

image.png

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!