【笔记】AOP(面向切面编程)避免selectOne

AOP(面向切面编程)本身并不能直接避免selectOne方法的报错,因为selectOne通常是在与数据库交互的上下文中使用的,比如在使用MyBatis或类似的ORM框架时。然而,AOP可以用于在selectOne方法调用前后添加额外的逻辑,以处理可能的异常或进行日志记录等操作,从而间接地帮助避免或更好地处理报错。

以下是一些使用AOP来增强selectOne方法调用的建议:

异常处理:你可以创建一个AOP切面来捕获并处理selectOne方法抛出的异常。这允许你以一种集中的方式处理异常,而不是在每个调用selectOne的地方都编写相同的异常处理代码。
java
@Aspect
@Component
public class MybatisAspect {

@AfterThrowing(pointcut = "execution(* com.example.repository.*.selectOne(..))", throwing = "ex")  
public void handleException(Exception ex) {  
    // 处理异常,比如记录日志  
    System.err.println("An exception occurred during selectOne: " + ex.getMessage());  
}  

}
日志记录:使用AOP来记录selectOne方法的调用和结果。这可以帮助你跟踪和调试问题,即使在没有显式添加日志代码的情况下。
java
@Aspect
@Component
public class MybatisAspect {

@Before("execution(* com.example.repository.*.selectOne(..))")  
public void logBefore(JoinPoint joinPoint) {  
    // 记录方法调用前的信息  
    System.out.println("About to call " + joinPoint.getSignature());  
}  

@AfterReturning(pointcut = "execution(* com.example.repository.*.selectOne(..))", returning = "result")  
public void logAfterReturning(JoinPoint joinPoint, Object result) {  
    // 记录方法调用后的信息和结果  
    System.out.println("Called " + joinPoint.getSignature() + " and returned " + result);  
}  

}
性能监控:使用AOP来测量selectOne方法的执行时间,从而帮助你识别性能瓶颈或潜在的问题。
事务管理:虽然这不是直接避免selectOne报错的方法,但AOP可以用于实现声明式事务管理,确保在selectOne方法调用失败时,数据库事务能够正确地回滚或提交。
安全检查:在selectOne方法调用之前,使用AOP进行安全检查,确保调用者具有适当的权限。
缓存管理:结合AOP和缓存技术,你可以实现缓存selectOne方法的结果,从而减少对数据库的访问次数,提高性能。当selectOne方法失败时,你可以从缓存中获取结果(如果可用)或使用缓存的失效策略来处理。
请注意,AOP只是工具之一,它可以帮助你更好地管理和控制代码的执行,但它不能替代良好的错误处理和编程实践。确保你的代码健壮、可测试和易于维护仍然是非常重要的。

org.mybatis.spring.MyBatisSystemException:
nested exception is org.apache.ibatis.exceptions.TooManyResultsException:
Expected one result (or null) to be returned by selectOne(), but found: 2

前提:

public interface RoleMapper extends BaseMapper<Role> {
}

加入限制

@Aspect
@Component
public class MybatisAspectj {

    // 配置织入点
    @Pointcut("execution(public * com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne(..))")
    public void selectOneAspect() {
    }

    @Before("selectOneAspect()")
    public void beforeSelect(JoinPoint point) {
        Object arg = point.getArgs()[0];
        if (arg instanceof AbstractWrapper) {
            arg = (AbstractWrapper) arg;
            ((AbstractWrapper) arg).last("limit 1");
        }
    }
}

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值