MybatisPlus高级特性

1. 公共字段自动填充

1.1 问题分析

MybatisPlus高级特性-LMLPHP

1.2 基本功能实现

1.2.1 思路分析

1.2.2 代码实现

1). 实体类的属性上加入@TableField注解,指定自动填充的策略。

MybatisPlus高级特性-LMLPHP

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 思路分析

MybatisPlus高级特性-LMLPHP

MybatisPlus高级特性-LMLPHP

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

MybatisPlus高级特性-LMLPHP

3). MyMetaObjectHandler中从ThreadLocal中获取

MybatisPlus高级特性-LMLPHP

MybatisPlus高级特性-LMLPHP

1.3.5 功能测试

2. 逻辑删除

2.1 问题分析

MybatisPlus高级特性-LMLPHP

2.2 思路分析

2.3 代码实现

2.3.1配置全局

配置yaml

MybatisPlus高级特性-LMLPHP

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)

MybatisPlus高级特性-LMLPHP

2.3.2实体类中

MybatisPlus高级特性-LMLPHP

08-09 21:57