基于Spring Boot + FreeMarker的代码生成器项目详解
📋 项目概述
这是一个功能强大的Java代码生成器项目,基于Spring Boot 3.4.7和Mysql5.7+ 构建。项目能够根据MySQL数据库表结构自动生成完整的后端代码,包括实体类、Mapper接口、Service层和Controller层,大大提高了开发效率。
🎯 核心特性
- 🔍 智能数据库元数据查询:支持查询数据库、表、字段、索引、外键等完整信息
- 🎯 一键代码生成:根据表结构自动生成完整的CRUD代码
- 📝 模板化生成:使用FreeMarker模板引擎,支持自定义模板
- 🔧 灵活配置:支持Lombok、注释、包名等配置选项
- 🌐 RESTful API:提供完整的Web接口,支持批量操作
- ⚡ 自动启动生成:应用启动时自动生成指定数据库的所有表代码
🏗️ 技术架构
技术栈
| 技术 | 版本 | 用途 |
|---|---|---|
| Spring Boot | 3.4.7 | 主框架,提供Web服务和自动配置 |
| MySQL | 8.0.33 | 数据库驱动,支持MySQL数据库 |
| FreeMarker | 2.3.32 | 模板引擎,生成代码文件 |
| Apache ***mons | 最新版 | 工具类库,提供文件操作和字符串处理 |
| Lombok | 最新版 | 代码简化工具,自动生成getter/setter |
| Jackson | 最新版 | JSON处理,API响应格式化 |
项目结构
src/main/java/io/github/zh/codegenerate/
├── CodeGenerateApplication.java # 主启动类,实现***mandLineRunner
├── constants/ # 常量定义
│ └── SqlConstants.java # SQL查询常量
├── entity/ # 数据实体类
│ ├── DatabaseInfo.java # 数据库信息实体
│ ├── TableInfo.java # 表信息实体
│ ├── ColumnInfo.java # 字段信息实体
│ ├── IndexInfo.java # 索引信息实体
│ └── ForeignKeyInfo.java # 外键信息实体
├── service/ # 业务服务层
│ ├── DatabaseMetadataService.java # 数据库元数据服务
│ └── CodeGeneratorService.java # 代码生成核心服务
├── controller/ # 控制器层
│ ├── CodeGeneratorController.java # 代码生成API控制器
│ └── TestController.java # 测试控制器
└── config/ # 配置类
└── FreemarkerConfig.java # FreeMarker模板配置
src/main/resources/
├── templates/ # FreeMarker模板文件
│ ├── entity.ftl # 实体类模板
│ ├── mapper.ftl # Mapper接口模板
│ ├── mapper.xml.ftl # Mapper XML模板
│ ├── service.ftl # Service接口模板
│ ├── serviceImpl.ftl # Service实现类模板
│ └── controller.ftl # Controller模板
└── application.yml # 应用配置文件
🔧 核心功能实现
1. 数据库元数据查询
项目通过DatabaseMetadataService类实现数据库元数据的查询功能:
@Service
public class DatabaseMetadataService {
@Autowired
private JdbcTemplate jdbcTemplate;
// 获取当前数据库名称
public String getCurrentDatabase() {
return jdbcTemplate.queryForObject("SELECT DATABASE()", String.class);
}
// 获取所有数据库
public List<String> getAllDatabases() {
return jdbcTemplate.queryForList("SHOW DATABASES", String.class);
}
// 获取指定数据库的所有表
public List<String> getAllTables(String databaseName) {
String sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES " +
"WHERE TABLE_SCHEMA = ? AND TABLE_TYPE = 'BASE TABLE'";
return jdbcTemplate.queryForList(sql, String.class, databaseName);
}
// 获取表的详细信息
public TableInfo getTableInfo(String databaseName, String tableName) {
// 实现表信息查询逻辑
}
}
2. 代码生成核心逻辑
CodeGeneratorService是代码生成的核心服务类,负责:
- 模板数据准备:将数据库表信息转换为模板变量
- 文件生成:使用FreeMarker模板生成各种代码文件
- 类型映射:将MySQL数据类型映射到Java类型
@Service
public class CodeGeneratorService {
@Autowired
private Configuration freemarkerConfig;
// 生成单个表的代码
public void generateCode(String databaseName, String tableName) throws Exception {
// 获取表信息
TableInfo tableInfo = databaseMetadataService.getTableInfo(databaseName, tableName);
// 准备模板数据
Map<String, Object> dataModel = prepareDataModel(tableInfo);
// 生成各种代码文件
generateEntity(dataModel);
generateMapper(dataModel);
generateMapperXml(dataModel);
generateService(dataModel);
generateServiceImpl(dataModel);
generateController(dataModel);
}
// 准备模板数据
private Map<String, Object> prepareDataModel(TableInfo tableInfo) {
Map<String, Object> dataModel = new HashMap<>();
// 基本信息
dataModel.put("tableInfo", tableInfo);
dataModel.put("tableName", tableInfo.getTableName());
dataModel.put("className", convertToClassName(tableInfo.getTableName()));
// 包名和配置信息
dataModel.put("entityPackage", entityPackage);
dataModel.put("mapperPackage", mapperPackage);
dataModel.put("servicePackage", servicePackage);
dataModel.put("controllerPackage", controllerPackage);
dataModel.put("author", author);
dataModel.put("generateLombok", generateLombok);
return dataModel;
}
}
3. 智能类型映射
项目实现了MySQL数据类型到Java类型的智能映射:
// 在FreeMarker模板中的类型映射逻辑
<#if column.dataType == "bigint">Long
<#elseif column.dataType == "int" || column.dataType == "integer">Integer
<#elseif column.dataType == "decimal" || column.dataType == "numeric">BigDecimal
<#elseif column.dataType == "datetime" || column.dataType == "timestamp">Date
<#elseif column.dataType == "text" || column.dataType == "longtext">String
<#elseif column.dataType == "boolean" || column.dataType == "bit">Boolean
<#else>String</#if>
4. 模板化代码生成
使用FreeMarker模板引擎,支持灵活的代码生成。以实体类模板为例:
package ${entityPackage};
<#if generateLombok>
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
</#if>
import java.io.Serializable;
import java.util.Date;
import java.math.BigDecimal;
/**
* ${table***ment!tableName}实体类
*
* @author ${author}
* @since 1.0.0
*/
<#if generateLombok>
@Data
@EqualsAndHashCode(callSuper = false)
@ToString
</#if>
public class ${className} implements Serializable {
private static final long serialVersionUID = 1L;
<#list columns as column>
<#if generate***ment && column.column***ment?? && column.column***ment != "">
/**
* ${column.column***ment}
*/
</#if>
private ${column.javaType} ${column.columnName?uncap_first};
</#list>
}
🌐 RESTful API设计
项目提供了完整的RESTful API接口:
数据库信息查询API
# 获取当前数据库信息
GET /api/code-generator/database/current
# 获取所有数据库
GET /api/code-generator/databases
# 获取数据库版本
GET /api/code-generator/database/version
表信息查询API
# 获取指定数据库的所有表
GET /api/code-generator/tables/{databaseName}
# 获取表的详细信息
GET /api/code-generator/table/{databaseName}/{tableName}
# 检查表是否存在
GET /api/code-generator/table/exists/{databaseName}/{tableName}
# 获取表的大小信息
GET /api/code-generator/tables/size/{databaseName}
代码生成API
# 生成单个表的代码
POST /api/code-generator/generate/{databaseName}/{tableName}
# 生成多个表的代码
POST /api/code-generator/generate/{databaseName}
Content-Type: application/json
["table1", "table2", "table3"]
# 生成数据库所有表的代码
POST /api/code-generator/generate/all/{databaseName}
⚙️ 配置说明
应用配置
# 数据库配置
spring:
datasource:
driver-class-name: ***.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/your_database
username: your_username
password: your_password
# MyBatis配置
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: ***.example.entity
configuration:
map-underscore-to-camel-case: true
代码生成器配置
# 代码生成器配置
code-generate:
template-path: templates/
output-path: generated/
package:
base: ***.example
entity: ***.example.entity
mapper: ***.example.mapper
service: ***.example.service
controller: ***.example.controller
author: 王青玄
copyright: 王青玄
overwrite: true
generate-***ment: true
generate-lombok: true
🚀 使用方法
1. 环境准备
- JDK 21+
- Maven 3.6+
- MySQL 8.0+
2. 快速开始
# 克隆项目
git clone [项目地址]
# 配置数据库连接
# 修改 src/main/resources/application.yml 中的数据库配置
# 启动应用
mvn spring-boot:run
应用启动时会自动执行CodeGenerateApplication.run()方法,生成配置数据库中所有表的代码。
3. 使用API生成代码
# 生成用户表的代码
curl -X POST http://localhost:8080/api/code-generator/generate/weblog/user
# 生成多个表的代码
curl -X POST http://localhost:8080/api/code-generator/generate/weblog \
-H "Content-Type: application/json" \
-d '["user", "role", "permission"]'
# 重新生成所有表的代码
curl -X POST http://localhost:8080/api/code-generator/generate/all/weblog
📁 生成的代码结构
生成的代码将保存在generated/目录下:
generated/
├── entity/ # 实体类
│ └── User.java
├── mapper/ # Mapper接口和XML
│ ├── UserMapper.java
│ └── UserMapper.xml
├── service/ # Service接口和实现
│ ├── UserService.java
│ └── impl/
│ └── UserServiceImpl.java
└── controller/ # 控制器
└── UserController.java
🎨 代码生成特性
实体类生成
- 自动映射数据库字段类型到Java类型
- 支持Lombok注解(可选)
- 自动生成getter/setter方法
- 支持序列化接口
- 自动添加字段注释
Mapper生成
- 生成MyBatis Mapper接口
- 生成完整的XML映射文件
- 支持基础CRUD操作
- 支持分页查询
- 支持批量操作
Service生成
- 生成Service接口
- 生成Service实现类
- 支持事务管理
- 完整的业务逻辑封装
Controller生成
- 生成完整的CRUD接口
- 支持分页查询
- 支持批量操作
- RESTful API设计
- 统一的响应格式
🔮 项目优势
- 高效开发:一键生成完整的后端代码,节省大量开发时间
- 标准化:生成的代码遵循最佳实践,保持代码风格一致
- 可扩展:基于模板引擎,支持自定义模板和扩展
- 易维护:清晰的代码结构和完整的注释
- 功能完整:支持完整的CRUD操作和高级查询功能
🛣️ 开发计划
- 支持更多数据库类型(PostgreSQL、Oracle等)
- 支持自定义字段映射规则
- 支持生成单元测试代码
- 支持生成Vue、React等前端框架代码
- 添加代码预览功能
- 支持模板版本管理
- 添加数据库连接池配置
- 支持多数据源配置
📝 总结
这个代码生成器项目是一个功能完整、设计优雅的Java开发工具。它通过智能分析数据库结构,自动生成符合最佳实践的后端代码,大大提高了开发效率。项目采用现代化的技术栈,具有良好的可扩展性和维护性,是Java开发者的得力助手。
无论是新项目的快速搭建,还是现有项目的代码重构,这个代码生成器都能提供强有力的支持。通过模板化的设计,开发者可以根据项目需求自定义代码生成规则,确保生成的代码符合团队的开发规范。
项目地址:[GitHub链接]
作者:王青玄
邮箱:1121586359@qq.***
许可证:MIT