网易首页 > 网易号 > 正文 申请入驻

Mybatis分页视频教程,超强实战

0
分享至

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

今天我们就来学学mybatis框架分页实现,有几种方式,最简单的就是利用原生的sql关键字limit来实现,还有一种就是利用interceptor来拼接sql,实现和limit一样的功能,再一个就是利用PageHelper来实现。这里讲解这三种常见的实现方式:

无论哪种实现方式,我们返回的结果,不能再使用List了,需要一个自定义对象Pager。

package com.xxx.mybatis.bean;import java.util.List;public class Pager {private int page;//分页起始页private int size;//每页记录数private List//返回的记录集合private long total;//总记录条数public int getPage() {return page;}public void setPage(int page) {this.page = page;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}public List{return rows;}public void setRows(List {this.rows = rows;}public long getTotal() {return total;}public void setTotal(long total) {this.total = total;}}

rows;

getRows()

rows)

limit关键字实现:

UserDao.java增加两个方法

public List;public long count();

findByPager(Map)

params

UserMapper.xml中增加两个查询

select * from xx_user limit #{page},#{size}select>select count(1) from xx_userselect>

UserService.java中增加分页方法

public Pager{Mapparams = new HashMapparams.put("page", (page-1)*size);params.put("size", size);Pagernew Pagerparams);pager.setRows(list);pager.setTotal(userDao.count());return pager;}

findByPager(int page,int size)

pager =

();List

list = userDao.findByPager(

这是最直观的实现方式,也是最简单的,不用任何插件或者工具就能够很方便的实现的方法。

interceptor plugin实现:

需要定义一个类实现Interceptor接口

MyPageInterceptor.java

package com.xxx.mybatis.bean;import java.sql.Connection;import java.util.Map;import java.util.Properties;import org.apache.ibatis.executor.parameter.ParameterHandler;import org.apache.ibatis.executor.statement.StatementHandler;import org.apache.ibatis.mapping.MappedStatement;import org.apache.ibatis.plugin.Interceptor;import org.apache.ibatis.plugin.Intercepts;import org.apache.ibatis.plugin.Invocation;import org.apache.ibatis.plugin.Plugin;import org.apache.ibatis.plugin.Signature;import org.apache.ibatis.reflection.MetaObject;import org.apache.ibatis.reflection.SystemMetaObject;@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class,Integer.class})})public class MyPageInterceptor implements Interceptor {private int page;private int size;@SuppressWarnings("unused")private String dbType; @SuppressWarnings("unchecked")@Overridepublic Object intercept(Invocation invocation) throws Throwable {System.out.println("plugin is running...");StatementHandler statementHandler = (StatementHandler)invocation.getTarget();MetaObject metaObject = SystemMetaObject.forObject(statementHandler);while(metaObject.hasGetter("h")){Object object = metaObject.getValue("h");metaObject = SystemMetaObject.forObject(object);}while(metaObject.hasGetter("target")){Object object = metaObject.getValue("target");metaObject = SystemMetaObject.forObject(object);}MappedStatement mappedStatement = (MappedStatement)metaObject.getValue("delegate.mappedStatement");String mapId = mappedStatement.getId();if(mapId.matches(".+ByPager$")){ParameterHandler parameterHandler = (ParameterHandler)metaObject.getValue("delegate.parameterHandler");Mapint)params.get("page");size = (int)params.get("size");String sql = (String) metaObject.getValue("delegate.boundSql.sql");sql += " limit "+(page-1)*size +","+size;metaObject.setValue("delegate.boundSql.sql", sql);}return invocation.proceed();} @Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);} @Overridepublic void setProperties(Properties properties) {String limit = properties.getProperty("limit","10");this.page = Integer.parseInt(limit);this.dbType = properties.getProperty("dbType", "mysql");} }

params = (Map

)parameterHandler.getParameterObject();page = (

我们之前在service的findByPager方法里面,为了给limit传入两个参数,其中page做了计算,这里使用拦截器的方式就无需计算了:

public Pager{Mapparams = new HashMapparams.put("page", page);params.put("size", size);Pagernew Pagerparams);pager.setRows(list);pager.setTotal(userDao.count());return pager;}

findByPager(int page,int size)

pager =

();List

list = userDao.findByPager(

spring配置中,增加plugin设置:

到这里,你也许也猜到了MyPageInterceptor实际上是以一种拦截器的方式在程序执行findByPager方法的时候,对语句会增加limit page,size的拼接,还是和第一种原生实现思路一样,所以这里需要对UserMapper.xml配置文件中的findByPager这个查询对应的语句中的limit#{page},#{size}这部分去掉,变为如下的样子:

至此,通过拦截器插件的方式也实现了分页功能了。

PageHelper实现:

这种方式实现需要我们引入maven依赖。

com.github.pagehelpergroupId>pagehelperartifactId>4.2.1version> dependency>

spring.xml配置文件做一下修改:

mysqlprop>trueprop>trueprop>count=countSqlprop>props>property> bean> property>bean>

service层的方法,做一些修改:

public Pager{Pagernew Pagerreturn pager;}

findByPager(int page,int size)

pager =

();Page

res = PageHelper.startPage(page,size);userDao.findAll();pager.setRows(res.getResult());pager.setTotal(res.getTotal());

至此,PageHelper工具方法实现分页也实现了。其实PageHelper方法也是第二种使用Interceptor拦截器方式的一种三方实现,它内部帮助我们实现了Interceptor的功能。所以我们不用自定义MyPageInterceptor这个类了。实际上也是在运行查询方法的时候,进行拦截,然后设置分页参数。所以PageHelper.startPage(page,size)这一句需要显示调用,然后再执行userDao.findAll(),在查询所有用户信息的时候,会进行一个分页参数设置,让放回的结果只是分页的结果,而不是全部集合。

零基础学习Mybatis,推荐动力节点Mybatis菜鸟教程,通过本课程的学习,可以在最短的时间内学会使用持久层框架MyBatis,在该视频中没有废话,都是干货,该视频的讲解不是学术性研究,项目中用什么,这里就讲什么,如果您现在项目中马上要使用MyBatis框架,那么您只需要学习完此教程,就可以顺利的使用MyBatis开发了。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
订单已经排到2027年下半年!价格暴涨

订单已经排到2027年下半年!价格暴涨

新浪财经
2026-06-02 18:04:37
知情人士:特朗普称内塔尼亚胡“疯了”,指责其“不知感恩”,称“如果不是我,你早就进监狱了,现在所有人都讨厌你,讨厌以色列”

知情人士:特朗普称内塔尼亚胡“疯了”,指责其“不知感恩”,称“如果不是我,你早就进监狱了,现在所有人都讨厌你,讨厌以色列”

大风新闻
2026-06-02 08:26:05
两项世界纪录诞生!激光隔空输电 机器人跑了24小时

两项世界纪录诞生!激光隔空输电 机器人跑了24小时

快科技
2026-06-02 22:29:23
菲律宾参议院两名莎拉阵营议员遭变故,弹劾大战前格局生变

菲律宾参议院两名莎拉阵营议员遭变故,弹劾大战前格局生变

风流女汉
2026-06-02 15:29:07
间歇期“充电”,成都蓉城外援韦林顿携家人前往泰国旅游度假

间歇期“充电”,成都蓉城外援韦林顿携家人前往泰国旅游度假

懂球帝
2026-06-02 10:31:22
白人女性与黑人女性的体味差异,网友真实分享引发热议

白人女性与黑人女性的体味差异,网友真实分享引发热议

特约前排观众
2025-12-22 00:20:06
汪峰带五娃过六一!森林北女儿紧挨妈妈,二女儿汪璟怡不舍得分开

汪峰带五娃过六一!森林北女儿紧挨妈妈,二女儿汪璟怡不舍得分开

无处不风景love
2026-06-02 14:01:50
输给广厦8分!揪出1个表现最差之人,坑惨了上海队

输给广厦8分!揪出1个表现最差之人,坑惨了上海队

体育哲人
2026-06-02 22:47:28
中国最窄的领土:才8米宽,连接着一块卡在三国中的飞地

中国最窄的领土:才8米宽,连接着一块卡在三国中的飞地

孤云朗境
2026-06-02 22:20:11
中国没给面子,普京回国后沉默一周认清现实,终究找上哈萨克斯坦

中国没给面子,普京回国后沉默一周认清现实,终究找上哈萨克斯坦

失我者永失qq
2026-06-02 19:31:34
一碗隔夜米饭毒死7人?医生警告:米饭尽量别这样吃,比砒霜还毒

一碗隔夜米饭毒死7人?医生警告:米饭尽量别这样吃,比砒霜还毒

路医生健康科普
2026-05-31 20:15:03
俄政府出台临时禁令:6月1日起禁止出口航空煤油

俄政府出台临时禁令:6月1日起禁止出口航空煤油

新京报
2026-06-01 14:48:12
异性对接吻一定要慎重,一旦“接吻”了,关系就会发生重大变化!

异性对接吻一定要慎重,一旦“接吻”了,关系就会发生重大变化!

皓皓情感说
2026-05-15 12:29:38
50岁李小冉机场吃面,褪去滤镜才懂,普通人的衰老藏不住

50岁李小冉机场吃面,褪去滤镜才懂,普通人的衰老藏不住

庭小娱
2026-05-13 12:06:40
不管女人多大,出现这2个肢体反应,就是对你有意思了

不管女人多大,出现这2个肢体反应,就是对你有意思了

新时代的两性情感
2026-06-02 17:44:43
新加坡防长写打油诗总结"香会" 现场用中文朗读

新加坡防长写打油诗总结"香会" 现场用中文朗读

看看新闻Knews
2026-05-31 18:36:09
男人别碰!这6种女人绝不能发生关系,沾了必栽跟头

男人别碰!这6种女人绝不能发生关系,沾了必栽跟头

匹夫来搞笑
2026-06-02 22:12:18
东北军20万大军守不住热河,孙殿英血战日军7天,成功洗掉骂名

东北军20万大军守不住热河,孙殿英血战日军7天,成功洗掉骂名

浩渺青史
2026-06-01 05:25:27
总决赛形势迎来巨变!王博G4弃用一人收获奇效,4场仅拿9分太拉胯

总决赛形势迎来巨变!王博G4弃用一人收获奇效,4场仅拿9分太拉胯

老叶评球
2026-06-02 22:48:55
含剧毒,无解药!每家每户都有,千万别乱吃,哪怕煮烂了也没用!

含剧毒,无解药!每家每户都有,千万别乱吃,哪怕煮烂了也没用!

健康科普365
2026-04-14 16:25:08
2026-06-02 23:27:00
动力节点Java培训
动力节点Java培训
动力节点专注Java培训事业
1367文章数 36关注度
往期回顾 全部

科技要闻

烧掉千亿后,美团、阿里、京东谁先止血?

头条要闻

小学教师疑因打井纠纷杀害邻居 死者留下两未成年儿子

头条要闻

小学教师疑因打井纠纷杀害邻居 死者留下两未成年儿子

体育要闻

1米74的业余联赛替补,在英超踢中卫

娱乐要闻

奚梦瑶何猷君补办婚礼超幸福

财经要闻

智元和宇树的“暗战”愈演愈烈

汽车要闻

星途神秘新车轮廓曝光 又一款性能SUV要来了?

态度原创

游戏
亲子
时尚
数码
房产

黑神话后遗症!海外玩家见中式动作一律默认悟空新作

亲子要闻

进口针一支1.7万,年生长11厘米,国人怒了

穿冰淇淋色裙子,凉快!

数码要闻

华为nova 16系列发布:2999元起 全系配备后置红枫原色镜头

房产要闻

5200巨量投资曝光!未来五年,海南格局大变!

无障碍浏览 进入关怀版