这个代码生成器是我按照我喜欢的模版写的,可以生成基本的CRUD代码,对我来说够用,但是不具有通用性
javapackage 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);
}
}
尝试一下,只需要修改一下包路径就好
运行之后生成的代码,你只需要写对应的实体类就好了,直接启动应用
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!