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

苏州做网站哪家专业深圳网

苏州做网站哪家专业,深圳网,郑州网站空间,深圳外贸响应式网站建设场景:当处理一些请求时,会重复的对数据库的某些字段进行赋值(如:在插入和更新某个物品时,需要更新该物品的更新时间和更新者的信息),这样会导致代码冗余。 如: 思路: 自…

场景:当处理一些请求时,会重复的对数据库的某些字段进行赋值(如:在插入和更新某个物品时,需要更新该物品的更新时间和更新者的信息),这样会导致代码冗余。
如:
在这里插入图片描述
思路:

  • 自定义注解 AutoFill,用于标识需要进行公共字段自动填充的方法
  • 自定义切面类 AutoFillAspect,统一拦截加入了 AutoFill 注解的方法,通过反射为公共字段赋值
  • 在 Mapper 的方法上加入 AutoFill 注解

实现:
定义AutoFill注解:

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: AufoFill* PackageName: com.sky.Annotation* Description: 用于表示某个方法需要进行功能字段自动填充处理** @Author Xiyan Zhong* @Create 2023/12/18 下午2:55* @Version 1.0*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {// 数据库操作类型:UPDATE INSERTOperationType value();
}

实现切面类:

package com.sky.aspect;import com.sky.annotation.AutoFill;
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: AutoFillAspect* PackageName: com.sky.Aspect* Description:自定义切面,实现公共字段自动填充逻辑** @Author Xiyan Zhong* @Create 2023/12/18 下午3:00* @Version 1.0*/@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) {log.info("开始进行公共字段自动填充……");// 获取被拦截的方法上的数据库操作类型MethodSignature signature = (MethodSignature) joinPoint.getSignature(); // 方法签名对象AutoFill annotation = signature.getMethod().getAnnotation(AutoFill.class);// 获取方法上的注解对象OperationType operationType = annotation.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) {//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) {try {// 为2个公共字段赋值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();}}}
}

需要注意的是,在反射中获取方法名时和判断拦截方法的类型时,分别采用的是常量枚举,而不是直接使用方法的字符串名称,这样可以降低编码时的错误率,也更加规范,对应的代码:

package com.sky.constant;/*** 公共字段自动填充相关常量*/
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";
}
/*** 数据库操作类型*/
package com.sky.enumeration;/*** 数据库操作类型*/
public enum OperationType {/*** 更新操作*/UPDATE,/*** 插入操作*/INSERT}

在Mapper对应的方法中,添加注解@AutoFill:

    /*** 插入数据* @param category*/@Insert("insert into category(type, name, sort, status, create_time, update_time, create_user, update_user) " +" values" +"(#{type}, #{name},#{sort},#{status},#{createTime},#{updateTime},#{createUser},#{updateUser})")@AutoFill(OperationType.INSERT)void insert(Category category);/*** 根据id修改分类* @param category*/@AutoFill(OperationType.UPDATE)void update(Category category);

删除对应的服务实现类的赋值操作。

http://www.15wanjia.com/news/167950.html

相关文章:

  • 猪八戒网站建设公司我想建网站
  • 安徽省建设干校学校网站wordpress对接熊掌号
  • 企业网站认证百度做网站联系电话
  • 阿里云备案 网站名称网站建设课设心得
  • 宝安做网站哪家好网站开发的著作权归谁
  • 教做公众号的网站wordpress本地做好了怎么备份
  • 可以做问卷调查的网站网站空间指的是什么意思
  • 短租网站那家做的好南京设计网页公司
  • 重庆网站模板建站域名备案用的网站建设方案
  • 可以做微课ppt模板 网站有哪些脑子笨适合学计算机吗
  • 山东网站建设团队学校如何报销网站开发费用
  • 织梦网站图标有哪些做场景秀的网站
  • 凡科做 淘宝客网站网站的访问速度和什么有关系
  • 网站 推广方案wordpress菜单属性
  • wap网站在线生成app建设高校实验教学网站的作用
  • 做网站怎么开发程序做网站需要服务器查询吗
  • 网站主机托管中小企业建网站哪个好
  • 网站建设和电商区别广告设计与制作论文
  • 门类细分网站wordpress主题绝对路径怎么修改
  • 长沙营销网站建设html网站开发实战教程
  • 海南省住房和城乡建设部网站开发公司综合部内部管理章程
  • 建站公司杭州WordPress建站评价
  • 局域网如何建网站游戏搜索风云榜
  • 网站建设五大定位淘宝seo搜索优化
  • 华大 网站建设wordpress占用空间越来越大
  • 企业网站模板免费下载wordpress主题丢失
  • 网站底部图标代码面料做电商 哪个网站好
  • 有哪些学校的网站做的好处企业电话号码大全
  • 做餐饮系统网站建设公司网站的用途
  • 网站建设运维策划网站开发应该先写前端还是后端