当前位置: 首页 > wzjs >正文

c2c电子商务网站建设栏目结构图江门网站制作系统

c2c电子商务网站建设栏目结构图,江门网站制作系统,郑州黑马程序员培训机构官网,wap网站html模板本文内容 PageHelper 实现 MyBatis 分页的常规方式 基于 AOP 的 MyBatis 分页简化方案 涉及到的技术 SpringBoot 2.7.13:基础开发框架 MyBatis:持久层框架 PageHelper:MyBatis 分页工具,提供便捷的分页实现 AOP 环绕通知&a…

本文内容

  • PageHelper 实现 MyBatis 分页的常规方式
  • 基于 AOP 的 MyBatis 分页简化方案

涉及到的技术

  • SpringBoot 2.7.13:基础开发框架
  • MyBatis:持久层框架
  • PageHelper:MyBatis 分页工具,提供便捷的分页实现
  • AOP 环绕通知:用于拦截方法并自动处理分页逻辑

案例 1:PageHelper 实现 MyBatis 分页的常规方式

PageHelper 简介

PageHelper 是一款开源的 MyBatis 分页插件,通过拦截 SQL 语句并自动添加分页条件(如 MySQL 的 LIMIT)实现分页功能,无需手动编写分页 SQL。

项目地址:MyBatis 分页插件 PageHelper

实现步骤

1. 引入依赖

在pom.xml中添加 PageHelper Starter:

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.7</version></dependency>
2. 配置数据库方言

在application.yml中指定数据库类型(PageHelper 需根据数据库生成对应分页语句):

pagehelper:helper-dialect: mysql # 数据方言
3. 分页查询实现

使用PageHelper.startPage()开启分页,查询完成后需调用PageHelper.clearPage()清理分页信息:

public PageResult<UserPO> selectPage(int pageNum, int pageSize) {// 开启分页:参数为页码、每页条数、是否需要总条数PageHelper.startPage(pageNum, pageSize, true);try {// 执行查询(Mapper方法返回List)List<UserPO> users = userMapper.selectAll();// 将查询结果封装为分页对象return PageResult.of(users);} finally {// 清理分页信息,避免影响后续查询PageHelper.clearPage();}}
4. 测试接口

访问接口进行分页查询:

GET http://localhost:8080/user/selectPage?pageNum=2&pageSize=10

存在的问题
  • 代码重复:每个分页方法都需手动调用startPage()和clearPage(),冗余且易遗漏。
  • 侵入性强:分页逻辑与业务逻辑耦合,不符合单一职责原则。

案例 2:基于 AOP 的分页简化方案

优化思路

通过 AOP 环绕通知,自动识别分页需求并处理startPage()和clearPage()调用,消除重复代码。

实现效果

简化后的分页查询方法无需手动控制分页,仅需在 Mapper 参数中传入分页查询对象:

public PageResult<UserPO> selectPageNew(PageQuery query) {// 直接调用Mapper方法,分页由AOP自动处理List<UserPO> users = userMapper.selectPageNew(query);return PageResult.of(users);}

测试接口:

GET http://localhost:8080/user/selectPageNew?pageNum=1&pageSize=10

核心实现

1. 定义分页参数接口(IPageQuery)

用于标记分页需求并传递分页参数,AOP 通过识别该接口的实现类触发分页:

public interface IPageQuery {/** 获取页码(默认第1页) */int getPageNum();/** 获取每页条数(默认10条) */int getPageSize();/** 是否需要查询总条数 */boolean count();}
2. 分页参数实现类(PageQuery)

提供默认实现,方便直接使用:

public class PageQuery implements IPageQuery {private int pageNum = 1; // 默认第1页private int pageSize = 10; // 默认每页10条private boolean count = true; // 默认需要总条数// 构造方法、getter、setter省略public static PageQuery of(int pageNum, int pageSize) {PageQuery query = new PageQuery();query.setPageNum(pageNum);query.setPageSize(pageSize);return query;}}
3. AOP 切面实现自动分页

通过环绕通知拦截 Mapper 方法,检测到IPageQuery类型参数时自动处理分页:

@Aspect@Component@Order(Ordered.HIGHEST_PRECEDENCE) // 确保切面优先级高于MyBatis拦截器public class PageQueryAspect {// 拦截所有Mapper接口的方法@Around("execution(* com.itsoku..*Mapper.*(..))")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {boolean isPageQuery = false;try {// 遍历方法参数,查找IPageQuery类型的参数for (Object arg : joinPoint.getArgs()) {if (arg instanceof IPageQuery) {IPageQuery query = (IPageQuery) arg;// 自动开启分页PageHelper.startPage(query.getPageNum(), query.getPageSize(), query.count());isPageQuery = true;break;}}// 执行原方法(查询逻辑)return joinPoint.proceed();} finally {// 若开启了分页,自动清理分页信息if (isPageQuery) {PageHelper.clearPage();}}}}
4. Mapper 接口调整

在 Mapper 方法中添加IPageQuery类型的参数(无需在 SQL 中编写分页逻辑):

@Select("select id, name from t_user order by id asc")List<UserPO> selectPageNew(IPageQuery query);

案例 3:带条件查询的分页实战

结合业务条件查询,展示简化方案的实用性。

需求

分页查询用户信息,支持根据用户名关键字模糊检索。

实现步骤

1. 定义带条件的分页参数类

继承PageQuery并添加业务查询条件:

public class UserQuery extends PageQuery {private String keyword; // 用户名关键字// getter、setter省略}
2. Mapper 接口实现

在 SQL 中使用条件参数,分页由 AOP 自动处理:

@Select("select id, name from t_user where name like concat('%', #{keyword}, '%') order by id asc")List<UserPO> selectByKeyword(UserQuery query);
3. 服务层实现
public PageResult<UserPO> userPage(UserQuery query) {List<UserPO> users = userMapper.selectByKeyword(query);return PageResult.of(users);}
4. 测试接口

GET http://localhost:8080/user/userPage?pageNum=1&pageSize=10&keyword=chen

方案优势

  1. 代码简化:消除重复的分页控制代码,专注业务逻辑。
  1. 低侵入性:分页逻辑与业务逻辑解耦,通过接口标记和 AOP 实现自动处理。
  1. 扩展性强:支持自定义分页参数和查询条件,适配复杂业务场景。
  1. 易用性高:开发人员仅需关注 SQL 查询和参数传递,无需关心分页细节。

总结

通过 AOP 环绕通知与 PageHelper 的结合,我们实现了 MyBatis 分页功能的自动化处理。核心思路是通过IPageQuery接口标记分页需求,利用 AOP 自动触发分页控制,从而减少冗余代码、降低维护成本。

这种方案特别适合大型项目,能显著提升开发效率并保证代码一致性。在实际应用中,可根据业务需求扩展IPageQuery的实现类,支持更复杂的分页场景。


文章转载自:

http://fkt0csHS.bcnsL.cn
http://uPpI4Ste.bcnsL.cn
http://n8QXvYY1.bcnsL.cn
http://FUHtSPxN.bcnsL.cn
http://ZcnlZ8iW.bcnsL.cn
http://Tv0gOmcX.bcnsL.cn
http://hmWQvyHH.bcnsL.cn
http://d4ZpT4zx.bcnsL.cn
http://XUY9kfef.bcnsL.cn
http://bmDSQvAm.bcnsL.cn
http://mpHQdmT7.bcnsL.cn
http://eF5z706l.bcnsL.cn
http://F91E0f1z.bcnsL.cn
http://gNASyzxv.bcnsL.cn
http://xHeKe9M9.bcnsL.cn
http://SueC9yEP.bcnsL.cn
http://Ydin6R7g.bcnsL.cn
http://oEZpypa9.bcnsL.cn
http://rgcdBN5A.bcnsL.cn
http://QKpetsLs.bcnsL.cn
http://l9BwdVIa.bcnsL.cn
http://QuIfM5V8.bcnsL.cn
http://G1WuULv5.bcnsL.cn
http://U5biZW6p.bcnsL.cn
http://rnvxFeVF.bcnsL.cn
http://p0HqvJzt.bcnsL.cn
http://ZbnMiQez.bcnsL.cn
http://4ZEEjHJh.bcnsL.cn
http://MIiIW5cZ.bcnsL.cn
http://lcXV66vS.bcnsL.cn
http://www.dtcms.com/wzjs/766004.html

相关文章:

  • 网站域名区别wordpress 图片暗箱
  • 自助建设影视网站wordpress四级级分类目录
  • 镇江网站设计建设深圳网站设计技术
  • 各大搜索引擎提交网站入口大全云翼计划wordpress
  • 八大恶心的网站制作网上开店平台有哪些
  • 弹幕做的视频网站热 综合-网站正在建设中
  • 专业做网站的团队微网站建设市场
  • 辽宁城乡建设集团网站单页网站怎么优化
  • 百度上免费创建网站进入公众号主页
  • django 开发一个公司网站最新网站排名优化方法
  • 手机网站赏析wordpress需要登录才可以看到内容
  • 岳阳网站开发服务新网站如何做快照
  • 模板 网站域名验证网站
  • 建设网站需要的费用服务企业网站建设的IT
  • 响应式网站模板多少钱怎样做广告设计
  • 写文章的网站网络建设解决方案专业公司
  • 公司弄个网站多少钱微信模板编辑器
  • wap 网站 开发WordPress添加点赞打赏
  • 做建网站品牌建设提升
  • 中企动力网站开发公共服务平台
  • 做网站一定要有服务器吗网站空间容量
  • 公司网站应该包括哪些内容广州工商注册公司注册
  • 安徽省住房和城乡建设厅网站做调查问卷权威网站
  • 响应式网站注意事项全国文明网联盟网站建设
  • 珠宝网站建设公司深圳福田做网站
  • 怎么在网站中做弹窗广告做网站应该选择怎样的公司
  • 软件公司简介百度seo关键词排名技术
  • 成立中英文网站建设工作领导小组开发软件
  • 谷歌怎么做公司网站霸榜seo
  • 网站建设对企业很重要前端做的好的网站