2、快速入门:Spring Boot整合MyBatis Plus、基础CRUD操作、日志配置

好,咱们直接进入正题。这一章我带你从零开始,把 MyBatis Plus 跑起来。你想想看,一个框架好不好用,最快的方式就是看它能不能让你少写代码。MP 在这方面,确实做得不错。

2.1 环境准备与依赖引入

我个人习惯用 Spring Boot 2.7.x 系列,配合 MP 3.5.x。版本搭配上,我建议你尽量用最新的稳定版,别用太老的,否则有些新特性用不了。

先创建一个 Spring Boot 项目,然后在 pom.xml 里加依赖:

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

<!-- MyBatis Plus Starter -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</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>
小提示: 如果你用的是 Spring Boot 3.x,记得把 MP 版本升级到 3.5.5 以上,否则会有兼容问题。我在项目中踩过这个坑,升级后一切正常。

2.2 配置文件与数据源

接下来配置 application.yml。这里我直接给出一份我常用的配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mp_demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  global-config:
    db-config:
      id-type: auto   # 主键策略:自增
      table-prefix: t_  # 表前缀,比如 User 对应 t_user
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 控制台输出 SQL

嗯,这里要注意 table-prefix。我建议你养成加表前缀的习惯,比如 t_usert_order。为什么?因为生产环境里,表多了容易重名,加个前缀能避免很多麻烦。

2.3 实体类与 Mapper 接口

先建一张简单的用户表:

CREATE TABLE t_user (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(30) NOT NULL,
    age INT DEFAULT 0,
    email VARCHAR(50),
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

然后写实体类。我用 Lombok 简化代码:

@Data
@TableName("t_user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
    private LocalDateTime createTime;
}

Mapper 接口就更简单了:

@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 啥都不用写,CRUD 方法已经继承了
}
核心要点: 继承 BaseMapper<T> 后,你就拥有了 insert、deleteById、updateById、selectById、selectList 等 20+ 个方法。这就是 MP 的魔力——零 SQL 实现基础 CRUD。

2.4 基础 CRUD 操作实战

写个测试类,咱们跑一遍:

@SpringBootTest
class MpDemoApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    void testInsert() {
        User user = new User();
        user.setName("张三");
        user.setAge(25);
        user.setEmail("zhangsan@example.com");
        int rows = userMapper.insert(user);
        System.out.println("影响行数:" + rows);
        System.out.println("自增ID:" + user.getId());
    }

    @Test
    void testSelect() {
        // 查询所有
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);

        // 按ID查询
        User user = userMapper.selectById(1L);
        System.out.println(user);
    }

    @Test
    void testUpdate() {
        User user = new User();
        user.setId(1L);
        user.setAge(30);
        int rows = userMapper.updateById(user);
        System.out.println("更新行数:" + rows);
    }

    @Test
    void testDelete() {
        int rows = userMapper.deleteById(1L);
        System.out.println("删除行数:" + rows);
    }
}

跑一下看看。你会发现控制台输出了完整的 SQL 语句。这就是日志配置的作用。

2.5 日志配置详解

刚才配置里我用了 StdOutImpl,它会直接把 SQL 打印到控制台。但说实话,生产环境我不建议这么干。为什么?因为日志量太大,会影响性能。

我一般这样区分环境:

环境 日志实现 说明
开发/测试 StdOutImpl 直接控制台输出,方便调试
生产 Slf4jImpl 或关闭 配合 Logback/Log4j2,控制日志级别

配置方式也很灵活:

# 方式一:全局配置(上面已经演示过)
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

# 方式二:按包配置日志级别(推荐生产用)
logging.level.com.example.mapper=DEBUG
我曾经踩过的坑: 有一次生产环境忘了改配置,结果 StdOutImpl 疯狂打印 SQL,把磁盘打满了。从那以后,我每次上线前都会检查日志配置。你也要记住:生产环境别用 StdOutImpl

2.6 常见问题与避坑指南

  • 表名映射失败: 如果实体类名和表名对不上,记得加 @TableName 注解。我习惯统一加,避免后期改表名出问题。
  • 主键策略选择: 我建议用 IdType.AUTO(数据库自增)或 IdType.ASSIGN_ID(雪花算法)。别用 IdType.NONE,否则你会收到一个空 ID。
  • 字段自动填充:create_timeupdate_time 这类字段,可以用 MP 的自动填充功能。后面章节我会详细讲。

好了,这一章的内容就到这里。你跟着敲一遍代码,应该就能跑起来了。下一章咱们聊聊条件构造器——那是 MP 真正好用的地方。