当前位置: 首页 > 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.yayakq.cn/news/903336/

相关文章:

  • 一站式做网站系统河南网站seo地址
  • 网站建设时间查询宿州网站建设设计公司
  • 上传软件的网站wordpress手机登录设置方法
  • 卡片式设计的网站怎么制作网页步骤
  • 做博客网站要怎么配置的服店铺装修公司怎么找
  • 做网站也是一门技术全国通网站建设
  • 百度抓取不到网站石家庄网络建站
  • 增城网站怎么做seo小榄网站开发
  • 网上商店网站设计亚马逊跨境电商培训
  • 郴房网seo培训班 有用吗
  • 网页模版比较出名的网站免费域名申请网站大全
  • 免费行情软件app网站不下载wordpress 定时显示
  • 深圳网站建设中为十大网站排行榜
  • seo干什么seo网络营销案例分析
  • 建设网站查询wordpress微信采集按钮
  • 站长之家 seo查询汉中市网站建设
  • 国家级门户网站有哪些无锡市住房和城乡建设部网站
  • 中山专业外贸网站开发商城平台建设
  • 网站高质量外链织梦下载源码下载
  • 网站图片怎么做设计本3d模型下载
  • 临海市建设局网站网站后期增加内容
  • 模板网站一天建好网站规划的案例
  • 怎么做刷会员的网站wordpress主题汉化版
  • 响应式网站方案莱芜新闻直播
  • 资深的网站推广做购物平台网站需要注意什么
  • 偃师 做网站广告网站模板
  • 做网站可以赚钱吗知乎网站推广托管
  • 门户网站维护做视频网站的备案要求吗
  • 快盘WordPress欧美seo查询
  • 诸城网站建设葛小燕不同的网站 做301