SpringBoot 整合 MyBatis-Plus 代码生成器——告别手写重复代码

📅 2026/7/13 2:15:31 👁️ 阅读次数 📝 编程学习
SpringBoot 整合 MyBatis-Plus 代码生成器——告别手写重复代码

项目开发中最枯燥的就是反复写 Entity、Mapper、Service、Controller 这些模板代码。MyBatis-Plus 的代码生成器可以根据数据库表结构一键生成全套代码,省下 80% 的重复劳动。

一、为什么需要代码生成器

一个典型的数据表需要写 4 层代码:

数据库表 user → Entity(实体类,字段 + 注解) → Mapper(数据访问接口 + XML) → Service(业务逻辑接口 + 实现) → Controller(RESTful 接口)

四层代码加起来少说 100 多行,全是 getter/setter、CRUD 模板。如果项目有 20 张表,就是 2000 行重复劳动。代码生成器一键搞定。

二、引入依赖

<!-- MyBatis-Plus 核心 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency><!-- 代码生成器 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.3.1</version><scope>test</scope></dependency><!-- 模板引擎 --><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version><scope>test</scope></dependency>

三、编写生成器代码

代码生成器通常放在 test 目录下,不打包到生产环境。

publicclassCodeGenerator{publicstaticvoidmain(String[]args){// 数据源配置DataSourceConfigdataSourceConfig=newDataSourceConfig.Builder("jdbc:mysql://localhost:3306/seckill_db?useUnicode=true&characterEncoding=utf-8","root","123456").build();// 全局配置GlobalConfigglobalConfig=newGlobalConfig.Builder().outputDir(System.getProperty("user.dir")+"/src/main/java").author("张政").openDir(false).build();// 包配置PackageConfigpackageConfig=newPackageConfig.Builder().parent("com.zhang.seckill").entity("model.entity").service("service").serviceImpl("service.impl").mapper("mapper").controller("controller").build();// 策略配置StrategyConfigstrategyConfig=newStrategyConfig.Builder().addInclude("seckill_product","seckill_order")// 要生成的表.addTablePrefix("seckill_")// 表前缀过滤.entityBuilder().enableLombok().enableTableFieldAnnotation().serviceBuilder().formatServiceFileName("%sService").formatServiceImplFileName("%sServiceImpl").controllerBuilder().enableRestStyle().enableHyphenStyle().build();// 执行生成AutoGeneratorgenerator=newAutoGenerator.Builder(dataSourceConfig).global(globalConfig).packageInfo(packageConfig).strategy(strategyConfig).build();generator.execute();}}

四、生成效果

运行main方法后,自动生成以下文件:

src/main/java/com/zhang/seckill/ ├── model/entity/ │ ├── SeckillProduct.java ← 实体类(带 @TableName、@TableId 注解) │ └── SeckillOrder.java ├── mapper/ │ ├── SeckillProductMapper.java ← Mapper 接口(继承 BaseMapper) │ └── SeckillOrderMapper.java ├── service/ │ ├── SeckillProductService.java ← Service 接口 │ └── SeckillOrderService.java ├── service/impl/ │ ├── SeckillProductServiceImpl.java ← Service 实现(继承 ServiceImpl) │ └── SeckillOrderServiceImpl.java └── controller/ ├── SeckillProductController.java ← Controller(RESTful CRUD) └── SeckillOrderController.java

生成的 SeckillProductController 自带 CRUD 接口:

@RestController@RequestMapping("/seckill-product")publicclassSeckillProductController{@AutowiredprivateSeckillProductServiceseckillProductService;@GetMappingpublicResultVO<Page<SeckillProduct>>list(@RequestParam(defaultValue="1")intpage,@RequestParam(defaultValue="20")intsize){returnResultVO.success(seckillProductService.page(newPage<>(page,size)));}@GetMapping("/{id}")publicResultVO<SeckillProduct>get(@PathVariableLongid){returnResultVO.success(seckillProductService.getById(id));}@PostMappingpublicResultVO<SeckillProduct>add(@RequestBodySeckillProductproduct){seckillProductService.save(product);returnResultVO.success(product);}@PutMapping("/{id}")publicResultVO<SeckillProduct>update(@PathVariableLongid,@RequestBodySeckillProductproduct){product.setId(id);seckillProductService.updateById(product);returnResultVO.success(product);}@DeleteMapping("/{id}")publicResultVO<?>delete(@PathVariableLongid){seckillProductService.removeById(id);returnResultVO.success("删除成功");}}

五、自定义模板

如果不想用生成器默认的 Controller 模板,可以自定义:

.controllerBuilder().templatePath("/templates/controller.java.vm")// 自定义模板路径

src/main/resources/templates/下放自己的模板文件:

// controller.java.vm(简化版)package${package.Controller};importorg.springframework.web.bind.annotation.*;import${package.Service}.${table.serviceName};@RestController@RequestMapping("/${table.entityPath}")publicclass${table.controllerName}{@Autowiredprivate${table.serviceName}${table.serviceName?uncap_first};@GetMappingpublicResultVO<?>list(){returnResultVO.success(${table.serviceName?uncap_first}.list());}}

六、实际开发建议

// 1. 生成后手动调整// 自动生成的 Controller 只有基础 CRUD// 复杂的业务查询需要手写// 2. 只生成一次// 表结构稳定后再生成,避免反复覆盖导致手写代码丢失// 3. 生成器配置建议strategyConfig=newStrategyConfig.Builder().addInclude("user","product","order")// 指定表.entityBuilder().enableLombok()// 用 Lombok 省掉 getter/setter.enableTableFieldAnnotation()// 每个字段加 @TableField.logicDeleteColumnName("is_deleted")// 逻辑删除.versionColumnName("version")// 乐观锁.controllerBuilder().enableRestStyle()// @RestController.build();

七、IDEA 插件替代方案

除了代码生成器,也可以直接在 IDEA 中安装 MyBatisX 插件:

File → Settings → Plugins → 搜索 MyBatisX → Install

安装后在 Mapper 接口中 Alt+Enter 可以直接跳转到 XML,比生成器更轻量。

总结

代码生成器的核心价值不是"少写代码",而是保证代码风格统一、减少低级错误。生成后只需要专注写业务逻辑,模板代码交给生成器。

生成器 → 模板代码 + 基础 CRUD 开发者 → 复杂 SQL + 业务逻辑 + 异常处理

💡 觉得有用的话,点赞 + 关注【张老师技术栈】吧!每周更新 Java/Python/爬虫 实战干货,不让你白来。