Skip to content
第 49 章 后端 ⏱ 10 分钟阅读

第 49 章:MyBatis Plus 入门 ​

学习目标 ​

  • 集成 MyBatis Plus
  • 掌握通用 CRUD
  • 学会分页、条件构造器

一、为啥用 MyBatis Plus ​

原生 MyBatis:

java
// ❌ 每个表都要写 CRUD
@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
public void insert(User user);

@Select("SELECT * FROM user WHERE id = #{id}")
public User findById(Long id);

MyBatis Plus(MP):通用 Mapper + 条件构造器,不再写 SQL。

二、集成 ​

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

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>
yaml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/myapp?useSSL=false&characterEncoding=UTF-8
    username: root
    password: xxx
    driver-class-name: com.mysql.cj.jdbc.Driver

三、实体类 ​

java
@Data
@TableName("user")          // 表名(可省略,默认类名转下划线)
public class User {
    @TableId(type = IdType.AUTO)    // 主键自增
    private Long id;

    @TableField("user_name")        // 字段名映射
    private String username;

    private Integer age;

    @TableLogic                    // 逻辑删除字段
    private Integer deleted;

    @Version                       // 乐观锁
    private Integer version;
}
注解作用
@TableName表名
@TableId主键 + 策略
@TableField字段映射
@TableLogic逻辑删除
@Version乐观锁

四、通用 Mapper ​

java
public interface UserMapper extends BaseMapper<User> {
    // 这里啥都不用写,BaseMapper 已经提供 25 个方法
}

继承自 BaseMapper:

java
int insert(User entity);                 // 插入
int deleteById(Serializable id);         // 按 ID 删
int updateById(User entity);             // 按 ID 改
User selectById(Serializable id);        // 按 ID 查
List<User> selectBatchIds(Collection);   // 按 ID 批量
List<User> selectList(Wrapper);          // 条件查
Long selectCount(Wrapper);               // 数量
// ... 共 25+

五、条件构造器(核心) ​

java
// 1. 简单条件
LambdaQueryWrapper<User> q = new LambdaQueryWrapper<>();
q.eq(User::getAge, 18)
 .like(User::getName, "张")
 .orderByDesc(User::getId);
List<User> users = userMapper.selectList(q);

// 2. 链式
List<User> users = userMapper.selectList(
    new LambdaQueryWrapper<User>()
        .eq(User::getStatus, 1)
        .between(User::getAge, 18, 30)
        .isNotNull(User::getEmail)
        .orderByAsc(User::getId)
);

// 3. SQL 片段
new LambdaQueryWrapper<User>().last("LIMIT 10")

⚠️ 坑 1:用 LambdaQueryWrapper 而不是 QueryWrapper。后者字段名是字符串,改字段名不会报错,后期维护崩溃。

六、分页 ​

注册分页插件:

java
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

使用:

java
Page<User> page = userMapper.selectPage(
    new Page<>(1, 10),                            // 第 1 页,每页 10
    new LambdaQueryWrapper<User>().eq(User::getStatus, 1)
);

// page.getRecords()    -> 当前页数据
// page.getTotal()      -> 总数
// page.getPages()      -> 总页数

自动分页(推荐,用拦截器):

java
@GetMapping("/users")
public Result<IPage<UserVO>> list(@RequestParam int page, @RequestParam int size) {
    Page<User> p = new Page<>(page, size);
    return Result.ok(userMapper.selectPage(p, null).convert(UserVO::from));
}

七、常用配置 ​

yaml
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true   # 自动转驼峰
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 打印 SQL
  global-config:
    db-config:
      id-type: auto
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0

八、逻辑删除 ​

java
// 字段 deleted:0=未删,1=已删
// 删
userMapper.deleteById(1L);
// 自动变成 UPDATE user SET deleted = 1 WHERE id = 1

⚠️ 坑 2:逻辑删除会让所有查询自动加 WHERE deleted = 0,包括 JOIN。要注意索引性能。

九、本章小结 ​

要点关键
BaseMapper25 个通用方法
条件构造器LambdaQueryWrapper(类型安全)
分页PaginationInnerInterceptor
逻辑删除@TableLogic

动手练习 ​

  1. 集成 MyBatis Plus,写 User 实体的 CRUD
  2. 用条件构造器查"年龄 18-30,用户名含'张'"的用户
  3. 写一个分页查询接口

下一章:第 50 章:MyBatis Plus 高级(填充+多租户+批处理) →

本站基于 VitePress 构建 · 由 StackHub 团队维护