当前位置: 首页 > news >正文

成都网站平面设计吴桥网站

成都网站平面设计,吴桥网站,赣州做网站的公司有哪家好,企业为什么建设网站目录 问题描述 解决方案 Mybatis-Plus AOP注解 方案比较 MyBatis-Plus 自动填充功能 AOP 注解 问题描述 当我们在开发过程中,处理像创建时间、创建人等这样的公共字段会显得比较繁琐,尤其是在每个实体都需要这些信息的情况下。就比如&#xff0c…

目录

问题描述

解决方案

Mybatis-Plus

AOP+注解

方案比较

MyBatis-Plus 自动填充功能

AOP + 注解


问题描述

当我们在开发过程中,处理像创建时间、创建人等这样的公共字段会显得比较繁琐,尤其是在每个实体都需要这些信息的情况下。就比如,每次执行新增操作时,总要在业务逻辑中进行繁琐的添加。

解决方案

Mybatis-Plus

MyBatis-Plus 是一个 MyBatis 的增强工具,旨在简化开发、提高效率。它提供了许多便捷的功能,包括自动填充功能(Field Fill),可以用于实现公共字段如创建时间、更新时间等的自动填充.

第一步,加入BaseContex工具类,获取当前用户线程ID

/***  功能:实现了一个基于ThreadLocal的线程上下文管理工具类*/
public class BaseContext {public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();// 提供静态方法setCurrentId用于设置当前线程的IDpublic static void setCurrentId(Long id) {threadLocal.set(id);}// 提供静态方法getCurrentId用于获取当前线程的IDpublic static Long getCurrentId() {return threadLocal.get();}// 提供静态方法removeCurrentId用于清除当前线程的IDpublic static void removeCurrentId() {threadLocal.remove();}}

第二步,实现 MetaObjectHandler 接口:创建一个类实现 MetaObjectHandler 接口,并重写其中的方法,以指定在插入或更新操作时如何填充字段。

@Component
public class MybatisPlusHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {// 插入时,填充字段this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);this.setFieldValByName("createUser", BaseContext.getCurrentId(), metaObject);this.setFieldValByName("updateUser", BaseContext.getCurrentId(), metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {// 更新时,填充字段this.setFieldValByName("updateTime", System.currentTimeMillis(), metaObject);this.setFieldValByName("updateUser", BaseContext.getCurrentId(), metaObject);}
}

第三步配置实体类:在需要自动填充的实体类字段上添加 @TableField 注解,并指定 fill 属性。

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

事实上,虽然 MyBatis-Plus 提供了自己的注解 @TableField 来支持字段填充策略,但你也可以自定义注解来满足特定需求。

AOP+注解

我们都知道自定义注解结合AOP(面向切面编程):可以创建自定义注解,并结合AOP技术,在方法执行前后自动注入如创建时间、创建人等信息。这种方法特别适合于需要在多个地方复用的场景,而且不会侵入原有的业务逻辑代码。

在真实企业开发中,为了规范化与提高扩展性,我们往往会加入枚举,常量来进行优化设计。

首先,假设我们有创建时间,创建人,修改时间,修改人四个公共字段

第一步,创建一个常量类(原因:规范化操作)

/*** 公共字段自动填充相关常量*/
public class AutoFillConstant {/*** 实体类中的方法名称*/public static final String SET_CREATE_TIME = "setCreateTime";public static final String SET_UPDATE_TIME = "setUpdateTime";public static final String SET_CREATE_USER = "setCreateUser";public static final String SET_UPDATE_USER = "setUpdateUser";
}

第二步,创建一个枚举类(原因:可以区分数据库操作类型,方便进行不同的操作)

/*** 数据库操作类型*/
public enum OperationType {/*** 更新操作*/UPDATE,/*** 插入操作*/INSERT}

第三步,创建一个注解类(原因:方便在方法上使用)

/*
* 自定义注解,用于标识某个方法需要进行功能字段自动填充处理
* */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {//数据库操作类型 UPDATE INSERTOperationType value();
}

第四步,自定义切面类(实现公共字段填充逻辑)

/*
* 自定义切面,实现公共字段自动填充处理逻辑
* */
@Aspect
@Component
@Slf4j
public class AutoFillAspect {/*** 切入点* 匹配com.sky.mapper包下所有方法的执行。* 仅对标注了@AutoFill注解的方法生效。*/@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")public void autoFillPointCut(){}/*** 前置通知,在通知中进行公共字段的赋值*/@Before("autoFillPointCut()")public void autoFill(JoinPoint joinPoint){log.info("开始进行公共字段填充...");//获取到当前被拦截的方法上的数据库操作类型MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法签名对象AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象OperationType operationType = autoFill.value();//获得数据库操作类型//获取到当前被拦截的方法的参数--实体对象Object[] args = joinPoint.getArgs();if(args == null || args.length == 0){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){//为2个公共字段赋值try {Method 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();}}}
}

使用前置通知的原因:我们必须在方法执行前就完成赋值,不能等SQL语句执行完,否则无意义。

实现原理:我们通过反射得到实体类中的setter方法,对公共字段进行值填充,通过注解直接加入到方法上,实现需求。

方案比较

MyBatis-Plus 自动填充功能

优势:

  1. 集成简便:MyBatis-Plus 的自动填充功能与框架本身紧密结合,只需少量配置即可快速上手。
  2. 性能优化:由于是直接在数据访问层进行操作,相比AOP方式可能会有更少的性能开销。
  3. 代码简洁:通过简单的注解和少量的处理器类代码就可以实现对公共字段的自动管理,减少了样板代码。
  4. 易于维护:所有关于公共字段填充的逻辑都集中在一处,便于统一管理和调整。

AOP + 注解

优势:

  1. 灵活性高:可以针对不同的数据库操作类型(如插入、更新)灵活地应用不同的填充策略,并且能够方便地扩展以支持更多类型的处理。
  2. 不侵入业务逻辑:通过AOP切面的方式,在不修改原有业务逻辑的情况下完成公共字段的自动填充,保持了业务代码的清晰度。
  3. 高度定制化:可以根据实际需要自定义注解、常量、枚举等元素,为系统提供更加细致和个性化的控制。
  4. 增强的可读性:利用注解明确标识出哪些方法需要进行公共字段的自动填充,提高了代码的可读性和自我解释能力。
http://www.dtcms.com/a/578064.html

相关文章:

  • Adobe Photoshop CS6 Lite:PS极端简化版,压缩后大小仅50M,Photoshop精简版
  • 做新闻类网站还有市场吗莱芜最好的网站建设公司
  • 电力变压器绕组变形多物理场耦合建模与在线监测技术
  • WLAN_频段配置
  • 网站策划书的撰写流程是什么福州网站建设 网站设计 网站制作
  • 进程控制核心(含进程地址空间)
  • 【OpenGL学习】第2课:用OpenGL创建第一个窗口
  • Redis单线程还是多线程?
  • 做网站现在用什么语言网站做优化的好处
  • 做网站需要什么知识wdcp 快速迁移网站
  • 《uni-app 长列表优化:虚拟列表(vue-virtual-scroller)解决 1000+ 数据渲染卡顿》(附虚拟列表封装与多端适配)
  • uniapp在app中如何将json以文件格式存到本地(vue3)
  • uniapp开源ERP多仓库管理系统
  • Qt GUI 程序中进度条的完整指南
  • 网站添加广告源码wordpress和druid
  • 推出 JxBrowser MCP 服务器
  • Etcd详解(raft算法保证强一致性)
  • 东莞网站建设对比建筑模板有几种
  • AIShareTxt入门:快速准确高效的为金融决策智能体提供股票技术指标上下文
  • 赋能智慧监管:视频汇聚平台EasyCVR助力智慧电梯监控智能化监管
  • 【银行测试】对公渠道转账+网银转账+对私转账功能测试点(汇总)
  • 2013年建设工程发布网站字形分析网站
  • 高端网站制作系统百度指数怎么看城市
  • 网站搜索排名查询余姚物流做网站
  • langchain agent的中间件
  • Mysql中隔离级别可重复读解决不可重复读的底层原理是什么?
  • MySQL的DATE_FORMAT函数介绍
  • 涞水县建设局网站电子商务网站建设哪本教材比较适合中等专业学校用
  • 建阳网站建设wordpress手机验证码注册
  • C4D服装建模实战:纽扣、嵌条与拉链工具使用详解