spring  AOP编程,mybatis分页应用

本文展示了如何通过AOP切面编程在Java项目中实现MyBatis的分页功能。创建了一个自定义注解`PageTools`,并在AOP切面中解析HTTP请求参数以进行分页设置。通过`PageHelper`工具类,实现了动态SQL的分页查询。同时,文章还包含了AOP的通知顺序,包括前置通知、后置通知、返回后通知和异常后通知的示例。
摘要由CSDN通过智能技术生成

 

简介

AOP切面编程在项目中常用的技术,log管理,分页操作,公共业务处理,都有很好的应用,下面以用AOP简单实现 mybatis分页的功能

创建自定义注解

@Target({ ElementType.METHOD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface PageTools {
	String value() default "";
}

 aop 切面代码 ,mybatis分页逻辑处理

 

@Aspect
@Component
@Slf4j
public class PageToolsAop {

     //@Pointcut("execution(* net.bingosoft.bmsa.ninthdesign.service..*.*(..))") //包名方式做切点
	@Pointcut("@annotation(net.bingosoft.bmsa.common.annotation.PageTools)")
	public void requestPointcut() {
	}

	@Around("requestPointcut()")
	public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
		RequestAttributes ra = RequestContextHolder.getRequestAttributes();
		ServletRequestAttributes sra = (ServletRequestAttributes) ra;
		HttpServletRequest request = sra.getRequest();
		if (request.getParameter("pageNum") != null && request.getParameter("pageSize") != null) {
			Integer pageNum = Integer.valueOf(request.getParameter("pageNum"));
			Integer pageSize = Integer.valueOf(request.getParameter("pageSize"));
			if(request.getParameter("orderBy")!=null) {
				String orderBy = String.valueOf(request.getParameter("orderBy"));
				PageHelper.startPage(pageNum, pageSize, orderBy);
			}else {
				PageHelper.startPage(pageNum, pageSize);
			}
			
		}
        log.info("PageToolsAop:Around1#######");
		Object obj = joinPoint.proceed();
        log.info("PageToolsAop:Around2#######");
		return obj;
	}

    //声明前置通知
    @Before("requestPointcut()")
    public void doBefore(JoinPoint point) {
        log.info("PageToolsAop:doBefore#######");
        return;
    }

    //声明后置通知
    @AfterReturning(pointcut = "requestPointcut()", returning = "returnValue")
    public void doAfterReturning(JoinPoint point,Object returnValue) {
        log.info("PageToolsAop:doAfterReturning#######");
    }

    //声明例外通知
    @AfterThrowing(pointcut = "requestPointcut()", throwing = "e")
    public void doAfterThrowing(Exception e) {
        log.info("PageToolsAop:doAfterThrowing#######");
    }

    //声明最终通知
    @After("requestPointcut()")
    public void doAfter() {
        log.info("PageToolsAop:doAfter#######");
    }

}

注解切点,业务代码

    @PageTools  //在分页查询SQL切入aop
    public List<Dto> listPage(QueryVo vo) {
        System.out.println("====");
        return  mapper.listPage(vo);;
    }

发送请求 ,分页信息

 http://localhost:8080/api/api/v1/design/shift/type_page?name=&pageNum=1&pageSize=20&orderBy=create_time+desc    

逻辑输出,可以看出aop通知的执行顺序

Execute SQL:SELECT * FROM shift_type WHERE   ORDER BY create_time DESC LIMIT 20;


2020-12-16 09:23:48.942 INFO  net.bingosoft.bmsa.common.aspect.PageToolsAop -PageToolsAop:Around1#######
2020-12-16 09:23:52.405 INFO  net.bingosoft.bmsa.common.aspect.PageToolsAop -PageToolsAop:doBefore#######
====
2020-12-16 09:23:54.981 INFO  net.bingosoft.bmsa.common.aspect.PageToolsAop -PageToolsAop:doAfterReturning#######
2020-12-16 09:23:58.993 INFO  net.bingosoft.bmsa.common.aspect.PageToolsAop -PageToolsAop:doAfter#######
2020-12-16 09:24:00.224 INFO  net.bingosoft.bmsa.common.aspect.PageToolsAop -PageToolsAop:Around2#######

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值