MybatisPlus高级特性
1. 公共字段自动填充
1.1 问题分析
1.2 基本功能实现
1.2.1 思路分析
1.2.2 代码实现
1). 实体类的属性上加入@TableField注解,指定自动填充的策略。
2). 按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口。
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
* 自定义元数据对象处理器
*/
@Component
@Slf4j
public class MyMetaObjecthandler implements MetaObjectHandler {
/**
* 插入操作,自动填充
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
log.info("公共字段自动填充[insert]...");
log.info(metaObject.toString());
metaObject.setValue("createTime", LocalDateTime.now());
metaObject.setValue("updateTime",LocalDateTime.now());
metaObject.setValue("createUser",new Long(1));
metaObject.setValue("updateUser",new Long(1));
}
/**
* 更新操作,自动填充
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
log.info("公共字段自动填充[update]...");
log.info(metaObject.toString());
metaObject.setValue("updateTime",LocalDateTime.now());
metaObject.setValue("updateUser",new Long(1));
}
}
1.3 功能完善
1.3.1 思路分析
1.3.2 ThreadLocal
ThreadLocal常用方法:
A. public void set(T value) : 设置当前线程的线程局部变量的值
B. public T get() : 返回当前线程所对应的线程局部变量的值
C. public void remove() : 删除当前线程所对应的线程局部变量的值
1.3.3 操作步骤
实现步骤:
1). 编写UserThreadLocal工具类,基于ThreadLocal封装的工具类
2). 在LoginCheckFilter的doFilter方法中调用BaseContext来设置当前登录用户的id
3). 在MyMetaObjectHandler的方法中调用BaseContext获取登录用户的id
1.3.4 代码实现
1). UserThreadLocal工具类
/**
* 基于ThreadLocal封装工具类,用户保存和获取当前登录用户id
*/
public class UserThreadLocal {
private UserThreadLocal() {
}
private static ThreadLocal<Long> THREADLOCAL = new ThreadLocal<>();
/**
* 设置值
*
* @param id
*/
public static void setCurrentId(Long id) {
THREADLOCAL.set(id);
}
/**
* 获取值
*
* @return
*/
public static Long getCurrentId() {
return THREADLOCAL.get();
}
public static void remove() {
THREADLOCAL.remove();
}
}
2).LoginCheckFilter中存放当前登录用户到ThreadLocal
3). MyMetaObjectHandler中从ThreadLocal中获取
1.3.5 功能测试
2. 逻辑删除
2.1 问题分析
2.2 思路分析
2.3 代码实现
2.3.1配置全局
配置yaml
mybatis-plus:
configuration:
#在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射 address_book ---> AddressBook
map-underscore-to-camel-case: true
#日志输出
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: ASSIGN_ID # 全局配置数据库id生成的策略
logic-delete-field: deleted # 全局逻辑删除的实体字段名(实体类)
logic-delete-value: 1 # 逻辑已删除值(默认为1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为0)