一、MyBatis-Plus 简介
MyBatis-Plus(简称 MP) 是在 MyBatis 基础上增强的一个开源框架,目标是 简化开发,提高效率。
官方口号:
只做增强,不做改变。
也就是说:
-
不改变 MyBatis 的使用方式
-
在其基础上 自动生成大量 CRUD 代码
-
开发者 几乎不用写 SQL
官方组织:
MyBatis-Plus
二、为什么使用 MyBatis-Plus
在使用原始 MyBatis 时,开发者通常需要:
-
编写 Mapper 接口
-
编写 XML SQL
-
编写 CRUD 语句
-
编写分页逻辑
例如一个简单查询:
sql
select * from user where id = 1;
都需要写 XML。
而 MyBatis-Plus 已经帮我们实现好了。
例如:
java
userMapper.selectById(1);
即可完成查询。
优点:
-
减少 SQL 编写
-
内置 CRUD
-
强大的条件构造器
-
自动分页
-
逻辑删除
-
代码生成器
-
性能分析插件
三、MyBatis-Plus 核心架构
MyBatis-Plus 的核心组件如下:
Controller
↓
Service
↓
Mapper
↓
MyBatis-Plus
↓
Database
主要组件:
| 组件 | 作用 |
|---|---|
| Entity | 实体类 |
| Mapper | 数据库操作接口 |
| Service | 业务逻辑 |
| Wrapper | 条件构造器 |
四、MyBatis-Plus 快速入门
1 添加依赖
Maven 依赖:
XML
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
数据库驱动:
XML
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
2 创建数据库表
java
CREATE TABLE user(
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
email VARCHAR(50)
);
3 创建实体类
java
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
4 创建 Mapper
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
继承:
java
BaseMapper<T>
即可拥有 所有 CRUD 方法。
5 测试 CRUD
java
@Autowired
private UserMapper userMapper;
查询
java
User user = userMapper.selectById(1);
查询全部
java
List<User> list = userMapper.selectList(null);
插入
java
User user = new User();
user.setName("Tom");
user.setAge(20);
userMapper.insert(user);
更新
java
User user = new User();
user.setId(1);
user.setName("Jerry");
userMapper.updateById(user);
删除
java
userMapper.deleteById(1);
五、条件构造器(Wrapper)
MyBatis-Plus 提供 强大的条件构造器:
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
推荐使用:
LambdaQueryWrapper
优点:
-
防止字段写错
-
支持 lambda 表达式
查询示例
查询年龄大于18:
java
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.gt(User::getAge,18);
List<User> list = userMapper.selectList(wrapper);
多条件查询
java
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.like(User::getName,"Tom")
.gt(User::getAge,18)
.orderByDesc(User::getAge);
List<User> list = userMapper.selectList(wrapper);
生成 SQL:
sql
select * from user
where name like '%Tom%'
and age > 18
order by age desc
六、分页插件
MyBatis-Plus 自带分页插件。
1 配置分页
java
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor interceptor(){
MybatisPlusInterceptor interceptor =
new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(
new PaginationInnerInterceptor());
return interceptor;
}
}
2 分页查询
java
Page<User> page = new Page<>(1,5);
Page<User> result = userMapper.selectPage(page,null);
参数:
Page<>(当前页, 每页数量)
返回:
分页数据
七、逻辑删除
逻辑删除:
不删除数据
只修改状态
例如:
deleted = 1
表结构
sql
ALTER TABLE user ADD deleted INT DEFAULT 0;
实体类
java
@TableLogic
private Integer deleted;
删除时:
java
userMapper.deleteById(1);
实际 SQL:
sql
UPDATE user SET deleted = 1 WHERE id = 1
查询时自动过滤:
java
deleted = 0
八、自动填充字段
例如:
create_time
update_time
实体类
java
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
自动填充处理器
java
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName(
"createTime",
LocalDateTime.now(),
metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName(
"updateTime",
LocalDateTime.now(),
metaObject);
}
}
九、代码生成器
MyBatis-Plus 可以 自动生成代码:
生成:
Entity
Mapper
Service
Controller
只需要输入:
数据库地址
用户名
密码
表名
即可生成完整项目代码。
适合:
快速开发后台系统
十、MyBatis vs MyBatis-Plus
| 对比 | MyBatis | MyBatis-Plus |
|---|---|---|
| SQL编写 | 手写SQL | 大量自动生成 |
| CRUD | 自己写 | 自动生成 |
| 分页 | 自己写 | 内置 |
| 开发效率 | 较低 | 很高 |
| 学习成本 | 较高 | 较低 |
总结:
MyBatis-Plus = MyBatis + CRUD增强
十一、MyBatis-Plus 面试常问问题
1 MyBatis-Plus 和 MyBatis 的关系
MyBatis-Plus 是:
MyBatis 的增强工具
特点:
只增强,不改变
2 BaseMapper 有哪些方法
常见方法:
java
insert()
deleteById()
updateById()
selectById()
selectList()
selectPage()
3 Wrapper 是什么
Wrapper 是:
SQL 条件构造器
用于动态构建 SQL。
常见:
QueryWrapper
LambdaQueryWrapper
UpdateWrapper
4 MyBatis-Plus 如何实现分页
通过:
PaginationInnerInterceptor
拦截 SQL 自动分页。
十二、总结
MyBatis-Plus 的核心优势:
-
减少 SQL 编写
-
内置 CRUD
-
强大的条件构造
-
自动分页
-
逻辑删除
-
代码生成器
开发效率可以提高 70% 以上。
非常适合:
Spring Boot + MyBatis-Plus