基于Spring Boot + MyBatis的智能代码生成器项目详解

基于Spring Boot + MyBatis的智能代码生成器项目详解

基于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设计
  • 统一的响应格式

🔮 项目优势

  1. 高效开发:一键生成完整的后端代码,节省大量开发时间
  2. 标准化:生成的代码遵循最佳实践,保持代码风格一致
  3. 可扩展:基于模板引擎,支持自定义模板和扩展
  4. 易维护:清晰的代码结构和完整的注释
  5. 功能完整:支持完整的CRUD操作和高级查询功能

🛣️ 开发计划

  • 支持更多数据库类型(PostgreSQL、Oracle等)
  • 支持自定义字段映射规则
  • 支持生成单元测试代码
  • 支持生成Vue、React等前端框架代码
  • 添加代码预览功能
  • 支持模板版本管理
  • 添加数据库连接池配置
  • 支持多数据源配置

📝 总结

这个代码生成器项目是一个功能完整、设计优雅的Java开发工具。它通过智能分析数据库结构,自动生成符合最佳实践的后端代码,大大提高了开发效率。项目采用现代化的技术栈,具有良好的可扩展性和维护性,是Java开发者的得力助手。

无论是新项目的快速搭建,还是现有项目的代码重构,这个代码生成器都能提供强有力的支持。通过模板化的设计,开发者可以根据项目需求自定义代码生成规则,确保生成的代码符合团队的开发规范。


项目地址:[GitHub链接]
作者:王青玄
邮箱:1121586359@qq.***
许可证:MIT

转载请说明出处内容投诉
CSS教程网 » 基于Spring Boot + MyBatis的智能代码生成器项目详解

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买