java 公共字段填充

公共字段填充

  • 1、mybatis-plus
  • 2、mybatis 使用注解加aop
    • 2.1 自定义注解
    • 2.2 自定义切面类
    • 2.3 在mapper上添加上自定义的注解

1、mybatis-plus

通过在类上使用如下的注解

@TableField(fill = FieldFill.INSERT) 是 MyBatis-Plus 中的注解,用于自动填充字段的值。MyBatis-Plus 是基于 MyBatis 的一个增强工具,所以这种注解和功能是属于 MyBatis-Plus 的特性。

在 MyBatis-Plus 中,你可以使用 @TableField(fill = FieldFill.INSERT) 注解来自动填充字段值,比如在插入数据时自动设置创建时间或更新时间。为了使用这个功能,你需要定义一个处理器来填充这些字段。

package com.cky.pojo;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;/*** 分类*/
@Data
public class Category implements Serializable {private static final long serialVersionUID = 1L;private Long id;//类型 1 菜品分类 2 套餐分类private Integer type;//分类名称private String name;//顺序private Integer sort;//创建时间@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;//更新时间@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;//创建人@TableField(fill = FieldFill.INSERT)private Long createUser;//修改人@TableField(fill = FieldFill.INSERT_UPDATE)private Long updateUser;//是否删除@TableField(select = false)private Integer isDeleted;}

之后再定义一个元数据处理器

package com.cky.common;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.LocalDate;
import java.time.LocalDateTime;/*** @ClassName MyMetaObjectHandler* @Description TODO* @Author lukcy* @Date 2024/6/25 9:12* @Version 1.0*/
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {metaObject.setValue("createTime", LocalDateTime.now());metaObject.setValue("updateTime", LocalDateTime.now());metaObject.setValue("createUser", MythreadLocal.getCurrendId());metaObject.setValue("updateUser",MythreadLocal.getCurrendId() );}@Overridepublic void updateFill(MetaObject metaObject) {long id = Thread.currentThread().getId();log.info("当前线程id{}",id);metaObject.setValue("updateTime", LocalDateTime.now());metaObject.setValue("updateUser",MythreadLocal.getCurrendId());}
}

2、mybatis 使用注解加aop

在这里插入图片描述

2.1 自定义注解

package com.sky.annotation;import com.sky.enumeration.OperationType;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @ClassName AutoFilled* @Description 自定义填充注解* @Author lukcy* @Date 2024/7/7 8:58* @Version 1.0*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFilled {OperationType value();
}

2.2 自定义切面类

package com.sky.aspect;import com.sky.annotation.AutoFilled;
import com.sky.constant.AutoFillConstant;
import com.sky.context.BaseContext;
import com.sky.enumeration.OperationType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;import java.lang.reflect.Method;
import java.time.LocalDateTime;/*** @ClassName AutoFilledAspect* @Description 自定义填充切面类* @Author lukcy* @Date 2024/7/7 8:59* @Version 1.0*/
@Component
@Slf4j
@Aspect
public class AutoFilledAspect {//切入点  定义了只有在哪些包下 以及有哪些注解才其效果@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFilled)")public void AutoFilledPointCut(){}//通知 前置通知 因为要在执行之前给字段赋值@Before("AutoFilledPointCut()")public void autoFilled(JoinPoint joinPoint){log.info("前置通知....");//获取方法上的注解确定是insert还是updateMethodSignature signature = (MethodSignature) joinPoint.getSignature();//获得签名AutoFilled annotation = signature.getMethod().getAnnotation(AutoFilled.class); //获得注解OperationType operationType = annotation.value();//获得参数 获得实体Object[] args = joinPoint.getArgs();if(args.length==0 || args==null){return;}Object entity = args[0];//约定第一个参数为实体//获取要赋值的内容LocalDateTime now = LocalDateTime.now();Long currentId = BaseContext.getCurrentId();//通过反射给属性赋值if(operationType==OperationType.INSERT){//赋值4个try {Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);setCreateTime.invoke(entity,now);setCreateUser.invoke(entity,currentId);setUpdateTime.invoke(entity,now);setUpdateUser.invoke(entity,currentId);} catch (Exception e) {e.printStackTrace();}}else if(operationType==OperationType.UPDATE){Method setUpdateTime = null;try {setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);setUpdateTime.invoke(entity,now);setUpdateUser.invoke(entity,currentId);} catch (Exception e) {e.printStackTrace();}}}
}

2.3 在mapper上添加上自定义的注解

比如:

package com.sky.mapper;import com.github.pagehelper.Page;
import com.sky.annotation.AutoFilled;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.entity.Category;
import com.sky.enumeration.OperationType;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;/*** @ClassName CategoryMapper* @Description TODO* @Author lukcy* @Date 2024/7/6 11:06* @Version 1.0*/
@Mapper
public interface CategoryMapper {@AutoFilled(value = OperationType.INSERT)void insert(Category category);Page<Category> page(CategoryPageQueryDTO categoryPageQueryDTO);@AutoFilled(value = OperationType.UPDATE)void editstatus(Category category);/*** 根据id删除分类* @param id*/@Delete("delete from category where id = #{id}")void deletebyId(Long id);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/42276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单且循序渐进地查找软件中Bug的实用方法

“Bug”这个词常常让许多开发者感到头疼。即使是经验丰富、技术娴熟的开发人员在开发过程中也难以避免遭遇到 Bug。 软件中的故障会让程序员感到挫败。我相信在你的软件开发生涯中&#xff0c;也曾遇到过一些难以排查的问题。软件中的错误可能会导致项目无法按时交付。因此&…

解决 Docker 安装时“无法获取 dpkg 前端锁”错误的有效方法

在安装 Docker 的过程中&#xff0c;不少用户可能会遇到“无法获取 dpkg 前端锁”的错误提示。这是一个较为常见但也令人困扰的问题。下面为您详细介绍几种可能的解决方法&#xff1a; 方法一&#xff1a;检查并终止相关进程 首先&#xff0c;您可以通过以下命令检查是否有正…

Linux进程、线程——保姆级助理解

目录 1、进程&#xff08;Process&#xff09; 1.1 进程基本概念&#xff1a; 1.2 进程分类 1.3 进程的特征 1.4 进程和程序的区别 1.5 进程的状态 1.6 进程的创建——Fork()函数 1.6.1 简介 1.6.2 使用 1.7 进程终止 2、线程&#xff08;Thread&#xff09; 1.1 线…

Git管理源代码、git简介,工作区、暂存区和仓库区,git远程仓库github,创建远程仓库、配置SSH,克隆项目

学习目标 能够说出git的作用和管理源代码的特点能够如何创建git仓库并添加忽略文件能够使用add、commit、push、pull等命令实现源代码管理能够使用github远程仓库托管源代码能够说出代码冲突原因和解决办法能够说出 git 标签的作用能够使用使用git实现分支创建&#xff0c;合并…

排序 -- 冒泡排序和快速排序

一、 交换排序 1、基本思想 所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0c;交换排序的特点是&#xff1a;将键值较大的记录向序列的尾部移动&#xff0c;键值较小的记录向序列的前部移动。 2、常见的交换排序 1、冒泡…

TypeError: object of type ‘float‘ has no len()的解决办法

报错代码举例&#xff1a; a20 b200 print(len(a/b)) 原因&#xff1a;a/b的结果是浮点数&#xff0c;而len()函数不支持浮点数 解决办法&#xff1a;把浮点数类型变为字符串 修改后代码 a20 b200 print(len(str(a/b)))

《征服数据结构》SparseArray

摘要&#xff1a; 1&#xff0c;SparseArray的介绍 2&#xff0c;SparseArray的代码实现 1&#xff0c;SparseArray的介绍 前面我们讲过《ArrayMap》&#xff0c;用它来实现哈希表&#xff0c;其中存放key和value的数组长度是存放散列表数组长度的二倍。 在哈希表中如果key值是…

【Python】已解决:(Python xml库 import xml.dom.minidom导包报错)‘No module named dom’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;&#xff08;Python xml库 import xml.dom.minidom导包报错&#xff09;‘No module named dom’ 一、分析问题背景 在使用Python处理XML文件时&#xff0c;xml…

【linux/shell】awk获取除某列之外的其他数据

介绍 在使用 awk 时&#xff0c;如果你想要获取除了某一列之外的所有其他数据&#xff0c;可以通过设置字段分隔符&#xff08;Field Separator&#xff0c;FS&#xff09;和输出字段分隔符&#xff08;Output Field Separator&#xff0c;OFS&#xff09;&#xff0c;然后打印…

中科曙光:新智生产力引擎,是一台精密的AI发动机

每一个时代的新生产力释放&#xff0c;都需要新的发动机来释放新动能。比如蒸汽机之于畜力、燃油机之于蒸汽机&#xff0c;发动机的每一次进化&#xff0c;都为新兴工业体系奠定了更强大的生产力底座。 如今&#xff0c;AI作为新质生产力的关键引擎&#xff0c;带来了史无前例的…

240706_昇思学习打卡-Day18-基于MindSpore的GPT2文本摘要

240706_昇思学习打卡-Day18-基于MindSpore的GPT2文本摘要 今天做一个根据一段文章提取摘要的提取器&#xff0c;基于nlpcc2017摘要数据&#xff0c;内容为新闻正文及其摘要&#xff0c;就是训练集及标签。 首先我们来预装以下MindSpore环境 %%capture captured_output # 实验…

LabVIEW干涉仪测向系统

开发了一套基于LabVIEW的软件系统&#xff0c;结合硬件设备&#xff0c;构建一个干涉仪测向实验教学平台。该平台应用于信号处理课程&#xff0c;帮助学生将理论知识与实际应用相结合&#xff0c;深化对信号处理核心概念的理解和应用。 项目背景&#xff1a; 当前信号处理教学…

Golang 单元测试+包管理+命令行工具

单元测试 传统测试方法 在 main 函数中&#xff0c;调用需要测试的函数&#xff0c;看看实际结果与预期是否相同&#xff0c;如果相同&#xff0c;则正确&#xff0c;否则不正确缺点&#xff1a; 不方便&#xff0c;我们需要在 main 函数中调用&#xff0c;如果项目正在运行&…

昇思25天学习打卡营第十四天|Pix2Pix实现图像转换

训练营进入第十四天&#xff0c;今天学的内容是Pix2Pix图像转换&#xff0c;记录一下学习内容&#xff1a; Pix2Pix概述 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN, Condition Generative Adversarial Networks &#xff09;实现的一种深度学习图像转换模型&#xff0c…

为RK3568或RK3288开发板创建交叉编译环境{采用amd64的ubuntu系统配置交叉编译arm64开发环境}(保姆级包括安装QT)超详细记录版

为RK3568或RK3288开发板创建交叉编译环境{采用amd64的ubuntu系统配置交叉编译arm64开发环境}【保姆级包括安装QT】超详细记录版 Chapter1 为RK3568或RK3288开发板创建交叉编译环境{采用amd64的ubuntu系统配置交叉编译arm64开发环境}(保姆级包括安装QT)超详细记录版一. 安装QT程…

picgo+gitee图床配置

node.js安装 刚开始顺着picgo操作,直接跳转到了node.js官网 下载的时候直接 Next,然后可以自定义安装路径,我的安装路径是C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Node.js 然后再在安装路径的根目录下新建两个文件夹,nodecache 和 nodeglobal, 如图所示:…

纤程和协程理解

进程是系统分配资源的最小单位&#xff0c;一个进程包含多个线程&#xff0c;那么纤程和协程又是啥呢&#xff1f; 纤程 多线程编程时&#xff0c;如果线程数过多&#xff0c;就会导致频繁的上下文切换&#xff0c;这对性能是一种额外的损耗。 纤程是由操作系统&#xff08;特…

802.11漫游流程简单解析与笔记_Part2_04_wpa首次关联的过程中p2p信息部分打印原因——不是AP信息而是网卡信息

最近在进行和802.11漫游有关的工作&#xff0c;需要对wpa_supplicant认证流程和漫游过程有更多的了解&#xff0c;所以通过阅读论文等方式&#xff0c;记录整理漫游相关知识。Part1将记录802.11漫游的基本流程、802.11R的基本流程、与认证和漫游都有关的三层秘钥基础。Part1将包…

C++(Qt)-GIS开发-简易瓦片地图下载器

Qt-GIS开发-简易瓦片地图下载器 文章目录 Qt-GIS开发-简易瓦片地图下载器1、概述2、安装openssl3、实现效果4、主要代码4.1 算法函数4.2 瓦片地图下载url拼接4.3 多线程下载 5、源码地址6、参考 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;GIS开发 …

全面解析 TypeScript 泛型的二三事

2024年了相信大家都已经在日常开发的过程中使用上了 TypeScript 了。TypeScript 增强了代码可靠性和可维护性&#xff0c;确保减少运行时错误并提高开发人员的工作效率。 TypeScript 通过类型声明 使得 javascript 拥有了强类型校验。而泛型的是类型声明中最重要的一环&#x…