MyBatis分页实战:从基础到插件实现
创作时间:
作者:
@小白创作中心
MyBatis分页实战:从基础到插件实现
引用
51CTO
1.
https://blog.51cto.com/u_14402/13509119
MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。在实际开发中,分页功能是必不可少的,本文将详细介绍在MyBatis中实现分页的几种方式。
为什么需要分页?
在数据库操作中,当数据量较大时,一次性查询所有数据不仅效率低下,还可能导致内存溢出。因此,分页查询成为了一种常见的解决方案。通过分页,我们可以控制每次查询的数据量,提高查询效率和系统性能。
使用Limit实现分页
MySQL提供了Limit关键字来实现分页功能。其基本语法如下:
SELECT * FROM table LIMIT startIndex, pageSize;
startIndex
:起始位置(从0开始)pageSize
:每页显示的记录数
例如:
SELECT * FROM table LIMIT 5, 10; // 检索记录行 6-15
SELECT * FROM table LIMIT 95, -1; // 检索记录行 96-last
SELECT * FROM table LIMIT 5; // 检索前 5 个记录行
使用MyBatis实现分页
在MyBatis中,可以通过在SQL语句中使用Limit来实现分页。具体步骤如下:
Mapper.xml配置
<select id="selectUser" parameterType="map" resultType="user"> select * from user limit #{startIndex},#{pageSize} </select>
Java代码实现
@Test public void testSelectUser() { SqlSession session = MybatisUtils.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); int currentPage = 1; //第几页 int pageSize = 2; //每页显示几个 Map<String,Integer> map = new HashMap<String,Integer>(); map.put("startIndex",(currentPage-1)*pageSize); map.put("pageSize",pageSize); List<User> users = mapper.selectUser(map); for (User user: users){ System.out.println(user); } session.close(); }
RowBounds分页
RowBounds是MyBatis提供的另一种分页方式,它不需要在SQL中使用Limit,而是通过RowBounds对象来控制分页。
Mapper.xml配置
<select id="getUserByRowBounds" resultType="com.chen.pojo.User"> select * from user; </select>
Java代码实现
@Test public void testUserByRowBounds() { SqlSession session = MybatisUtils.getSession(); int currentPage = 2; //第几页 int pageSize = 2; //每页显示几个 RowBounds rowBounds = new RowBounds((currentPage-1)*pageSize,pageSize); //通过session.**方法进行传递rowBounds,[此种方式现在已经不推荐使用了] List<User> users = session.selectList("com.kuang.mapper.UserMapper.getUserByRowBounds", null, rowBounds); for (User user: users){ System.out.println(user); } session.close(); }
PageBean分页
PageBean是一种自定义的分页实现方式,通过封装分页信息和数据列表来实现分页功能。
PageBean类定义
public class PageBean<T> { private int totalPage; // 总页数 private int totalCount; // 总共有多少条数 private int currentPage; // 当前是第几页 private int currentCount; // 当前页面显示多少条数据 private List<T> list = new ArrayList<T>(); // get/set/tostring。。。 }
MapperUtil类定义
public class SessionUtil { private static InputStream in; private static SqlSessionFactory build; private static SqlSession session; public static SqlSession getSession(){ try { in = Resources.getResourceAsStream("mybatis-config.xml"); build = new SqlSessionFactoryBuilder().build(in); session = build.openSession(); } catch (IOException e) { e.printStackTrace(); } return session; } public static void close(){ if(session != null){ session.close(); } if (in != null){ try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } }
UserMapper接口定义
// 查询数据条数 long selectAllCount(); // 分页查询用户 List<User> selectUserLimit(@Param("startIndex") int startIndex,@Param("pageSize") int pageSize);
UserMapper.xml配置
<select id="selectAllCount" resultType="long"> select count(*) from user </select> <select id="selectUserLimit" resultType="user"> select * from user limit #{startIndex},#{pageSize} </select>
UserService接口定义
public interface UserService { /** * 分页查询 * @param page 当前页 * @param count 每页显示多少条数据 * @return */ PageBean getPageBean(Integer page, Integer count); }
UserServiceImpl实现
public class UserServiceImpl implements UserService { /** * * @param page 页面索引(当前页) * @param count 页面大小 * @return */ public PageBean getPageBean(Integer page, Integer count) { // 封装pagebean对象 PageBean pageBean = new PageBean(); // 设置当前页 pageBean.setCurrentPage(page); // 设置每页显示多少条数据(页面大小) pageBean.setCurrentCount(count); SqlSession session = SessionUtil.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); long totalCount = mapper.selectAllCount(); // 设置总共有多少条记录 pageBean.setTotalCount((int)totalCount); // 设置总页数 int totalPage = (int) (totalCount/(double)pageBean.getCurrentCount()); pageBean.setTotalPage(totalPage); // 设置当前的所有数据 公式:(当前页-1)*页面大小 List<User> userList = mapper.selectUserLimit(((page - 1) * count), count); pageBean.setList(userList); return pageBean; } }
测试类
@Test public void selectUserLimit(){ UserServiceImpl userService = new UserServiceImpl(); PageBean pageBean = userService.getPageBean(2, 3); System.out.println("当前页的信息条数:"+pageBean.getCurrentCount()); System.out.println("当前页的页码:"+pageBean.getCurrentPage()); System.out.println("所有的信息条数:"+pageBean.getTotalPage()); System.out.println("所有的页数:"+pageBean.getTotalCount()); List<User> list = pageBean.getList(); for (User user : list) { System.out.println(user); } }
测试结果:
分页插件
PageHelper是一个非常方便的分页插件,可以简化分页的实现。
添加依赖
UserService接口定义
UserServiceImpl实现
public PageInfo<User> findPageInfo(Integer pageNum, Integer pageSize) throws Exception { //startPage PageHelper.startPage(pageNum,pageSize); try { //调用dao的查询方法 SqlSession session = SessionUtil.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); List<User> userList = mapper.selectAll(); //创建PageInfo,把获取到的列表作为参数传入 PageInfo<User> pageInfo = new PageInfo<User>(userList); return pageInfo; } catch (Exception e) { e.printStackTrace(); throw e; } }
配置拦截器
测试
@Test public void getPageInfo() throws Exception { UserService userService = new UserServiceImpl(); PageInfo<User> pageInfo = userService.findPageInfo(2, 3); System.out.println("当前页:"+pageInfo.getPageNum()); System.out.println("每页显示多少条:"+pageInfo.getPageSize()); System.out.println("总页数:" + pageInfo.getPages()); System.out.println("当前页有多少条数据:" + pageInfo.getSize()); System.out.println("总共多少条数据" + pageInfo.getTotal()); //获取用户列表 List<User> list = pageInfo.getList(); for(User user: list){ System.out.println(user); } }
更多关于PageHelper的详细信息,可以参考官方文档:https://pagehelper.github.io/docs/howtouse/
热门推荐
什么是钛白粉?钛白粉的特性、用途及来源解析
自恋型人格障碍怎么治疗
如何通过项目质量管理案例提升团队效率和项目成功率?
腰部去寒气最快的方法
浙江省质量科学研究院新添2项计量标准 填补省级相关领域技术空白
八段锦:传统养生功法在现代的传承与推广
尘肺病的症状与预防措施
如何选择正确的建站平台
细腻解构时代记忆,深入挖掘现实议题,韩国年代剧迎来新爆款
中国煤矿智能化行业发展目标明确且动因充足 市场已进入爆发式增长阶段
两队均三连败开局!足球报谈亚泰vs三镇:亚泰力争打好第一个主场
长春亚泰即将对战武汉三镇 对阵双方可谓难兄难弟
小心,别让预制菜单变身医院的挂号单!
花鼓戏也吊威亚?沉浸式幻境秀《新刘海砍樵》来了
左肾盂扩张是怎么回事
门萨智商测试:揭秘全球最出名的高智商人群俱乐部
门的种类有哪些?各自优缺点是什么?
澳门文化局新增10处世遗景点线上VR导览服务
物业和业主是什么关系民法典解读,构建和谐社区
女神节必看!蒸汽眼罩选购与使用指南来了
“手机辐射致癌”传言从未消停,新研究已证实
武夷山旅游攻略:探索世界遗产的绝美山水与文化风情
左耳鸣是什么原因引起的怎么解决好
右肺结节是什么意思?一文读懂定义、诊断与处理方法
电脑显示屏花屏竖条纹修复图解(详细教你修复电脑显示屏花屏竖条纹的方法)
奥运首金得主黄雨婷这一路:打好每一枪,走好每一步
黄雨婷破世界纪录夺冠 盛李豪0.1环险胜摘金
工程项目管理EAC如何计算
从“冰雪”到“研学”,西岭雪山打造文旅融合新典范
烤鲍鱼怎么烤 烤鲍鱼要烤多久