MyBatis-Plus 核心优势

一、先搞懂:什么是 MyBatis-Plus?

MyBatis 是 Java 中主流的持久层框架,需要手动编写 SQL 语句和 Mapper 接口;而MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 基础上做了无侵入式扩展(完全兼容 MyBatis),核心是自动生成 CRUD(增删改查)SQL,无需手动编写基础 SQL,大幅提升开发效率。
可以简单理解:MyBatis 是 “手动挡汽车”(需手动写 SQL),MyBatis-Plus 是 “自动挡汽车”(自动生成基础 SQL,也支持手动写复杂 SQL)。

二、MyBatis-Plus 核心优势

  1. 无侵入:只做增强不做改变,引入 MP 后可继续使用 MyBatis 的所有功能。
  2. CRUD 自动生成:内置通用 Mapper、Service,无需编写基础增删改查 SQL。
  3. 强大的条件构造器:支持链式编程拼接复杂 WHERE 条件,无需手写复杂 SQL。
  4. 分页插件:一键配置即可实现分页查询,无需手动处理分页逻辑。
  5. 主键生成策略:支持雪花算法、自增、UUID 等多种主键生成方式,适配不同场景。
  6. 代码生成器:一键生成 Entity、Mapper、Service、Controller 等全套代码,减少重复工作。

三、快速上手:MyBatis-Plus 基础使用

1. 环境准备(Maven 依赖)

首先在项目中引入 MyBatis-Plus 核心依赖(需先引入 MyBatis 和数据库驱动):
xml
 
 
 
 
 
<!-- MyBatis-Plus核心依赖 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.5</version> <!-- 推荐使用最新稳定版 -->
</dependency>
<!-- MySQL驱动(根据数据库类型选择) -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
    <scope>runtime</scope>
</dependency>
 

2. 核心使用步骤

步骤 1:定义实体类(Entity)
对应数据库表,使用注解映射表名、字段名(默认驼峰命名自动映射):
java
 
运行
 
 
 
 
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

// 映射数据库表:user(若类名与表名一致,可省略@TableName)
@TableName("user")
@Data // Lombok注解,自动生成get/set/toString
public class User {
    // 主键ID,自增策略
    @TableId(type = IdType.AUTO)
    private Long id;
    // 用户名(字段名与属性名一致,无需额外注解)
    private String username;
    // 年龄
    private Integer age;
    // 邮箱
    private String email;
}
 
步骤 2:定义 Mapper 接口
继承 MP 的BaseMapper,自动获得 CRUD 方法,无需编写任何 SQL:
java
 
运行
 
 
 
 
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

// 标注为MyBatis Mapper
@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 无需编写任何方法,BaseMapper已包含所有基础CRUD
    // 例如:insert、deleteById、updateById、selectById、selectList等
}
 
步骤 3:业务层使用(Service 层,可选)
MP 还提供通用 Service,进一步简化业务层代码:
java
 
运行
 
 
 
 
import com.baomidou.mybatisplus.extension.service.IService;

// 通用Service接口
public interface UserService extends IService<User> {
}

// 实现类
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    // 无需编写基础方法,IService已包含批量操作、分页等增强方法
}
 
步骤 4:测试 CRUD 操作
java
 
运行
 
 
 
 
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;

@SpringBootTest
public class MyBatisPlusTest {
    @Autowired
    private UserMapper userMapper;
    
    @Autowired
    private UserService userService;

    // 1. 新增用户
    @Test
    public void testInsert() {
        User user = new User();
        user.setUsername("张三");
        user.setAge(20);
        user.setEmail("zhangsan@test.com");
        userMapper.insert(user); // 自动生成INSERT SQL
    }

    // 2. 查询所有用户
    @Test
    public void testSelectList() {
        // 查询条件为空,查询所有
        List<User> userList = userMapper.selectList(null);
        userList.forEach(System.out::println);
    }

    // 3. 条件查询(使用条件构造器Wrapper)
    @Test
    public void testSelectByWrapper() {
        // 查询年龄>18且用户名包含"张"的用户
        List<User> userList = userMapper.selectList(
            com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper.<User>lambda()
                .gt(User::getAge, 18) // gt = greater than(大于)
                .like(User::getUsername, "张") // like(模糊查询)
        );
        userList.forEach(System.out::println);
    }

    // 4. 分页查询
    @Test
    public void testPage() {
        // 第1页,每页10条
        com.baomidou.mybatisplus.extension.plugins.pagination.Page<User> page = new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(1, 10);
        // 分页查询(条件为空)
        userMapper.selectPage(page, null);
        // 获取分页结果
        System.out.println("总条数:" + page.getTotal());
        System.out.println("总页数:" + page.getPages());
        page.getRecords().forEach(System.out::println);
    }
}
 

3. 分页插件配置(关键)

使用分页功能需先配置分页插件:
java
 
运行
 
 
 
 
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加分页插件,指定数据库类型
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}
 

四、核心亮点:条件构造器(Wrapper)

MP 的条件构造器是核心亮点,支持链式编程拼接复杂条件,避免手写 SQL 的繁琐和错误:
方法 说明 示例
eq 等于(=) eq(User::getAge, 20)
ne 不等于(!=) ne(User::getAge, 20)
gt 大于(>) gt(User::getAge, 20)
ge 大于等于(>=) ge(User::getAge, 20)
lt 小于(<) lt(User::getAge, 20)
le 小于等于(<=) le(User::getAge, 20)
like 模糊查询(% 值 %) like(User::getUsername, "张")
in IN 查询 in(User::getId, 1,2,3)
orderByAsc 升序排序 orderByAsc(User::getAge)

五、常见使用场景 & 注意事项

  1. 适用场景
    • 快速开发中小型项目,减少重复的 CRUD SQL 编写。
    • 单表操作为主的场景(MP 对单表支持最优,多表联查建议手动写 SQL 或用 XML)。
    • 需要快速实现分页、条件查询的场景。
  2. 注意事项
    • MP 是 MyBatis 的增强,不是替代,复杂多表联查仍需手写 SQL(可在 Mapper 中定义,MP 完全兼容)。
    • 实体类与数据库表映射时,注意驼峰命名规则(默认开启,如user_name映射userName)。
    • 主键策略需与数据库一致(如数据库主键自增,实体类需配置IdType.AUTO)。

总结

  1. MyBatis-Plus 是 MyBatis 的无侵入增强工具,核心是自动生成单表 CRUD SQL,大幅提升开发效率。
  2. 核心用法是继承BaseMapper/IService,配合条件构造器Wrapper实现灵活条件查询,分页功能需配置专属插件。
  3. MP 适合单表操作场景,复杂多表联查可结合 MyBatis 原生方式(XML / 注解),兼顾效率与灵活性。
 
 
posted @ 2025-12-18 16:11  高手大8  阅读(65)  评论(0)    收藏  举报