然然管理系统仓库地址,欢迎移步仓库点个小星星
https://gitee.com/OceanCore/ranran.git
https://github.com/qiaoting/ranran.git
一、前言
在后台管理系统开发中,CRUD 代码的编写占据了大量重复工作 —— 每个业务表都要写 Entity、Mapper、Service、Controller,不仅效率低,还容易出现格式不统一的问题。为此,然然管理系统新增了自动化代码生成功能,基于 SpringBoot+MyBatis+Freemarker 技术栈,实现 “数据库表→Java 业务代码” 的一键生成,本文先从整体设计和核心模块入手,讲解功能的实现思路。
系统截图:
二、功能设计
本代码生成功能的核心目标是:前端展示数据库表列表 → 选择表并传入基础配置 → 后端生成 Entity、Mapper、Service、Controller 代码 → 前端展示生成结果。整体流程如下:
前端请求表列表 → 后端查询information_schema获取表信息 → 前端提交表名/作者/模块名等配置 → 后端查询表字段 → 字段类型映射 → Freemarker渲染模板 → 返回生成的代码字符串 → 前端展示三、技术环境
- 基础框架:SpringBoot
- 数据持久层:MyBatis(XML + 接口)
- 模板引擎:Freemarker(代码模板渲染)
- 辅助工具:Lombok(简化实体类)、自定义工具类(表名转类名、类型映射)
四、模块拆解
1. 数据层:查询数据库表与字段
核心是通过information_schema系统库查询表和字段信息,这是跨数据库(MySQL)通用的方式:
- 表查询(GeneratorTableMapper):查询指定数据库下的所有表名、引擎、表注释。
- 字段查询(GeneratorTableFieldMapper):查询指定表的字段名、类型、注释、主键、可空性等。
关键 Mapper XML 示例(字段查询):
<select id="selectAllField" parameterType="String" resultType="GeneratorTableField"> select column_name as columnname, data_type as columntype, column_comment as remarks, case when is_nullable = 'yes' then 1 else 0 end as isnullable, case when column_key = 'pri' then 1 else 0 end as isprimarykey from information_schema.columns where table_schema = (select database()) and table_name = #{tableName} order by ordinal_position </select>2. 服务层:业务逻辑处理
服务层分为 3 个核心类,职责单一:
GeneratorTableService:封装表列表查询逻辑,对外提供getAllTable方法。GeneratorTableFieldService:核心是字段类型映射(数据库类型→Java 类型),比如varchar→String、datetime→LocalDateTime。GeneratorService:整合表字段信息,通过 Freemarker 渲染模板,生成各类代码文件。
3. 工具类:通用能力封装
TableUtil:实现 “下划线表名→驼峰类名” 转换,支持移除指定前缀(比如t_、sys_)。GenerateUtil:组装代码生成所需的类信息(模块名、基础包名、类名等),补充到ClassInfoDto中。
4. 控制层:接口暴露
GeneratorController提供两个核心接口:
GET /api/generator/listTable:查询数据库表列表,支持指定数据库名。POST /api/generator/getCode:接收表名、作者、模块名等配置,返回生成的代码 Map(key 为文件名,value 为代码字符串)。
五、功能演示(接口层面)
查询表列表:
GET /api/generator/listTable?dbName=ranran_db返回结果包含表名、表注释、引擎等信息,前端可渲染为下拉列表 / 表格。
生成代码:
POST /api/generator/getCode { "tableName": "sys_user", "moduleName": "system", "functionName": "用户管理", "author": "ranran" }返回结果为 Map,示例:
{ "entity.java": "package com.ranran.system.entity;...", "mapper.java": "package com.ranran.system.mapper;...", "service.java": "package com.ranran.system.service;...", "controller.java": "package com.ranran.system.controller;..." }六、总结
本文从整体视角拆解了然然管理系统代码生成功能的核心设计与模块划分,下一篇将深入讲解字段类型映射、Freemarker 模板渲染、表名转换等核心细节,以及功能的扩展与优化思路。