开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情
自动填充功能
有些时候我们可能会有这样的需求,插入或者更新数据时,希望有些字段可以自动填充数据,比如密码、version等。在MP中提供了这样的功能,可以实现自动填充。
添加@TableField注解
@TableField(fill = FieldFill.INSERT) //插入数据时进行填充
private String password;
为password添加自动填充功能,在新增数据时有效。
FieldFill提供了多种模式选择:
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入时填充字段
*/
INSERT,
/**
* 更新时填充字段
*/
UPDATE,
/**
* 插入和更新时填充字段
*/
INSERT_UPDATE
}
编写MyMetaObjectHandler
package com.wyh.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
/**
* @description: MP字段填充拦截器
* @author: 魏一鹤
* @createDate: 2022-09-07 21:54
**/
// 把配置文件加入到spring容器中
@Component
// 需要实现MetaObjectHandler接口并实现下面两个方法
public class MyMetaObjectHandler implements MetaObjectHandler {
// 在插入数据的时候填充
@Override
public void insertFill(MetaObject metaObject) {
// 先获取到password的值进行判断
Object password = getFieldValByName( "password" , metaObject);
// 如果为空就进行填充
if(null==password){
setFieldValByName( "password" , "888888" ,metaObject);
}
// 如果不为空就不做处理
}
// 更新数据时填充
@Override
public void updateFill(MetaObject metaObject) {
}
}
测试
注意此时我们是没有给password赋值的 可以发现我们自动填充起效了
逻辑删除
开发系统时,有时候在实现功能时,删除操作需要实现逻辑删除,所谓逻辑删除就是将数据标记为删除,而并非真正 的物理删除(非DELETE操作),查询时需要携带状态条件,确保被标记的数据不被查询到。这样做的目的就是避免数据被真正的删除。
当然我们可以手动写update去修改状态,这样有些麻烦
MP就提供了这样的功能,方便我们使用,接下来我们一起学习下。
修改表结构
为tb_user表增加deleted字段,用于表示数据是否被删除,1代表删除,0代表未删除。
ALTER TABLE `tb_user` ADD COLUMN `deleted` int(1) NULL DEFAULT 0 COMMENT '1代表删除,0代表未删除' AFTER `version`;
同时,也修改User实体,增加deleted属性并且添加@TableLogic注解:
@TableLogic
private Integer deleted;
我们这里最后一条数据状态为1 也就是说被删除了
配置
application.properties:
# 逻辑已删除值(默认为 1)
mybatis-plus.global-config.db-config.logic-delete-value=1
# 逻辑未删除值(默认为 0)
mybatis-plus.global-config.db-config.logic-not-delete-value=0
测试
可以发现确实把删除的操作改为修改了
UPDATE tb_user SET deleted=1 WHERE id=12 AND deleted=0
但是查询的时候如何不查询出来删除的数据呢?
我们测试下查询方法
发现自动帮我们追加了查询条件 也就是只查询出状态正常的数据
SELECT id,user_name,password,name,age,email,deleted FROM tb_user WHERE id=12 AND deleted=0
通用枚举
它解决了繁琐的配置,可以让mybatis 优雅的使用枚举属性!
它不仅可以在插入的时候使用,也可以在查询,条件查询的场景下使用!
修改表结构
新增一个sex字段 1-男,2-女
ALTER TABLE `tb_user`
ADD COLUMN `sex` int(1) NULL DEFAULT 1 COMMENT '1-男,2-女' AFTER `deleted`;
定义枚举
package com.wyh.enums;
import com.baomidou.mybatisplus.core.enums.IEnum;
/**
* @description: 性别枚举
* @author: 魏一鹤
* @createDate: 2022-09-07 22:26
**/
public enum SexEnum implements IEnum<Integer> {
MAN(1, "男" ),
WOMAN(2, "女" );
private int value;
private String desc;
SexEnum(int value, String desc) {
this.value = value;
this.desc = desc;
}
@Override
public Integer getValue() {
return this.value;
}
@Override
public String toString() {
return this.desc;
}
}
配置
# 配置枚举 扫描该包下面的全部枚举 放到mp中供我们使用
mybatis - plus.type - enums - package=com.wyh.enums
修改实体
// 性别 枚举类型
private SexEnum sex;
测试
// 测试AR新增操作
@Test
public void testInsert(){
User user = new User();
user.setName( "锐雯" );
user.setEmail( "lol@qq.com" );
user.setAge(99);
user.setUserName( "xxx" );
user.setSex(SexEnum.WOMAN);
// 调用AR的插入方法插入数据
boolean insert = user.insert();
System.out.println(user.getId());
System.out.println( "是否成功:" +insert);
}
如果是查询的话 我们也会字段帮我们改变枚举值