public class MybatisPlusAutoFillHandler implements MetaObjectHandler {

    //插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
//三个参数:字段名,字段值,元对象参数
this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
this.setFieldValByName("createUser", BaseContext.getCurrentId(), metaObject);
this.setFieldValByName("updateUser", BaseContext.getCurrentId(), metaObject);
log.info("end insert fill ....");
} //修改时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
this.setFieldValByName("updateUser", BaseContext.getCurrentId(), metaObject);
log.info("start update fill ....");
}
}

上述为mp的自动填充策略处理器

  //创建时间
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime; //更新时间
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;

上述为entity层的内容,tablefield注解中说明了这个属性是在新增/更新的时候会修改

以上为mybatisplus的自动填充策略,需要添加一个处理器,在实体类中写好注解。

但是,这里也出现了一个问题:一旦我们不使用mybatisplus的函数式编程方法,而是再在mapper层中添加新的自定义的方法,上述注解就会不再生效。

当然,问题也不是不可以解决,我们只需要再启动mybatis的自动填充策略,即可解决上述问题:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {
//指定数据操作类型
OperationType value(); }

上述内容定义了@Autofill注解

@Aspect
@Component
@Slf4j
public class AutoFillAspect {
@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")
public void autoFillPointCut() {
}
@Before("autoFillPointCut()")
public void autoFill(JoinPoint joinPoint) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象
OperationType operationType = autoFill.value();//获得了操作类型insert / update Object[] args = joinPoint.getArgs();
if (args == null || args.length == 0) {
return;
}
//这里约定mapper层的第一个参数为实体
Object object = args[0]; LocalDateTime now = LocalDateTime.now();
Long currentId = BaseContext.getCurrentId(); if (operationType == OperationType.UPDATE) {
Method setUpdateTime = object.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
setUpdateTime.invoke(object,now);
} else if (operationType==OperationType.INSERT){
Method setCreateTime = object.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
Method setUpdateTime = object.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
setCreateTime.invoke(object,now);
setUpdateTime.invoke(object,now);
}
}
}

上述内容为自动填充内容的切面函数,尤其需要注意的是:这个方法中约定了:mapper层的第一个参数必须为实体

@AutoFill(value = OperationType.UPDATE)
void mUpdate(Category category);

最后在mapper层中我们只需要添加上述注解即可实现mybatis的自动填充策略

总结:

在我们使用mybatisplus与mybatis的时候,

自动填充策略是可以混用的,

但是我们只写了mybatisplus的自动填充策略是不可以为自己手写的mybatis服务的,

而我们写的mybatis的自动填充策略只能应用于mapper层,mybatisplus也不能适用。

也就是说,mybatis与mybatisplus的使用必须分清楚,以免造成多余的混淆与不便

关于mybatisplus与mybatis的自动填充混用问题的更多相关文章

  1. Mybatis-Plus使用@TableField实现自动填充日期

    一.前言 我们在日常开发中经常使用ORM框架,比如Mybatis.tk.Mybatis.Mybatis-Plus.不过最广泛的还是Mybatis-Plus,我们的一些表,都会有创建时间.更新时间.创建 ...

  2. SpringBoot-Mybatis_Plus学习记录之公共字段自动填充

    一.应用场景 平时在建对象表的时候都会有最后修改时间,最后修改人这两个字段,对于这些大部分表都有的字段,每次在新增和修改的时候都要考虑到这几个字段有没有传进去,很麻烦.mybatisPlus有一个很好 ...

  3. 如何自动填充SQL语句中的公共字段

    1. 前言 我们在设计数据库的时候一定会带上新增.更新的时间.操作者等审计信息. 之所以带这些信息是因为假如有一天公司的数据库被人为删了,尽管可能有数据库备份可以恢复数据.但是我们仍然需要追踪到这个事 ...

  4. 小书MybatisPlus第9篇-常用字段默认值自动填充

    本文为Mybatis Plus系列文章的第9篇,前8篇访问地址如下: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总 ...

  5. 项目集成seata和mybatis-plus冲突问题解决方案:(分页插件失效, 自动填充失效, 自己注入的id生成器失效 找不到mapper文件解决方案)

    项目集成seata和mybatis-plus,seata与mybatis-plus冲突问题(所有插件失效,自动填充失效,找不到mapper文件解决方案) 自动填充代码: package com.fro ...

  6. mybatis plus 增删改自动填充字段值

    说明 本文实现以下需求效果 创建数据时自动填充 createUserId 和 createTime 更新数据时自动填充 updateUserId 和 updateTime(每次修改都自动填充新的 up ...

  7. MybatisPlus自动填充公共字段的策略

    背景:数据库中多个表有时间字段,并且字段名一致 需求:该时间字段由MybatisPlus自动插入和更新,业务代码无需处理 方法: 一.创建基础实体[BaseEntity],定义需要处理的公共字段(创建 ...

  8. 【mybatis-plus】主键id生成、字段自动填充

    一.主键id的生成 数据库表里通常都会有一个主键id,来作为这条数据的唯一标识. 常见的方式 数据库自动增长 这种很常见了,可以做到全库唯一.因为id是天然排序的,对于涉及到排序的操作会很方便. UU ...

  9. MP(MyBatis-Plus)的自动填充功能

    什么是自动填充 有些表中会有更新时间.创建时间.更新人或者创建人这些字段. 每次对数据进行新增.删除.修改时都需要对这些字段进行设置.传统的做法是在进行这些操作前,对Entity的字段进行set设置, ...

  10. Mybatis plus通用字段自动填充的最佳实践总结

    在进行持久层数据维护(新增或修改)的时候,我们通常需要记录一些非业务字段,比如:create_time.update_time.update_by.create_by等用来维护数据记录的创建时间.修改 ...

随机推荐

  1. OC的引用计数

    一.引用计数 引用计数是Objetive-C语言的内存管理机制,用于管理OC对象(通常指包含isa指针的结构体)的内存. 一个对象的引用计数为大于0的计数,表示这个对象被持有,不能被释放,当引用计数为 ...

  2. 抖音abogus逆向分析

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 aHR0cHM6 ...

  3. jquery的折叠动画 渐隐渐显动画

     <button name="up">折叠隐藏</button>     <button name="down">折叠显示& ...

  4. Vue3等比例缩放图片组件

    本文由 ChatMoney团队出品 有些情况我们需要在各种刁钻的情况下都要保持图片比例不变,比如用户缩放窗口等改变布局的情况.实现原理就是通过容器的宽度和内边距在保持你想要的比例. 以下是基础功能的组 ...

  5. 极限科技(INFINI labs)荣获中国信通院大数据“星河”标杆案例

    12 月 6 日,由中国信息通信研究院和中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)共同组织的 2023 大数据"星河(Galaxy)"案例评选结果正式公示. ...

  6. java8 Lambda 测试示例

    import com.google.gson.Gson; import org.junit.Test; import java.util.Arrays; import java.util.IntSum ...

  7. WebUI自动化测试-监听元素有无变化

    from datetime import datetime,timedelta from selenium.webdriver.common.by import By def get_inocSum( ...

  8. 在C#中进行单元测试

    单元测试 前言 时隔多个月,终于抽空学习了点新知识,那么这次来记录一下C#怎么进行单元测试,单元测试是做什么的. 我相信大部分刚毕业的都很疑惑单元测试是干什么的?在小厂实习了6个月后,我发现每天除了写 ...

  9. OpenFOAM v2306 安装

    参考 https://develop.openfoam.com/Development/openfoam/-/wikis/precompiled/debian curl https://dl.open ...

  10. python基础-集合set { }

    集合的定义和操作 集合的特性: 元素数量 支持多个 元素类型 任意 下标索引 支持 重复元素 不支持 可修改性 支持 数据有序 否 使用场景 不可重复的数据记录场景 # 定义集合 my_set = { ...