AOP使用场景——mybatis之mapper执行A表删除前,保存到B表

需求:每次删除A表的数据,我们都希望去保留数据,记录到B表。

很多时候我们是这么做的

public void delete(id) {
    UserLogMapper.insert(UserBean);//记录日志
    UserMapper.delete(id);//删除记录
}

这样还得要加上事务,什么的。但是别忘记了,UserMapper里的方法如果在别的地方调用了,别人也不知道你的业务逻辑,直接调用UserMapper.delete(id);而没有记录日志。那么就破坏了原有的业务逻辑。

所以我们是在别人调用UserMapper.delete(id);之前调用UserLogMapper.insert(UserBean);。我们想到了AOP

现在我们用AOP,无侵入方式解决这个问题。

思路:用SpringAOP

我们已经有一个mapper类(mybatis)如下:

public interface UserMapper{

    int delete(@Param("id") Long id);

}

超级普通的,mybatis这样的接口,用代理去实现。我们也能对这个接口的方法进行拦截。mybatis xml 如下:

    <delete id="delete" parameterType="java.lang.Long">
        delete from user
        where  id=#{id,jdbcType=BIGINT}
    </delete>

1、建一个注释

import java.lang.annotation.*;

@Target(ElementType.METHOD)                    //支持注解在方法上
@Retention(RetentionPolicy.RUNTIME)            //支持运行时可用
@Documented                                    //DOC文档可见
@Inherited
public @interface DatabaseAfterAspects {

    Class processorClass();//调用方法前先调用这个类

    String method();//调用这个类的这个方法
}

2、AOP切面,这个切面拦截以上的注释的方法后,调用注释传进来的类和方法

package com.ea.utils.aop;

import com.ea.utils.SpringC
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,记录Mybatis执行的增删改操作的后数据变化,可以使用AOP拦截MybatisMapper接口的对应方法,并在拦截器中获取方法的参数和返回值,从而实现数据变化的记录。 以下是一个示例代码,演示如何使用AOP拦截MybatisMapper接口的insert、update和delete方法,并记录后数据变化。 1. 定义一个AOP切面类,实现增删改方法的拦截和数据变化的记录: ```java @Aspect @Component public class MybatisDataChangeAspect { // 定义切入点,拦截MybatisMapper接口的insert、update和delete方法 @Pointcut("execution(* com.example.mapper.*Mapper.insert*(..)) " + "|| execution(* com.example.mapper.*Mapper.update*(..)) " + "|| execution(* com.example.mapper.*Mapper.delete*(..)) ") public void pointcut() {} // 定义环绕通知 @Around("pointcut()") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { // 获取方法参数 Object[] args = joinPoint.getArgs(); // 获取方法返回值 Object result = joinPoint.proceed(); // 记录数据变化 logDataChange(joinPoint, args, result); return result; } // 记录数据变化 private void logDataChange(ProceedingJoinPoint joinPoint, Object[] args, Object result) { // 获取Mapper接口名和方法名 String mapperName = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); // 获取方法参数名 String[] paramNames = ((MethodSignature) joinPoint.getSignature()).getParameterNames(); // 获取方法参数值 Map<String, Object> paramMap = new HashMap<>(); for (int i = 0; i < args.length; i++) { paramMap.put(paramNames[i], args[i]); } // 获取返回值 String returnValue = ""; if (result != null) { returnValue = result.toString(); } // 记录数据变化 System.out.println(String.format("Mapper [%s] 的方法 [%s] 执行了数据变化," + "参数为 %s,返回值为 %s", mapperName, methodName, paramMap, returnValue)); } } ``` 2. 在Spring Boot的配置文件中开启AOP: ```yaml spring: aop: auto: true ``` 3. 在Mapper接口中定义对应的增删改方法: ```java @Mapper public interface UserMapper { int insertUser(User user); int updateUser(User user); int deleteUser(int id); } ``` 4. 在Controller中调用Mapper接口的方法: ```java @RestController public class UserController { @Autowired private UserMapper userMapper; @PostMapping("/users") public String addUser(@RequestBody User user) { userMapper.insertUser(user); return "success"; } @PutMapping("/users") public String updateUser(@RequestBody User user) { userMapper.updateUser(user); return "success"; } @DeleteMapping("/users/{id}") public String deleteUser(@PathVariable int id) { userMapper.deleteUser(id); return "success"; } } ``` 这样,当Controller中调用Mapper接口的增删改方法时,AOP切面会拦截这些方法,并记录后数据变化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值