MyBatis-Plus 零基础入门(Spring Boot 集成超详细版)
一、MyBatis-Plus 是什么?
MyBatis-Plus(简称 MP)是 MyBatis 的增强工具,无需编写重复 SQL即可实现数据库操作。它通过封装通用操作,让你专注于业务逻辑开发。
核心特点:
- 自动化 CRUD:继承 BaseMapper 后,无需手写增删改查 SQL
- 灵活条件构造:通过 Java 代码拼接查询条件(如
age > 18 AND email IS NOT NULL) - 开箱即用功能:分页、逻辑删除、自动生成 ID 等
比喻:MP 就像 MyBatis 的“自动驾驶系统”,帮你自动完成基础操作。
二、为什么要学 MyBatis-Plus?
✅ 三大核心优势
省时高效
- 80% 的基础 SQL 自动生成(如
INSERT INTO user...) - 示例:只需
userService.save(user)即可新增数据
- 80% 的基础 SQL 自动生成(如
安全可靠
使用
QueryWrapper拼接条件,避免 SQL 注入风险示例:
javaqueryWrapper.ge("age", 18).isNotNull("email");
功能强大
- 分页查询只需一行代码:
userService.page(new Page<>(1, 10)) - 支持 Lambda 表达式,避免硬编码字段名
- 分页查询只需一行代码:
三、Spring Boot 集成 MyBatis-Plus 步骤
🧩 步骤 1:添加依赖(pom.xml)
xml
<!-- MyBatis-Plus 核心 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Lombok(推荐):自动生成 getter/setter -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>🗺️ 步骤 2:配置数据库连接(application.yml)
yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印 SQL 日志⚠️ 注意:
your_db替换为你的数据库名username/password替换为你的数据库账号密码
🧱 步骤 3:创建实体类(与数据库表映射)
java
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
@Data
public class User {
@TableId(type = IdType.AUTO) // 标记主键并设置自增
private Long id;
private String name;
private Integer age;
private String email;
}关键点:字段名需与数据库表字段名一致(如
name字段)
🔧 步骤 4:创建 Mapper 接口
java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface UserMapper extends BaseMapper<User> {
// 无需编写方法,继承 BaseMapper 后自动拥有增删改查功能
}📦 步骤 5:创建 Service 层(推荐)
1. 定义 Service 接口
java
import com.baomidou.mybatisplus.extension.service.IService;
public interface UserService extends IService<User> {
// 可自定义业务方法
}2. 实现 Service
java
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 继承后自动拥有所有 CRUD 方法
}🔍 步骤 6:配置 Mapper 扫描
在 Spring Boot 启动类添加注解:
java
@MapperScan("com.example.mapper") // 替换为你的 Mapper 包路径
@SpringBootApplication
public class MyBatisPlusDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MyBatisPlusDemoApplication.class, args);
}
}四、核心操作:CRUD 实战
✅ 准备:测试类模板
java
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserTest {
@Autowired
private UserService userService;
@Test
void test() {
// 测试代码
}
}1️⃣ 新增数据(Create)
java
@Test
void testAdd() {
User user = new User();
user.setName("李四");
user.setAge(25);
user.setEmail("li.si@example.com");
boolean success = userService.save(user);
System.out.println("新增成功:" + success);
}2️⃣ 查询数据(Retrieve)
(1)根据 ID 查询
java
User user = userService.getById(1L);
System.out.println("用户信息:" + user);(2)查询所有
java
List<User> users = userService.list();
users.forEach(System.out::println);(3)条件查询
java
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper
.ge("age", 18)
.isNotNull("email");
List<User> users = userService.list(wrapper);(4)分页查询
java
Page<User> page = new Page<>(1, 2); // 第1页,每页2条
IPage<User> result = userService.page(page);
System.out.println("总条数:" + result.getTotal());
result.getRecords().forEach(System.out::println);⚠️ 注意:必须添加分页插件配置(见下文)
3️⃣ 更新数据(Update)
(1)根据 ID 更新
java
User user = new User();
user.setId(1L);
user.setAge(30); // 只更新 age 字段
boolean success = userService.updateById(user);(2)条件更新
java
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("name", "李四");
User user = new User();
user.setEmail("new.email@example.com");
userService.update(user, wrapper);4️⃣ 删除数据(Delete)
(1)根据 ID 删除
java
userService.removeById(1L);(2)条件删除
java
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.lt("age", 18);
userService.remove(wrapper);五、核心 API 快速参考
🛠️ Service 层常用方法
| 方法 | 说明 | 示例 |
|---|---|---|
save(entity) | 新增 | userService.save(user) |
removeById(id) | 根据 ID 删除 | userService.removeById(1L) |
updateById(entity) | 根据 ID 更新 | userService.updateById(user) |
list(wrapper) | 条件查询 | userService.list(wrapper) |
page(page) | 分页查询 | userService.page(new Page<>(1, 10)) |
🔎 QueryWrapper 常用条件
| 方法 | 说明 | 示例 |
|---|---|---|
eq("age", 18) | 等于 | queryWrapper.eq("age", 18) |
like("name", "张") | 模糊查询 | queryWrapper.like("name", "张") |
between("age", 18, 30) | 范围查询 | queryWrapper.between("age", 18, 30) |
orderByDesc("age") | 倒序排序 | queryWrapper.orderByDesc("age") |
六、常见问题解答
❓ 1. 主键自增失败?
- 原因:数据库表未设置自增
- 解决:
- 在 Navicat 中将
id字段设置为自增 - 实体类添加
@TableId(type = IdType.AUTO)
- 在 Navicat 中将
❓ 2. 分页查询无效?
- 原因:未配置分页插件
- 解决:添加配置类:
java
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}❓ 3. 字段名与数据库不一致?
- 示例:表字段是
user_name,类属性是userName - 解决:使用
@TableField注解
java
@TableField("user_name")
private String userName;❓ 4. Mapper 接口未被扫描?
解决:检查启动类的
@MapperScan路径是否正确java@MapperScan("com.example.mapper") // 替换为你的实际包路径
七、总结 & 学习路径
🚀 推荐学习顺序
- 基础操作:掌握
save()/getById()/updateById() - 条件查询:熟练使用
QueryWrapper拼接条件 - 分页查询:配置分页插件 + 调用
page()方法
📚 学习建议
- 多动手:跟着教程写一遍代码,观察 SQL 输出
- 善用文档:MyBatis-Plus 官方文档
- 逐步扩展:学会后再尝试乐观锁、逻辑删除等高级功能
通过本教程,你已掌握 MyBatis-Plus 的核心用法。继续实践,你将能高效处理数据库操作,告别冗余 SQL!