项目开发中最枯燥的就是反复写 Entity、Mapper、Service、Controller 这些模板代码。MyBatis-Plus 的代码生成器可以根据数据库表结构一键生成全套代码省下 80% 的重复劳动。一、为什么需要代码生成器一个典型的数据表需要写 4 层代码数据库表 user → Entity实体类字段 注解 → Mapper数据访问接口 XML → Service业务逻辑接口 实现 → ControllerRESTful 接口四层代码加起来少说 100 多行全是 getter/setter、CRUD 模板。如果项目有 20 张表就是 2000 行重复劳动。代码生成器一键搞定。二、引入依赖!-- MyBatis-Plus 核心 --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.3.1/version/dependency!-- 代码生成器 --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-generator/artifactIdversion3.5.3.1/versionscopetest/scope/dependency!-- 模板引擎 --dependencygroupIdorg.apache.velocity/groupIdartifactIdvelocity-engine-core/artifactIdversion2.3/versionscopetest/scope/dependency三、编写生成器代码代码生成器通常放在 test 目录下不打包到生产环境。publicclassCodeGenerator{publicstaticvoidmain(String[]args){// 数据源配置DataSourceConfigdataSourceConfignewDataSourceConfig.Builder(jdbc:mysql://localhost:3306/seckill_db?useUnicodetruecharacterEncodingutf-8,root,123456).build();// 全局配置GlobalConfigglobalConfignewGlobalConfig.Builder().outputDir(System.getProperty(user.dir)/src/main/java).author(张政).openDir(false).build();// 包配置PackageConfigpackageConfignewPackageConfig.Builder().parent(com.zhang.seckill).entity(model.entity).service(service).serviceImpl(service.impl).mapper(mapper).controller(controller).build();// 策略配置StrategyConfigstrategyConfignewStrategyConfig.Builder().addInclude(seckill_product,seckill_order)// 要生成的表.addTablePrefix(seckill_)// 表前缀过滤.entityBuilder().enableLombok().enableTableFieldAnnotation().serviceBuilder().formatServiceFileName(%sService).formatServiceImplFileName(%sServiceImpl).controllerBuilder().enableRestStyle().enableHyphenStyle().build();// 执行生成AutoGeneratorgeneratornewAutoGenerator.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 ← ControllerRESTful CRUD └── SeckillOrderController.java生成的 SeckillProductController 自带 CRUD 接口RestControllerRequestMapping(/seckill-product)publicclassSeckillProductController{AutowiredprivateSeckillProductServiceseckillProductService;GetMappingpublicResultVOPageSeckillProductlist(RequestParam(defaultValue1)intpage,RequestParam(defaultValue20)intsize){returnResultVO.success(seckillProductService.page(newPage(page,size)));}GetMapping(/{id})publicResultVOSeckillProductget(PathVariableLongid){returnResultVO.success(seckillProductService.getById(id));}PostMappingpublicResultVOSeckillProductadd(RequestBodySeckillProductproduct){seckillProductService.save(product);returnResultVO.success(product);}PutMapping(/{id})publicResultVOSeckillProductupdate(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};RestControllerRequestMapping(/${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. 生成器配置建议strategyConfignewStrategyConfig.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 接口中 AltEnter 可以直接跳转到 XML比生成器更轻量。总结代码生成器的核心价值不是少写代码而是保证代码风格统一、减少低级错误。生成后只需要专注写业务逻辑模板代码交给生成器。生成器 → 模板代码 基础 CRUD 开发者 → 复杂 SQL 业务逻辑 异常处理 觉得有用的话点赞 关注【张老师技术栈】吧每周更新 Java/Python/爬虫 实战干货不让你白来。
SpringBoot 整合 MyBatis-Plus 代码生成器——告别手写重复代码
发布时间:2026/7/13 2:02:05
项目开发中最枯燥的就是反复写 Entity、Mapper、Service、Controller 这些模板代码。MyBatis-Plus 的代码生成器可以根据数据库表结构一键生成全套代码省下 80% 的重复劳动。一、为什么需要代码生成器一个典型的数据表需要写 4 层代码数据库表 user → Entity实体类字段 注解 → Mapper数据访问接口 XML → Service业务逻辑接口 实现 → ControllerRESTful 接口四层代码加起来少说 100 多行全是 getter/setter、CRUD 模板。如果项目有 20 张表就是 2000 行重复劳动。代码生成器一键搞定。二、引入依赖!-- MyBatis-Plus 核心 --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.3.1/version/dependency!-- 代码生成器 --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-generator/artifactIdversion3.5.3.1/versionscopetest/scope/dependency!-- 模板引擎 --dependencygroupIdorg.apache.velocity/groupIdartifactIdvelocity-engine-core/artifactIdversion2.3/versionscopetest/scope/dependency三、编写生成器代码代码生成器通常放在 test 目录下不打包到生产环境。publicclassCodeGenerator{publicstaticvoidmain(String[]args){// 数据源配置DataSourceConfigdataSourceConfignewDataSourceConfig.Builder(jdbc:mysql://localhost:3306/seckill_db?useUnicodetruecharacterEncodingutf-8,root,123456).build();// 全局配置GlobalConfigglobalConfignewGlobalConfig.Builder().outputDir(System.getProperty(user.dir)/src/main/java).author(张政).openDir(false).build();// 包配置PackageConfigpackageConfignewPackageConfig.Builder().parent(com.zhang.seckill).entity(model.entity).service(service).serviceImpl(service.impl).mapper(mapper).controller(controller).build();// 策略配置StrategyConfigstrategyConfignewStrategyConfig.Builder().addInclude(seckill_product,seckill_order)// 要生成的表.addTablePrefix(seckill_)// 表前缀过滤.entityBuilder().enableLombok().enableTableFieldAnnotation().serviceBuilder().formatServiceFileName(%sService).formatServiceImplFileName(%sServiceImpl).controllerBuilder().enableRestStyle().enableHyphenStyle().build();// 执行生成AutoGeneratorgeneratornewAutoGenerator.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 ← ControllerRESTful CRUD └── SeckillOrderController.java生成的 SeckillProductController 自带 CRUD 接口RestControllerRequestMapping(/seckill-product)publicclassSeckillProductController{AutowiredprivateSeckillProductServiceseckillProductService;GetMappingpublicResultVOPageSeckillProductlist(RequestParam(defaultValue1)intpage,RequestParam(defaultValue20)intsize){returnResultVO.success(seckillProductService.page(newPage(page,size)));}GetMapping(/{id})publicResultVOSeckillProductget(PathVariableLongid){returnResultVO.success(seckillProductService.getById(id));}PostMappingpublicResultVOSeckillProductadd(RequestBodySeckillProductproduct){seckillProductService.save(product);returnResultVO.success(product);}PutMapping(/{id})publicResultVOSeckillProductupdate(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};RestControllerRequestMapping(/${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. 生成器配置建议strategyConfignewStrategyConfig.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 接口中 AltEnter 可以直接跳转到 XML比生成器更轻量。总结代码生成器的核心价值不是少写代码而是保证代码风格统一、减少低级错误。生成后只需要专注写业务逻辑模板代码交给生成器。生成器 → 模板代码 基础 CRUD 开发者 → 复杂 SQL 业务逻辑 异常处理 觉得有用的话点赞 关注【张老师技术栈】吧每周更新 Java/Python/爬虫 实战干货不让你白来。