目录
学习背景与目标
在学习 MyBatis 后,发现其虽然解决了 JDBC 的繁琐操作,但仍需编写大量的 XML 映射文件和 SQL 语句,开发效率较低。而 MyBatis-Plus(简称 MP)作为 MyBatis 的增强工具,在不改变 MyBatis 原有功能的基础上,提供了单表 CRUD 的自动生成、分页、条件构造器等便捷功能,能极大提升开发效率。因此本次学习的核心目标是:
- 掌握 MyBatis-Plus 的环境搭建流程
- 理解 MyBatis-Plus 核心功能的使用原理
- 能通过 MyBatis-Plus 完成简单项目的单表操作
MyBatis-Plus 核心知识点学习
一、MyBatis-Plus 简介
MyBatis-Plus 是由国内团队开发的一款 MyBatis 增强工具,口号是 “为简化开发而生”。其核心特性包括:
- 无侵入:只做增强不做改变,兼容 MyBatis 所有原有功能
- 自动 CRUD:内置通用 Mapper、Service,无需编写 SQL 即可完成单表操作
- 分页插件:支持多种数据库的分页查询,且分页功能简单易用
- 条件构造器:强大的条件查询封装,无需手写复杂 SQL
- 代码生成器:可快速生成 Entity、Mapper、Service、Controller 等代码
二、环境搭建步骤(基于 Spring Boot 2.7.x)
1. 开发环境准备
| 工具 / 框架 | 版本 |
|---|---|
| JDK | 1.8 |
| Spring Boot | 2.7.10 |
| MyBatis-Plus | 3.5.3.1 |
| MySQL | 8.0.30 |
| Maven | 3.8.6 |
2. 创建 Spring Boot 项目
通过 IDEA 的 Spring Initializr 快速创建 Spring Boot 项目,选择基础依赖:Spring Web、MySQL Driver。
3. 引入 MyBatis-Plus 依赖
在 pom.xml 中添加 MyBatis-Plus 的依赖(注意排除 MyBatis 原生依赖,避免冲突):
xml
<!-- MyBatis-Plus 核心依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
4. 配置数据库连接与 MyBatis-Plus
在 application.yml 中配置数据库连接信息和 MyBatis-Plus 相关配置:
yaml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mp_demo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: 123456
# MyBatis-Plus 配置
mybatis-plus:
# 实体类别名包路径
type-aliases-package: com.example.mpdemo.entity
# Mapper 映射文件路径
mapper-locations: classpath:mapper/*.xml
# 配置日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
截图 1:application.yml 配置文件(此处插入本地截图:展示上述配置代码的 IDE 界面)
5. 编写实体类
以 User 实体类为例,使用 MyBatis-Plus 的注解标识主键和字段映射:
java
运行
package com.example.mpdemo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName("tb_user") // 对应数据库表名
public class User {
@TableId(type = IdType.AUTO) // 主键自增
private Long id;
private String username;
private String password;
private String email;
private String phone;
private Date createTime;
}
6. 编写 Mapper 接口
只需继承 MyBatis-Plus 的 BaseMapper 接口,即可获得内置的 CRUD 方法:
java
运行
package com.example.mpdemo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mpdemo.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 无需编写任何方法,BaseMapper 已提供CRUD功能
}
7. 启动类添加扫描注解(可选)
如果 Mapper 接口未添加 @Mapper 注解,可在启动类添加 @MapperScan 注解扫描 Mapper 包:
java
运行
package com.example.mpdemo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.mpdemo.mapper") // 扫描Mapper包
public class MpDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MpDemoApplication.class, args);
}
}
三、核心功能体验:自动 CRUD 与分页查询
1. 测试新增用户
在测试类中注入 UserMapper,调用 insert 方法:
java
运行
package com.example.mpdemo;
import com.example.mpdemo.entity.User;
import com.example.mpdemo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
@SpringBootTest
class MpDemoApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void testInsert() {
User user = new User();
user.setUsername("test_mp");
user.setPassword("123456");
user.setEmail("test@mp.com");
user.setPhone("13800138000");
user.setCreateTime(new Date());
// 调用BaseMapper的insert方法
int rows = userMapper.insert(user);
System.out.println("新增成功,影响行数:" + rows);
System.out.println("新增用户ID:" + user.getId());
}
}
截图 2:新增用户测试结果(此处插入本地截图:展示测试方法运行后控制台输出的新增成功日志)
2. 配置分页插件
MyBatis-Plus 的分页功能需要配置分页拦截器:
java
运行
package com.example.mpdemo.config;
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());
return interceptor;
}
}
3. 测试分页查询
java
运行
@Test
void testPage() {
// 创建分页对象:第1页,每页5条数据
Page<User> page = new Page<>(1, 5);
// 执行分页查询
userMapper.selectPage(page, null);
// 获取分页结果
System.out.println("总记录数:" + page.getTotal());
System.out.println("总页数:" + page.getPages());
System.out.println("当前页数据:" + page.getRecords());
}
截图 3:分页查询测试结果(此处插入本地截图:展示分页查询的控制台输出结果)
实战项目:用户信息管理系统
本次上课完成的实战项目是基于 Spring Boot + MyBatis-Plus 的用户信息管理系统,实现了用户的新增、查询、修改、删除和分页查询功能。
一、项目结构
plaintext
mpdemo/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ ├── mpdemo/
│ │ │ │ ├── MpDemoApplication.java
│ │ │ │ ├── config/
│ │ │ │ │ └── MyBatisPlusConfig.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── UserController.java
│ │ │ │ ├── entity/
│ │ │ │ │ └── User.java
│ │ │ │ ├── mapper/
│ │ │ │ │ └── UserMapper.java
│ │ │ │ └── service/
│ │ │ │ ├── UserService.java
│ │ │ │ └── impl/
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources/
│ │ │ ├── application.yml
│ │ │ └── mapper/
│ │ │ └── UserMapper.xml
│ └── test/
│ └── java/
│ └── com/
│ └── example/
│ └── mpdemo/
│ └── MpDemoApplicationTests.java
└── pom.xml
截图 4:项目结构截图(此处插入本地截图:展示 IDE 中的项目目录结构)
二、核心业务代码
1. Service 层
java
运行
// UserService 接口
public interface UserService extends IService<User> {
}
// UserServiceImpl 实现类
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
2. Controller 层
java
运行
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
// 新增用户
@PostMapping
public String addUser(@RequestBody User user) {
user.setCreateTime(new Date());
boolean save = userService.save(user);
return save ? "新增成功" : "新增失败";
}
// 分页查询用户
@GetMapping("/page")
public Page<User> pageUser(@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "5") Integer pageSize) {
return userService.page(new Page<>(pageNum, pageSize));
}
// 根据ID删除用户
@DeleteMapping("/{id}")
public String deleteUser(@PathVariable Long id) {
boolean remove = userService.removeById(id);
return remove ? "删除成功" : "删除失败";
}
}
三、接口测试
使用 Postman 测试用户新增接口,请求地址:http://localhost:8080/user,请求方式:POST,请求体为 JSON 格式:
json
{
"username": "test_postman",
"password": "654321",
"email": "postman@mp.com",
"phone": "13900139000"
}
截图 5:Postman 测试结果(此处插入本地截图:展示 Postman 中新增用户的成功响应)
学习过程中遇到的问题与解决
问题 1:启动项目时提示 “找不到 Mapper 接口”
现象:启动 Spring Boot 项目后,调用接口时报错 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)。原因:未正确配置 Mapper 扫描路径,导致 Spring 无法扫描到 Mapper 接口。解决方法:
- 在 Mapper 接口上添加
@Mapper注解; - 或在启动类上添加
@MapperScan("com.example.mpdemo.mapper")注解,指定 Mapper 包路径。截图 6:问题解决后的启动日志(此处插入本地截图:展示项目成功启动的控制台日志)
问题 2:分页查询时总记录数为 0,只返回当前页数据
现象:执行分页查询后,page.getTotal() 为 0,但 page.getRecords() 有数据。原因:未配置分页插件,MyBatis-Plus 无法自动计算总记录数。解决方法:在配置类中添加分页拦截器(如前文 MyBatisPlusConfig 类),确保分页插件生效。
问题 3:实体类字段与数据库表字段名不一致导致查询结果为 null
现象:查询用户信息时,部分字段(如 create_time)返回 null。原因:数据库表字段为下划线命名(create_time),实体类字段为驼峰命名(createTime),MyBatis-Plus 默认开启驼峰命名转换,但如果配置错误可能导致转换失效。解决方法:
- 确认
mybatis-plus.configuration.map-underscore-to-camel-case为true(默认开启); - 或使用
@TableField("create_time")注解显式指定字段映射。
学习总结
本次学习 MyBatis-Plus 收获颇丰,主要总结以下几点:
- 效率提升:MyBatis-Plus 的
BaseMapper和IService提供了丰富的 CRUD 方法,无需编写重复的 SQL 语句,极大减少了开发工作量,相比原生 MyBatis 开发效率提升约 50%。 - 功能强大:分页插件和条件构造器简化了复杂查询的编写,尤其是条件构造器,可通过链式调用快速构建多条件查询,比手写 SQL 更易维护。
- 易上手性:MyBatis-Plus 对 MyBatis 完全兼容,学习成本低,只需掌握核心注解和配置即可快速上手。
- 问题排查能力:在学习过程中遇到的各种问题,让我更深入理解了 Spring Boot 与 MyBatis-Plus 的整合原理,也提升了问题排查和解决的能力。
同时也认识到,MyBatis-Plus 虽然适合单表操作,但对于复杂的多表联查,仍需结合 MyBatis 的 XML 映射文件或注解编写 SQL,因此在实际开发中需根据业务场景灵活选择。
互动投票
为了更好地了解大家的学习需求,特设置以下投票:你最想深入学习 MyBatis-Plus 的哪个功能?
- 代码生成器
- 条件构造器高级用法
- 多表联查与自定义 SQL
- 乐观锁与逻辑删除
- 其他功能
1126

被折叠的 条评论
为什么被折叠?



