1. 引言:重复性结构代码的痛点
在软件开发中,我们经常需要创建一些结构相似、模式固定的代码,例如:
- 数据模型(Data Models):定义实体类及其属性、关系映射。
- CRUD 接口(Create, Read, Update, Delete):为数据模型提供标准的增删改查操作。
- 配置文件(Configuration Files):如数据库连接、应用设置、路由规则等。
- DTO/VO 对象:数据传输对象、视图对象。
- 单元测试模板:针对特定方法或组件的测试代码结构。
手动编写这些代码不仅耗时,而且容易出错,尤其是在项目初期或需要快速迭代时。本文将介绍几种高效创建这些重复性结构的方法和工具。
2. 核心方法与工具
2.1 代码生成器(Code Generators)
代码生成器可以根据模板或元数据(如数据库表结构、API 定义)自动生成代码。
- MyBatis Generator:根据数据库表生成 MyBatis 的实体类、Mapper 接口和 XML 映射文件。
- JHipster:一个流行的开发平台,可以快速生成 Spring Boot + Angular/React/Vue 的全栈应用,包括数据模型、CRUD 接口和前端页面。
- Swagger Codegen:根据 OpenAPI/Swagger 规范生成客户端 SDK、服务器端存根和 API 文档。
2.2 脚手架(Scaffolding)
脚手架工具通过命令行或图形界面,快速创建项目的标准目录结构和基础文件。
- Spring Initializr:快速创建 Spring Boot 项目,选择依赖后生成包含基础配置的完整项目。
- Vue CLI / Create React App:前端项目的标准脚手架,一键生成包含构建配置、路由、状态管理等的基础项目。
- Yeoman:一个通用的脚手架系统,拥有丰富的生成器(Generator)生态,可以生成各种类型的项目结构。
2.3 模板引擎与代码片段(Templates & Snippets)
在 IDE 或编辑器中预定义模板和代码片段,通过快捷键快速插入。
- IDE 内置模板:如 IntelliJ IDEA 的 File Templates、Live Templates;Visual Studio 的 Code Snippets。
- 插件扩展:如 VS Code 的 REST Client 可以快速生成 HTTP 请求模板。
- 自定义片段:几乎所有现代编辑器都支持自定义代码片段(Snippets),可以定义触发词和模板内容。
2.4 低代码/无代码平台(Low-Code/No-Code)
通过可视化拖拽和配置,自动生成后端数据模型、API 和前端界面。
- 内部平台:许多大公司会构建内部低代码平台,用于快速生成管理后台、报表系统等。
- 商业平台:如 OutSystems、Mendix、Appian 等。
3. 实战示例:使用 MyBatis Generator 生成数据模型与 Mapper
以下是一个简单的配置示例,展示如何通过 MyBatis Generator 从数据库表生成 Java 实体类和 Mapper。
3.1 配置文件(generatorConfig.xml)
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC
"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="MySQL" targetRuntime="MyBatis3">
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/my_db"
userId="root"
password="123456">
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.model"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
&lt;sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources"&gt;
&lt;/sqlMapGenerator&gt;
&lt;javaClientGenerator type="XMLMAPPER"
targetPackage="com.example.mapper"
targetProject="src/main/java"&gt;
&lt;/javaClientGenerator&gt;
&lt;table tableName="user"&gt;
&lt;generatedKey column="id" sqlStatement="MySql" identity="true"/&gt;
&lt;/table&gt;
</context>
</generatorConfiguration>
3.2 运行生成命令
bash
mvn mybatis-generator:generate
# 或使用独立 jar 包
java -jar mybatis-generator-core-x.x.x.jar -configfile generatorConfig.xml
3.3 生成结果示例
执行后会自动生成:
User.java(实体类,包含 id、username、email 等属性及 getter/setter)UserMapper.java(Mapper 接口,包含基本的 CRUD 方法)UserMapper.xml(SQL 映射文件,包含对应的 SQL 语句)
4. 实战示例:使用 IDE 模板快速创建 Spring Boot REST Controller
在 IntelliJ IDEA 中,可以使用内置的 "Spring Initializr" 创建项目后,通过 "Live Template" 快速生成 REST Controller。
4.1 创建自定义 Live Template
打开 Settings/Preferences → Editor → Live Templates ,添加一个名为 restc 的模板:
java
@RestController
@RequestMapping("/api/${ENTITY_NAME}")
public class ${ENTITY_NAME}Controller {
@Autowired
private ${ENTITY_NAME}Service ${ENTITY_NAME_LOWER}Service;
@GetMapping
public List<${ENTITY_NAME}DTO> findAll() {
return ${ENTITY_NAME_LOWER}Service.findAll();
}
@GetMapping("/{id}")
public ${ENTITY_NAME}DTO findById(@PathVariable ${ID_TYPE} id) {
return ${ENTITY_NAME_LOWER}Service.findById(id);
}
@PostMapping
public ${ENTITY_NAME}DTO create(@RequestBody ${ENTITY_NAME}DTO dto) {
return ${ENTITY_NAME_LOWER}Service.create(dto);
}
@PutMapping("/{id}")
public ${ENTITY_NAME}DTO update(@PathVariable ${ID_TYPE} id, @RequestBody ${ENTITY_NAME}DTO dto) {
return ${ENTITY_NAME_LOWER}Service.update(id, dto);
}
@DeleteMapping("/{id}")
public void delete(@PathVariable ${ID_TYPE} id) {
${ENTITY_NAME_LOWER}Service.delete(id);
}
}
定义变量 ENTITY_NAME、ENTITY_NAME_LOWER、ID_TYPE 的表达式和默认值。
4.2 使用模板
在 Java 类文件中输入 restc 后按 Tab 键,IDE 会自动展开模板并提示输入实体名和 ID 类型,快速生成一个完整的 REST Controller 骨架。
5. 最佳实践与注意事项
- 保持模板的维护性:生成的代码应易于理解和修改,避免过度复杂的魔法逻辑。
- 版本控制生成代码:对于团队项目,生成的代码也应纳入版本控制,但需清晰区分"生成代码"和"手工代码"。
- 定制化与扩展:选择支持插件或自定义模板的工具,以适应项目的特殊需求。
- 避免过度生成:只生成真正需要的、通用的结构,避免生成大量无用或需要大量修改的代码。
- 文档与培训:确保团队成员了解所使用的生成工具和模板,并知道如何更新它们。
6. 总结
通过代码生成器、脚手架、模板和低代码平台,我们可以将开发人员从重复性的结构代码编写中解放出来,专注于业务逻辑和创新。关键在于选择合适的工具,并建立一套适合团队的高效工作流。
建议从一两个痛点场景开始(如每次新项目都要配一堆 YAML,或每个实体都要写一遍 CRUD),引入自动化工具,逐步积累模板和最佳实践,最终形成团队的"标准操作程序"。