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/
热门推荐
精选5个通过图片查找网页视频来源的方法
腹胀怎么办?中医帮您来“消气”
汽车HR接招:如何把"牛人"招进门?
考研综合面试常见问题及应对策略
Excel中根据点绘制曲线的完整指南
杭州数字经济核心产业爆发,引领高质量发展新潮流
电力工程合同交底模板:法律视角下的规范化与风险防范
致敬松骨峰战斗中最可爱的人,永远怀念你
政策调整|2025年国家留学基金委(CSC)联合培养博士提前申报
怎么判断是干槽症
怎么判断是干槽症
生肖如何在传统节日和庆祝活动中发挥作用?
玉米可以代替米饭吗?营养专家给出权威解答
巴西地理知识全解析
文化中国行|在文物修复中对望历史
【建议收藏】2025游戏加加优化指南:提升游戏性能的实用技巧
高考后想最快进入德国大学,推荐选择哪些英授专业?
健脾丸和保和丸能一起吃吗?医生的专业解答来了
如何了解外地医疗的报销比例?这些比例如何影响费用承担?
来大姨妈减肥瘦的快吗
如何快速拿到养殖业补贴
锡克族,在印度是怎样的存在?
周四003 世预赛 韩国对阵阿曼,棒子能否轻松拿下!
流感如何快速恢复 流感自愈的几个过程
不同类型的防水连接器适用于哪些具体场景?
加湿器放在家里什么地方好
卧室加湿器放哪里最好?这些实用建议请收好
医院洗牙和口腔诊所洗牙哪个更优?详解两者的区别与选择建议
什么是大贸摩托车?
75%的酒精可以直接涂皮肤吗?使用时需注意这些事项