Skip to content

MyBatis-Plus 快速入门

  5 分钟搭建一个 MyBatis-Plus 项目,体验零 SQL 完成 CRUD 的快感。

一、环境准备

技术栈:
  JDK 8+
  Maven 3.6+
  Spring Boot 2.7+ / 3.x
  MySQL 5.7+
  MyBatis-Plus 3.5+

1.1 数据库建表

sql
CREATE DATABASE mp_demo DEFAULT CHARACTER SET utf8mb4;

USE mp_demo;

CREATE TABLE `user` (
    `id` BIGINT NOT NULL COMMENT '主键',
    `name` VARCHAR(50) NOT NULL COMMENT '用户名',
    `age` INT COMMENT '年龄',
    `email` VARCHAR(100) COMMENT '邮箱',
    `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    `deleted` TINYINT DEFAULT 0 COMMENT '逻辑删除(0=未删除,1=已删除)',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

二、Maven 依赖

xml
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.0</version>
</parent>

<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- MyBatis-Plus(已包含 MyBatis + JDBC) -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
        <version>3.5.5</version>
    </dependency>

    <!-- MySQL 驱动 -->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- Lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

三、配置文件

yaml
# application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mp_demo?useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

# MyBatis-Plus 配置
mybatis-plus:
  # 全局配置
  global-config:
    db-config:
      # 主键策略:雪花算法
      id-type: assign_id
      # 逻辑删除字段
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
  # 打印 SQL 日志
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true

四、实体类

java
@Data
@TableName("user")  // 表名映射(类名和表名一致时可不加)
public class User {

    @TableId(type = IdType.ASSIGN_ID)  // 雪花算法生成 ID
    private Long id;

    private String name;

    private Integer age;

    private String email;

    @TableField(fill = FieldFill.INSERT)  // 插入时自动填充
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)  // 插入和更新时自动填充
    private Date updateTime;

    @TableLogic  // 逻辑删除
    private Integer deleted;
}

五、Mapper 接口

java
@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 继承 BaseMapper 后,自动拥有 17 种通用方法
    // 不需要写任何代码!
}

六、Service 层

java
// 接口
public interface UserService extends IService<User> {
    // 继承 IService 后,自动拥有通用 Service 方法
}

// 实现
@Service
public class UserServiceImpl
        extends ServiceImpl<UserMapper, User>
        implements UserService {
    // 继承 ServiceImpl 后,不需要写任何代码
}

七、Controller 层

java
@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    // 查询全部
    @GetMapping
    public List<User> list() {
        return userService.list();
    }

    // 根据 ID 查询
    @GetMapping("/{id}")
    public User getById(@PathVariable Long id) {
        return userService.getById(id);
    }

    // 新增
    @PostMapping
    public boolean save(@RequestBody User user) {
        return userService.save(user);
    }

    // 修改
    @PutMapping
    public boolean update(@RequestBody User user) {
        return userService.updateById(user);
    }

    // 删除(逻辑删除)
    @DeleteMapping("/{id}")
    public boolean delete(@PathVariable Long id) {
        return userService.removeById(id);
    }
}

八、测试

java
@SpringBootTest
class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    void testInsert() {
        User user = new User();
        user.setName("张三");
        user.setAge(25);
        user.setEmail("zhangsan@test.com");
        int rows = userMapper.insert(user);
        System.out.println("插入成功,ID:" + user.getId());  // 雪花 ID
    }

    @Test
    void testSelectById() {
        User user = userMapper.selectById(1L);
        System.out.println(user);
    }

    @Test
    void testSelectList() {
        // 查询所有年龄 > 20 的用户
        List<User> users = userMapper.selectList(
            new LambdaQueryWrapper<User>()
                .gt(User::getAge, 20)
        );
        users.forEach(System.out::println);
    }

    @Test
    void testUpdate() {
        User user = new User();
        user.setId(1L);
        user.setAge(30);
        userMapper.updateById(user);  // 只更新非 null 字段
    }

    @Test
    void testDelete() {
        userMapper.deleteById(1L);  // 逻辑删除:deleted = 1
    }
}

九、开发流程总结

MyBatis-Plus 开发步骤(五步走):

  ① 加依赖    → mybatis-plus-spring-boot3-starter
  ② 配文件    → 数据源 + MP 全局配置
  ③ 写实体    → @TableName + @TableId + @TableLogic
  ④ 写 Mapper → extends BaseMapper<Entity>
  ⑤ 写 Service → extends ServiceImpl<M, T> + implements IService<T>

速记:引→配→实体→Mapper→Service,零 SQL 完成 CRUD

十、面试要点

问题答案要点
快速入门步骤?引依赖→配数据源→写实体→Mapper 继承 BaseMapper→Service 继承 ServiceImpl
BaseMapper 提供什么?17 种通用 CRUD 方法,单表操作零 SQL
实体类常用注解?@TableName、@TableId、@TableField、@TableLogic、@Version