目录
防止全表更新和删除
在实际开发中,全表更新和删除是非常危险的操作,在Mybatis-Plus中,提供了插件来防止这种危险操作的发生。
怎么实现呢?——创建一个拦截器,在config类中创建。
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// BlockAttackInnerInterceptor就是防止全表更新和删除的拦截器
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
MybatisPlusInterceptor是MyBatis-Plus中用于管理SQL拦截逻辑的核心类
addInnerInterceptor 方法用于向 MybatisPlusInterceptor 添加内部拦截器
BlockAttackInnerInterceptor是MyBatis-Plus提供的一个拦截器,它用于防止全表更新和删除的 SQL 操作。它会拦截 UPDATE 和 DELETE 语句,确保执行这些操作时带有明确的 WHERE 条件,否则会抛出异常,防止误操作。
逻辑删除
方式一:类中字段配置
public class User{
@TableId
private Long id;
private String name;
private Integer age;
private String email;
@TableLogic(value = "1", delval = "0")
private Integer status;
}
当用mybatis-plus自带的delete去删除记录时,就只是把status置于0
当用mybatis-plus自带的select去查询记录时,就只查询status等于1的数据
方式二:配置文件全局配置
通用枚举
枚举类的创建
public enum GenderEnum {
MAN(0,"男"),
WOMAN(1,"女");
@EnumValue
private Integer gender;
private String genderName;
GenderEnum(Integer gender, String genderName) {
this.gender = gender;
this.genderName = genderName;
}
}
@EnumValue 注解的作用是什么?
让该属性作为插入到数据库中的数据
User user = new User();
user.setName("Joel");
user.setAge(20);
user.setEmail("Joel@123.com");
user.setStatus(1);
user.setGender(GenderEnum.MAN);
userMapper.insert(user);
自动填充
使用场景
数据库中有 create_time 和 update_time 两个字段,希望插入、更新数据的时候,这两个字段自动更新。
使用步骤
1.在实体类中对应的属性上添加相关注解
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
2.添加全局处理器
@Component
public class MyMetaHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
setFieldValByName("createTime", new Date(), metaObject);
setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
setFieldValByName("updateTime", new Date(), metaObject);
}
}
当然,实际开发中注意mysql和java工程环境的时区是否正确一致。
字段类型处理器
在某些场景下,我们在实体类中是使用Map集合作为属性接收前端传递过来的数据,但是这些数据存储在数据库时,我们使用的是json格式的数据进行存储,json本质是一个字符串,就是varchar类型。那怎么做到实体类的Map类型和数据库的varchar类型相互转换呢?这里就需要使用到字段类型处理器来完成。
字段类型处理器的实现方式
@TableName(autoResultMap = true)
public class User {
@TableId
private Long id;
private String name;
private Integer age;
private String email;
@TableLogic(value = "1", delval = "0")
private Integer status;
private GenderEnum gender;
@TableField(typeHandler = FastjsonTypeHandler.class)
private Map<String, String> contact; //联系方式
}
在字段上添加@TableField(typeHandler = FastjsonTypeHandler.class)是为了将数据插入到数据库中时实现map转成json。
@TableName(autoResultMap = true)是为了从数据库中读出时将json转成map。
当然,别忘了在pom文件中引入 Fastjson 的依赖哦。
标签:private,class,实用,Plus,user,Integer,Mybatis,new,public From: https://blog.csdn.net/m0_75276797/article/details/143979508