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. 最好的在线PDF转换工具服务

    工作中有时候会碰到需要转换PDF文件的情况,现在网上就要很多免费的在线工具,可以进行PDF文件的转换,下面就来介绍一些可以直接在浏览器中将文档.电子表格.和图片转换为PDF或者互相转换的服务工具. ​ ...

  2. 容器化部署wordpress个人博客系统lnmp环境[自定义网络]

    容器化部署个人博客系统lnmp环境 #告警: WARNING: IPv4 forwarding is disabled. Networking will not work. 96c083a8b5811 ...

  3. python-使用pyecharts绘制各省份985学校数量图

    1.环境 代码运行环境:python3.7 相关的库:pyecharts 1.7.1 代码编辑器:visual studio code 2.目的 通过使用pyecharts库,来绘制全国各省985高校 ...

  4. 数据结构之栈(Java,C语言的实现)以及相关习题巩固

    目录 栈 概念以及代码实现 例题 232. 用栈实现队列 1614. 括号的最大嵌套深度 234. 回文链表 1614. 括号的最大嵌套深度 LCR 123. 图书整理 I 206. 反转链表 402 ...

  5. 抖音abogus逆向分析

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

  6. 关于 cnblogs 中的神秘操作

    关于 cnblogs 中的神秘操作 批量替换 利用 metaweblog 批量操作 代码参考:jeefies - jcnapi 不是很完整 其中 BLOGS_BLOGID 指的是 https://ww ...

  7. 在 Windows 10、Windows 11 中打开 IE 浏览器

    在 Windows 10.Windows 11 中打开 IE 浏览器 新建 OpenIE.vbs 文件,输入以下内容后保存: Set OpenIE = CreateObject("Inter ...

  8. 为什么boolean 类型的字段不建议使用is开头?

    对于非boolean类型的参数,getter和setter方法命名的规范是以get和set开头 对于boolean类型的参数,setter方法是以set开头,但是getter方法命名的规范是以is开头 ...

  9. jsp和servlet的区别、共同点、各自应用的范围?

    JSP是Servlet技术的扩展,本质上就是Servlet的简易方式.JSP编译后是"类servlet".Servlet和JSP最主要的不同点在于: Servlet的应用逻辑是在J ...

  10. MySQL Explain 关键字详解

    概述 explain 关键字可以模拟执行 sql 查询语句,输出执行计划,分析查询语句的执行性能 使用方式如下:explain + sql explain select * from t1 执行计划各 ...