java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot整合MyBatis-Plus代码生成器

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代码生成器的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文