SpringBoot整合MyBatis-Plus代码生成器的示例代码
作者:张老师技术栈
还在手动写Entity、Mapper、Service、Controller吗,本文教你用MyBatis-Plus代码生成器根据数据库表一键生成全套代码,节省80%重复劳动,保证风格统一,减少低级错误,附带IDEA插件MyBatisX替代方案,让开发更高效,需要的朋友可以参考下
项目开发中最枯燥的就是反复写 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 目录下,不打包到生产环境。
public class CodeGenerator {
public static void main(String[] args) {
// 数据源配置
DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(
"jdbc:mysql://localhost:3306/seckill_db?useUnicode=true&characterEncoding=utf-8",
"root",
"123456"
).build();
// 全局配置
GlobalConfig globalConfig = new GlobalConfig.Builder()
.outputDir(System.getProperty("user.dir") + "/src/main/java")
.author("张政")
.openDir(false)
.build();
// 包配置
PackageConfig packageConfig = new PackageConfig.Builder()
.parent("com.zhang.seckill")
.entity("model.entity")
.service("service")
.serviceImpl("service.impl")
.mapper("mapper")
.controller("controller")
.build();
// 策略配置
StrategyConfig strategyConfig = new StrategyConfig.Builder()
.addInclude("seckill_product", "seckill_order") // 要生成的表
.addTablePrefix("seckill_") // 表前缀过滤
.entityBuilder()
.enableLombok()
.enableTableFieldAnnotation()
.serviceBuilder()
.formatServiceFileName("%sService")
.formatServiceImplFileName("%sServiceImpl")
.controllerBuilder()
.enableRestStyle()
.enableHyphenStyle()
.build();
// 执行生成
AutoGenerator generator = new AutoGenerator.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")
public class SeckillProductController {
@Autowired
private SeckillProductService seckillProductService;
@GetMapping
public ResultVO<Page<SeckillProduct>> list(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "20") int size) {
return ResultVO.success(
seckillProductService.page(new Page<>(page, size)));
}
@GetMapping("/{id}")
public ResultVO<SeckillProduct> get(@PathVariable Long id) {
return ResultVO.success(seckillProductService.getById(id));
}
@PostMapping
public ResultVO<SeckillProduct> add(@RequestBody SeckillProduct product) {
seckillProductService.save(product);
return ResultVO.success(product);
}
@PutMapping("/{id}")
public ResultVO<SeckillProduct> update(
@PathVariable Long id, @RequestBody SeckillProduct product) {
product.setId(id);
seckillProductService.updateById(product);
return ResultVO.success(product);
}
@DeleteMapping("/{id}")
public ResultVO<?> delete(@PathVariable Long id) {
seckillProductService.removeById(id);
return ResultVO.success("删除成功");
}
}
五、自定义模板
如果不想用生成器默认的 Controller 模板,可以自定义:
.controllerBuilder()
.templatePath("/templates/controller.java.vm") // 自定义模板路径
在 src/main/resources/templates/ 下放自己的模板文件:
// controller.java.vm(简化版)
package ${package.Controller};
import org.springframework.web.bind.annotation.*;
import ${package.Service}.${table.serviceName};
@RestController
@RequestMapping("/${table.entityPath}")
public class ${table.controllerName} {
@Autowired
private ${table.serviceName} ${table.serviceName?uncap_first};
@GetMapping
public ResultVO<?> list() {
return ResultVO.success(
${table.serviceName?uncap_first}.list());
}
}
六、实际开发建议
// 1. 生成后手动调整
// 自动生成的 Controller 只有基础 CRUD
// 复杂的业务查询需要手写
// 2. 只生成一次
// 表结构稳定后再生成,避免反复覆盖导致手写代码丢失
// 3. 生成器配置建议
strategyConfig = new StrategyConfig.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 + 业务逻辑 + 异常处理
以上就是SpringBoot整合MyBatis-Plus代码生成器的示例代码的详细内容,更多关于SpringBoot整合MyBatis-Plus代码生成器的资料请关注脚本之家其它相关文章!
