MyBatis-Plus 核心优势
一、先搞懂:什么是 MyBatis-Plus?
MyBatis 是 Java 中主流的持久层框架,需要手动编写 SQL 语句和 Mapper 接口;而MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 基础上做了无侵入式扩展(完全兼容 MyBatis),核心是自动生成 CRUD(增删改查)SQL,无需手动编写基础 SQL,大幅提升开发效率。
可以简单理解:MyBatis 是 “手动挡汽车”(需手动写 SQL),MyBatis-Plus 是 “自动挡汽车”(自动生成基础 SQL,也支持手动写复杂 SQL)。
二、MyBatis-Plus 核心优势
- 无侵入:只做增强不做改变,引入 MP 后可继续使用 MyBatis 的所有功能。
- CRUD 自动生成:内置通用 Mapper、Service,无需编写基础增删改查 SQL。
- 强大的条件构造器:支持链式编程拼接复杂 WHERE 条件,无需手写复杂 SQL。
- 分页插件:一键配置即可实现分页查询,无需手动处理分页逻辑。
- 主键生成策略:支持雪花算法、自增、UUID 等多种主键生成方式,适配不同场景。
- 代码生成器:一键生成 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) |
五、常见使用场景 & 注意事项
-
适用场景:
- 快速开发中小型项目,减少重复的 CRUD SQL 编写。
- 单表操作为主的场景(MP 对单表支持最优,多表联查建议手动写 SQL 或用 XML)。
- 需要快速实现分页、条件查询的场景。
-
注意事项:
- MP 是 MyBatis 的增强,不是替代,复杂多表联查仍需手写 SQL(可在 Mapper 中定义,MP 完全兼容)。
- 实体类与数据库表映射时,注意驼峰命名规则(默认开启,如
user_name映射userName)。 - 主键策略需与数据库一致(如数据库主键自增,实体类需配置
IdType.AUTO)。
总结
- MyBatis-Plus 是 MyBatis 的无侵入增强工具,核心是自动生成单表 CRUD SQL,大幅提升开发效率。
- 核心用法是继承
BaseMapper/IService,配合条件构造器Wrapper实现灵活条件查询,分页功能需配置专属插件。 - MP 适合单表操作场景,复杂多表联查可结合 MyBatis 原生方式(XML / 注解),兼顾效率与灵活性。

浙公网安备 33010602011771号