java:对mysql切面实现创建人创建时间更新人更新时间的赋值

背景:日常开发中,对mysql基础数据表进行设计时,几乎每个表都要有创建人创建时间更新人更新时间这四个标准字段,那么每次进行curd的时候,如果每次都要对此4个字段进行赋值,代码重复率会非常高,而且开发效率会降低,一旦漏掉操作容易导致bug。

github:GitHub - ChaShiyu/rutui-mysql-aop: 对mysql切面实现创建人创建时间更新人更新时间的赋值

方案:在controller方法上通过自定义注解实现aop切面。

pom依赖

<!-- 核心包,千万别引错了,不要引入aspectjrt,aspectjrt只是基础包,无法实现pointCut -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
</dependency>
<!-- fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
</dependency>
<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

步骤:

1、定义基类:

@Data
public class BaseInfo implements Serializable {
    private Long creatorId;
    private String creatorName;
    private Date createTime;
    private Long updaterId;
    private String updaterName;
    private Date updateTime;
}

2、定义DTO:

@Data
public class Member extends BaseEntity {
    private String name;
}

3、自定义切面注解:

@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface BaseInfoAnnotation {
    OperateTypeEnum value();
}

4、操作类型枚举:

public enum OperateTypeEnum {
    ADD,
    DELETE,
    UPDATE;
}

5、自定义 aop 操作:


@Aspect
@Component
public class BaseInfoAop {

    @Pointcut("@annotation(cn.rutui.mysqlaop.aop.BaseInfoAnnotation))")
    public void setBaseInfo() {
    }

    @Around("setBaseInfo()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        BaseInfoAnnotation annotation = signature.getMethod().getAnnotation(BaseInfoAnnotation.class);
        OperateTypeEnum value = annotation.value();
        Object[] args = joinPoint.getArgs();
        if (args.length > 0) {
            BaseInfo arg = (BaseInfo) args[0];
            Map<String, String> userInfo = getUserInfo();
            if (value == OperateTypeEnum.ADD) {
                arg.setCreatorId(Long.valueOf(userInfo.get("id")));
                arg.setCreatorName(userInfo.get("name"));
                arg.setOptTime(new Date());
            } else if (value == OperateTypeEnum.UPDATE || value == OperateTypeEnum.DELETE) {
                arg.setCreatorId(Long.valueOf(userInfo.get("id")));
                arg.setCreatorName(userInfo.get("name"));
                arg.setOptTime(new Date());
            }
        }
        return joinPoint.proceed(args);
    }

    private Map<String, String> getUserInfo() {
        // get user info by session
        HashMap<String, String> map = new HashMap<>();
        map.put("id", "10");
        map.put("name", "namename");
        return map;
    }
}

6、定义Controller

@RestController
@RequestMapping("/member")
public class MemberController {
    @PostMapping("")
    @BaseInfoAnnotation(OperateTypeEnum.ADD)
    public String save(@RequestBody Member member) {
        System.out.println(JSON.toJSONString(member));
        return "SUCCESS";
    }
}

7、结果

{"creatorId":10,"creatorName":"namename","optTime":1670494115667}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值