提升开发效率的必备技能:Spring集成Mybatis和PageHelper详解(二)

简介: 提升开发效率的必备技能:Spring集成Mybatis和PageHelper详解(二)

二、Spring集成PageHeper

我们先来看一下没有集成之前的代码是怎么样的?

BookMapper.xml

<select id="listpager" resultType="com.csdn.xw.model.Book" parameterType="com.csdn.xw.model.Book" >
    select
    <include refid="Base_Column_List" />
    from t_mvc_book
    <if test=" bname!=null">
      where  bname like concat('%',#{bname},'%')
    </if>
  </select>

BookMapper

List<Book> listpager(Book book);

BookBiz

List<Book> listpager(Book book, PageBean pageBean);

BookBizImpl

 @Override
    public List<Book> listpager(Book book, PageBean pageBean) {
        if(pageBean!=null&&pageBean.isPagination())
            PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        List<Book> listpager = bookMapper.listpager(book);
        if(pageBean!=null&&pageBean.isPagination()){
            PageInfo<Book> pageInfo = new PageInfo<>(listpager);
            pageBean.setTotal((int) pageInfo.getTotal());
        }
        return listpager;
    }

如果PageBean不为空并且isPagination为true说明要分页,那么就是用PageHeper插件

BookBizImplTest

@Test
    public void listpager() {
        Book book=new Book();
        PageBean pageBean=new PageBean();
        pageBean.setPage(2);
        pageBean.setRows(5);
        book.setBname("斗破");
    this.bookbiz.listpager(book,pageBean).forEach(System.out::println);
    }

这样的代码复用性不是很高而且耦合性比较高,在我们在我们开发过程中是非常不友好的,那么怎么将分页的代码进行优化呢?我们可以用到Spring里面的aop面向切面技术做处理。

2.1.面向切面解决冗余代码

编写一个切面类专门来做分页

PageAspect

package com.csdn.xw.aspect;
import com.csdn.xw.util.PageBean;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * @author Java方文山
 * @compay csdn_Java方文山
 * @create 2023-08-25-20:33
 */
@Aspect
//代表当前类是切面类
@Component
//代表这个是交给Spring管理
public class PageAspect {
    /**
     * *:返回值
     * *..:无限包
     * *Biz:以Biz结尾的接口名
     * .pager:以pager方法
     * 只要同时匹配上诉四个条件,就会被列为目标对象
     * 上诉配置要生效,代理注释一定要打开:<aop:aspectj-autoproxy/>
     * @param args
     * @return
     * @throws Throwable
     */
    @Around("execution(* *..*Biz.*pager(..))")
    public Object invoke(ProceedingJoinPoint args) throws Throwable {
        Object[] params = args.getArgs();
        PageBean pageBean = null;
        for (Object param : params) {
            if(param instanceof PageBean){
                pageBean = (PageBean)param;
                break;
            }
        }
        if(pageBean != null && pageBean.isPagination())
            PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        Object list = args.proceed(params);
        if(null != pageBean && pageBean.isPagination()){
            PageInfo pageInfo = new PageInfo((List) list);
            pageBean.setTotal(pageInfo.getTotal()+"");
        }
        return list;
    }
}

小贴士:

这段代码是一个使用AOP(面向切面编程)的示例,它的作用是在执行方法之前和之后添加一些额外的逻辑。具体来说,这段代码定义了一个切面,用于拦截所有使用了`Biz.pager()`方法的方法。

1. @Around("execution(* *..*Biz.*pager(..))")`:这是一个注解,表示这个切面将会拦截所有使用了`Biz.pager()`方法的方法。

2. `public Object invoke(ProceedingJoinPoint args) throws Throwable`:这是切面的核心方法,它会在被拦截的方法执行前后执行。`ProceedingJoinPoint`参数包含了被拦截方法的信息,如方法名、参数等。

3. `Object[] params = args.getArgs();`:从`ProceedingJoinPoint`参数中获取被拦截方法的参数。

4. `PageBean pageBean = null;`:声明一个`PageBean`类型的变量`pageBean`,用于存储`Biz.pager()`方法的返回值。

5. `for (Object param : params) { if(param instanceof PageBean){ pageBean = (PageBean)param; break; } }`:遍历参数数组,找到第一个`PageBean`类型的参数,并将其赋值给`pageBean`。

6. `if(pageBean != null && pageBean.isPagination()) PageHelper.startPage(pageBean.getPage(),pageBean.getRows());`:如果`pageBean`不为空且`pageBean`的分页属性为`true`,则使用`PageHelper.startPage()`方法设置分页信息。

7. `Object list = args.proceed(params);`:调用被拦截方法,并将结果赋值给`list`。

8. `if(null != pageBean && pageBean.isPagination()){ PageInfo pageInfo = new PageInfo((List) list); pageBean.setTotal(pageInfo.getTotal()+""); }`:如果`pageBean`不为空且分页属性为`true`,则将分页信息设置到`pageBean`中。

9. `return list;`:返回被拦截方法的结果。

下面我注释掉我们刚刚在Impl所写的分页代码试试,看这个切面类会不会捕捉到我们的方法。

测试结果:

结果也出来了,说明我们的捕捉成功了。

三、总结

3.1.注解解释

  • @Data: 这个注解是Lombok库提供的,它可以自动为类生成常用的方法,如getter、setter、equals、hashCode等,从而简化了代码编写过程。
  • @AllArgsConstructor: 这个注解是Lombok库提供的,它会自动生成一个包含所有成员变量的构造函数,方便创建对象时初始化所有字段。
  • @NoArgsConstructor: 这个注解也是Lombok库提供的,它会自动生成一个无参构造函数,方便创建对象时不进行初始化。
  • @Repository: 这个注解是Spring框架提供的,用于标记数据访问组件,即DAO(Data Access Object)层的接口。Spring会自动扫描带有该注解的接口,并将其作为Bean进行管理。
  • @Service: 这个注解也是Spring框架提供的,与@Repository类似,用于标记服务层的接口。同样,Spring会自动扫描带有该注解的接口,并将其作为Bean进行管理。
  • @Autowired: 这个注解是Spring框架提供的,用于自动注入依赖关系。当使用@Autowired注解在字段、构造函数或方法上时,Spring会自动将匹配的Bean注入到对应的位置。
  • @RunWith(SpringJUnit4ClassRunner.class): 这个注解是JUnit框架提供的,用于指定测试运行器。@RunWith注解可以与不同的测试运行器组合使用,这里使用的是SpringJUnit4ClassRunner,它会加载Spring的配置并执行测试。
  • @ContextConfiguration(locations={"classpath:spring-context.xml"}): 这个注解是JUnit框架提供的,用于指定测试运行器的上下文配置。通过指定locations属性,可以告诉测试运行器从指定的文件加载Spring的配置文件。
  • @Component: 这个注解是Spring框架提供的,用于标记一个类为Spring的组件。当一个类被标记为@Component时,Spring会自动扫描并将其作为Bean进行管理。

到这里我的分享就结束了,欢迎到评论区探讨交流!!

如果觉得有用的话还请点个赞吧 ♥  ♥


相关文章
|
2月前
|
JavaScript 前端开发 持续交付
Prettier 高级应用:集成 CI/CD 流水线与插件开发
【10月更文挑战第18天】Prettier 是一款流行的代码格式化工具,它能够自动将代码格式化成一致的风格,从而提高代码的可读性和维护性。对于希望进一步发挥 Prettier 潜力的高级用户而言,将 Prettier 集成到持续集成(CI)和持续部署(CD)流程中,确保每次提交的代码都符合团队标准,是非常重要的。此外,通过开发自定义插件来支持更多语言或扩展 Prettier 的功能也是值得探索的方向。本文将详细介绍这两方面的内容。
52 2
|
2月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
23天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
35 2
|
24天前
|
传感器 前端开发 Android开发
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求。本文深入探讨了插件开发的基本概念、流程、集成方法、常见类型及开发实例,如相机插件的开发步骤,同时强调了版本兼容性、性能优化等注意事项,并展望了插件开发的未来趋势。
38 2
|
20天前
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
41 0
|
2月前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
67 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
2月前
|
Dart Android开发
鸿蒙Flutter实战:03-鸿蒙Flutter开发中集成Webview
本文介绍了在OpenHarmony平台上集成WebView的两种方法:一是使用第三方库`flutter_inappwebview`,通过配置pubspec.lock文件实现;二是编写原生ArkTS代码,自定义PlatformView,涉及创建入口能力、注册视图工厂、处理方法调用及页面构建等步骤。
68 0
|
3月前
|
XML Java 关系型数据库
springboot 集成 mybatis-plus 代码生成器
本文介绍了如何在Spring Boot项目中集成MyBatis-Plus代码生成器,包括导入相关依赖坐标、配置快速代码生成器以及自定义代码生成器模板的步骤和代码示例,旨在提高开发效率,快速生成Entity、Mapper、Mapper XML、Service、Controller等代码。
springboot 集成 mybatis-plus 代码生成器
|
2月前
|
开发框架 监控 搜索推荐
GoFly快速开发框架集成ZincSearch全文搜索引擎 - Elasticsearch轻量级替代为ZincSearch全文搜索引擎
本文介绍了在项目开发中使用ZincSearch作为全文搜索引擎的优势,包括其轻量级、易于安装和使用、资源占用低等特点,以及如何在GoFly快速开发框架中集成和使用ZincSearch,提供了详细的开发文档和实例代码,帮助开发者高效地实现搜索功能。
182 0
|
3月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit