文章目录
1. 概述
1.1 什么是Mybatis-Plus
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
官网:https://mybatis.plus/ 或 https://mp.baomidou.com/
几个特性:
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,继承BaseMapper<POJO>即可使用
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence)
- 内置分页插件
- 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
1.2 使用步骤
- 导入依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
- 在Mapper中继承BaseMapper<POJO>
1.3 MPConfig类
@Configuration
@MapperScan("包路径")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
// 配置分页插件
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
// 配置乐观锁插件
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
1.4 表前缀:@TableName
找不到表时的解决方案:
1)在POJO中加上注解@TableName(“表名”)
2)在application.yml中设置表的前缀, 此时会自动将前缀与BaseMapper中的泛型POJO类名拼接
mybatis-plus:
global-config:
db-config:
table-prefix: tbl_
1.5 @TableField
解决字段名不一致问题(非驼峰)与其他问题:@TableField
value属性用于解决名字不一致问题:value=“字段名”
exist属性用于解决某成员变量是否为表中字段问题, 默认值true : exist = false
select属性用于解决不加入查询字段的问题(如password) : select = false
fill属性 : 自动填充
1.5.1 自动填充
项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。
我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作:
(1)数据库表中添加自动填充字段
在User表中添加datetime类型的新的字段 create_time、update_time
(2)实体上添加注解
// insert时执行
@TableField(fill = FieldFill.INSERT)
// update时执行
@TableField(fill = FieldFill.UPDATE)
// insert与update都会执行
@TableField(fill = FieldFill.INSERT_UPDATE)
(3)实现元对象处理器接口
创建一个MyMetaObjectHandler类实现MetaObjectHandler类, 并重写insertFill与updateFill方法, 分别表示插入与更新时会对该元数据执行的操作(元数据:粗略理解就是表中字段)
记得加上@Component注解, 不然Spring得不到就无法执行处理
接着在这俩个方法中使用setFieldValByName(nameStr,执行的操作 , MetaObject)方法对字段进行处理:
- nameStr : @TableField字段下的成员变量名称(字符串形式)
- 执行的操作 : 每次insert或者update对该元数据进行的操作, 例如new Date(), 1等等
- MetaObject : 重写方法传入参数
示例:
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class);
@Override
public void insertFill(MetaObject metaObject) {
LOGGER.info("start insert fill ....");
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
// 逻辑删除:
this.setFieldValByName("deleted", 0, metaObject);
// 乐观锁:
this.setFieldValByName("version", 1, metaObject);
}
@Override