Backend Development 17 min read

Comprehensive Guide to Using MyBatis-Plus with Spring Boot

This article provides a detailed tutorial on integrating MyBatis-Plus into a Spring Boot project, covering dependency setup, configuration, entity annotations, CRUD operations, pagination, logical deletion, enum handling, automatic field filling, and multi‑datasource support, with complete code examples.

Top Architect
Top Architect
Top Architect
Comprehensive Guide to Using MyBatis-Plus with Spring Boot

This guide introduces MyBatis-Plus, a powerful ORM plugin for Spring Boot, and walks through its complete integration and usage.

1. Quick Start

Prepare the environment with Spring Boot, Maven, JDK 1.8, and MySQL. Create the database using the provided SQL script.

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.0</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.27</version>
</dependency>

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.5.0</version>
</dependency>

Configure the Spring Boot main class to scan mappers:

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@MapperScan("com.wjbgn.user.mapper")
@SpringBootApplication
public class RobNecessitiesUserApplication {
    public static void main(String[] args) {
        SpringApplication.run(RobNecessitiesUserApplication.class, args);
    }
}

Set up the datasource (master/slave) in application.yml :

spring:
  datasource:
    dynamic:
      primary: master
      strict: false
      datasource:
        master:
          url: jdbc:mysql://127.0.0.1:3306/rob_necessities?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
          username: root
          password: 123456
        slave_1:
          url: jdbc:mysql://127.0.0.1:3306/rob_necessities?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
          username: root
          password: 123456

2. Entity and Annotations

@TableName("user")
public class UserDO {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @TableField("nickname")
    private String nickname;
    @TableField("sex")
    private SexEnum sex;
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableLogic
    private Integer isDelete;
}

Enum example implementing IEnum and using @JsonFormat for proper JSON serialization:

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum SexEnum implements IEnum
{
    MAN(1, "男"),
    WOMAN(2, "女");
    private Integer code;
    private String name;
    @Override
    public Integer getValue() { return code; }
    public String getName() { return name; }
}

3. Mapper and Service Layers

@Mapper
public interface UserMapper extends BaseMapper
{}

public interface IUserService extends IService
{}

@Service
public class UserServiceImpl extends ServiceImpl
implements IUserService {}

4. Pagination Configuration

@Configuration
@MapperScan("com.wjbgn.*.mapper*")
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

5. Logical Deletion

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: isDelete
      logic-delete-value: 1
      logic-not-delete-value: 0

Or annotate the field with @TableLogic in the entity.

6. Automatic Field Filling

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }
}

7. Multi‑Datasource with @DS Annotation

@DS("slave_1")
public class UserServiceImpl extends ServiceImpl
implements IUserService {
    @DS("slave_1")
    public List
getList() { return this.list(); }
    @DS("master")
    public int saveUser(UserDO user) { return this.save(user) ? 1 : 0; }
}

8. Controller Example

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private IUserService userService;
    @RequestMapping("/save")
    public boolean save() {
        UserDO user = new UserDO();
        user.setNickname("大漂亮");
        user.setSex(SexEnum.MAN);
        return userService.save(user);
    }
    @RequestMapping("/list")
    public List
list() { return userService.list(); }
    @RequestMapping("/page")
    public Page
page(@RequestParam int current, @RequestParam int size) {
        return userService.page(new Page<>(current, size), new QueryWrapper<>(new UserDO()));
    }
}

The article concludes with testing steps, a complete SQL table definition, and links to additional resources, demonstrating that MyBatis-Plus can handle CRUD, pagination, logical deletion, enum mapping, automatic timestamps, and multi‑datasource scenarios efficiently.

JavaenumSpring BootORMpaginationMyBatis-PlusCRUDmulti-datasource
Top Architect
Written by

Top Architect

Top Architect focuses on sharing practical architecture knowledge, covering enterprise, system, website, large‑scale distributed, and high‑availability architectures, plus architecture adjustments using internet technologies. We welcome idea‑driven, sharing‑oriented architects to exchange and learn together.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.