# 使用 Spring Boot + MyBatisPlus 提高效率，简化开发

原文：https://blog.grtsinry43.com/posts/springboot-mybatisplus-quickstart/

作者：grtsinry43

发布时间：2024-08-11T00:05:33Z

内容更新时间：2024-08-11T00:05:33Z

最近一段时间，由于一些项目的需求，于是被迫用很快的速度学完了 Spring Framework，SpringMVC，Spring Boot。

然而实际上，我认为学习后端框架原理，前端的脚手架开发，搞一些基础建设是远远比每天写单调简单的业务逻辑要收获更多的，就是更多还是要有解决问题的能力和创新进步的想法吧，所以写业务逻辑当然是越省时间越好，机械操作和基础代码就越快搞定越好，这引出了我们为什么要使用 `MyBatis-Plus`

首先是它的官网快速上手部分：[点我跳转](https://baomidou.com/getting-started/)

## 基础使用（利用提供的类进行增删改查）

首先在 maven 的依赖中添加 （最新版在 [Maven Repository](https://mvnrepository.com/artifact/com.baomidou/mybatis-plus) 查找）

```xml
<dependency>
	<groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
    <version>3.5.7</version>
</dependency>
```

同步依赖后配置注解扫描 mapper

```java
package com.grtsinry43.projectpackage;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.grtsinry43.projectpackage.mapper")
public class SimpleBackendApplication {

    public static void main(String[] args) {
        SpringApplication.run(SimpleBackendApplication.class, args);
    }

}

```

下面我们先创建实体类（model）

```java
package com.grtsinry43.projectpackage.model;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.sql.Timestamp;

/**
 * @author grtsinry43
 * @date 2024/8/11 11:08
 * @description user 的实体类
 */
@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String name;
    private Boolean gender;
    private Integer age;
    private String phone;
    private String password;
    private Timestamp createAt;
}

```

> 这里使用了 Lombok 的 `@Data` 注解来自动生成 `Getter`、`Setter` 方法、`toString` 方法、`hashCode` 方法、`equals` 方法。

下面我们来写对应的 Mapper，在这里，MyBatis-Plus 提供了一个 BaseMapper，我们只需要继承这个接口就可以直接获得增删改查的功能

```java
package com.grtsinry43.projectpackage.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.grtsinry43.projectpackage.model.User;

/**
 * @author grtsinry43
 * @date 2024/8/11 11:13
 * @description 用户的 Mapper 接口
 */
public interface UserMapper extends BaseMapper<User> {
}

```

当然，如果需要一些自定义的 sql 语句，也可以自行配置，这里采用最简单的来举例

在 resources/mapper 新建 `UserMapper.xml`

```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.grtsinry43.projectpackage.mapper.UserMapper">
    <select id="selectUsersOlderThan" resultType="com.grtsinry43.projectpackage.model.User">
        SELECT * FROM user WHERE age > #{age}
    </select>
</mapper>
```

```java
public interface UserMapper extends BaseMapper<User> {
    @Select("select * from user where age > #{age}")
    List<User> selectUsersOlderThan(Integer age);
}代码生成器
```

然后在 Service 中，传入 Mapper 和对应的数据模型，继承 ServiceImpl

```java
package com.grtsinry43.projectpackage.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.grtsinry43.projectpackage.mapper.UserMapper;
import com.grtsinry43.projectpackage.model.User;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    private final UserMapper userMapper;

    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }
}
```

这样，我们的 Service 对象就有了 crud 方法，我们可以在 Controller 类中直接使用~

```java
package com.grtsinry43.projectpackage.controller;

import com.grtsinry43.projectpackage.dto.ApiResponse;
import com.grtsinry43.projectpackage.model.User;
import com.grtsinry43.projectpackage.service.UserService;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import org.springframework.web.bind.annotation.*;

/**
 * @author grtsinry43
 * @date 2024/8/11 11:30
 * @description 少年负壮气，奋烈自有时！
 */
@RestController
@RequestMapping("/api/user")
public class UserController {
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/{id}")
    public ApiResponse<User> getUserInfo(@PathVariable Integer id) {
        User user = userService.getById(id);
        return ApiResponse.success(user);
    }
    
    @PutMapping("/{id}")
    public ApiResponse<User> updateUserInfo(@PathVariable Integer id, @RequestBody User user) {
        user.setId(id);
        userService.updateById(user);
        return ApiResponse.success(user);
    }
    
    @DeleteMapping("/{id}")
    public ApiResponse<Object> deleteUser(@PathVariable Integer id) {
        userService.removeById(id);
        return ApiResponse.success(null);
    }
}

```

## 使用代码生成器（完全不用敲代码）

> 当然，手动敲代码真的是太繁琐了，我真的非常讨厌在简单业务逻辑尤其是基本的 crud 上浪费时间，MyBatis-Plus 也想到了这一点，人家的完整使用方法可不是上面的那~么~复杂，借助代码生成器（Auto Generator）完全无脑搞起来吧！

> 注意！根据官方文档，新的代码生成器适用于 3.5.1 及以上版本

```java
package com.grtsinry43.mybatisplusquickstart.util;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * Code generator for MyBatis Plus.
 * Author: grtsinry43
 * Date: 2024/8/11
 */
public class CodeGenerator {
    public static void main(String[] args) {
        FastAutoGenerator.create("url",
                        "username", "password")
                // 全局配置
                .globalConfig((scanner, builder) -> builder
                        .author(scanner.apply("请输入作者名称？"))
                        .outputDir("src/main/java") // Specify the output directory
                )
                // 包配置
                .packageConfig((scanner, builder) -> builder.parent(scanner.apply("请输入包名？")))
                // 策略配置
                .strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名，多个英文逗号分隔？所有输入 all")))
                        .entityBuilder()
                        .enableLombok()
                        .addTableFills(
                                new Column("create_time", FieldFill.INSERT)
                        )
                        .build())
                // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }

    // 处理 all 情况
    protected static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }
}
```

这样，就会按照结构生成好啦：

```sh
❯ tree .
.
└── mybatisplusquickstart
    ├── controller
    │   └── UserController.java
    ├── entity
    │   └── User.java
    ├── mapper
    │   ├── UserMapper.java
    │   └── xml
    │       └── UserMapper.xml
    ├── MybatisplusQuickstartApplication.java
    ├── service
    │   ├── impl
    │   │   └── UserServiceImpl.java
    │   └── IUserService.java
    └── util
        └── CodeGenerator.java

```

以上，就可以在不用敲代码的情况下实现基本的数据操作，大大提高效率，减少机械操作了
