MyBatisPlus笔记之逻辑删除、枚举处理器、JSON处理器
逻辑删除
MybatisPlus提供了逻辑删除功能,无需改变方法调用的方式,而是在底层帮我们自动修改CRUD的语句。我们要做的就是在application.yaml文件中配置逻辑删除的字段名称和值即可:
比如在淘宝订单中,我们偷偷买了不为人知的好东西,为了不被女朋友发现,我需要删除次订单。但在数据库中不能真的删除此订单,因为商家需要依靠这份数据进行数据统计。因此,我们可以在数据库用某一标识符标记这份数据是否逻辑删除,如果逻辑删除则不返回给客户。
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted #配置逻辑删除字段
# logic-delete-value:1 #如果逻辑删除则设置为1,不手动设置则默认为1
# logic-not-delete-value:0 #如果逻辑未删除则设置为0,不手动设置则默认为0
逻辑删除本身也有自己的问题,比如:
-
会导致数据库表垃圾数据越来越多,影响查询效率
-
SQL中全都需要对逻辑删除字段做判断,影响查询效率
因此,不太推荐采用逻辑删除功能,如果数据不能删除,可以采用把数据迁移到其它表的办法。
枚举处理器
实现PO类中的枚举类型变量与数据库字段的转换
在application.yml中配置全局枚举处理器:
给枚举中的与数据库对应value值添加@EnumValue注解
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
@Getter
public enum UserStatus {
NORMAL(1, "正常"),
FROZEN(2, "冻结"),
;
@EnumValue // 枚举值映射数据库存储值
private final int value;
@JsonValue // 枚举值序列化时映射的值,人话就是返回给前端的值
private final String desc;
UserStatus(int value, String desc) {
this.value = value;
this.desc = desc;
}
}
@EnumValue
枚举值映射数据库存储值- @JsonValue 枚举值序列化时映射的值,人话,就是返回给前端的值
在配置文件中配置统一的枚举处理器,实现类型转换
mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
JSON处理器
如果数据库有一个json格式的数据,那么我们可以用一个对象封装这个JSON格式的每一个数据。然后在需要与数据库对应的实体类表上添加上@TableName(autoResultMap = true)//开启字符串转json格式
注解,然后再需要与数据库映射的字段添加上@TableField(typeHandler = JacksonTypeHandler.class)
注解。
封装:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor(staticName = "of") //运行静态调用,类名.xxx
public class UserInfo {
private Integer age;
private String intro;
private String gender;
}
JSON格式转换:
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.itheima.mp.enmus.UserStatus;
import lombok.Data;
import org.apache.ibatis.type.JapaneseDateTypeHandler;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Collection;
@Data
@TableName(autoResultMap = true)//开启字符串转json格式
public class User implements Serializable {
/**
* 用户id
*/
private Long id;
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 注册手机号
*/
private String phone;
/**
* 详细信息
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private UserInfo info;
/**
* 使用状态(1正常 2冻结)
*/
private UserStatus status;
/**
* 账户余额
*/
private Integer balance;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
}