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/
热门推荐
“副脾”,脾的“备胎”?
港口大测评,谁是“五星港口”?
恢复肾功能最快的食物
大学实验室人脸识别门禁应用方案
汕头大学:精细化人才培养与全额奖学金计划
朱元璋为何设立锦衣卫?锦衣卫是用来做什么的
孩子耳朵闷怎么回事
怎么备份照片和视频最好
升学考试在即,“聪明药”真的能让你变聪明吗?
进度计划表颜色代表意思:如何通过颜色优化项目管理效率?
随机mac和设备mac有什么区别(随机MAC好还是设备MAC好)
什么是异构计算?
网络自适应优化技术
如何串联部门之间的协作
上证指数走势分析:把握投资机会的关键秘诀
“冬宜密雪,有碎玉声” | 适合冬天听的十五种声音
九首经典的冬日诗词,写尽了冬天,悟透了人生百味
桂枝生姜枳实汤的作用与功效、适应症、临床应用、医案案例配方
如何深入了解期货市场的交易规则?这些交易规则如何影响投资者的决策?
2026QS世界大学排名增加新指标!排名或迎来洗牌?
这55所院校四大排名都在Top100,闭眼冲就行了!
为什么妈妈叫阿姨?揭秘家庭称呼的文化与习俗
阿姨怎么读英语
高端媒体看邯郸丨“种一季”变“收两季” 高标准农田助力农业增效益
赛马获胜的关键:保持最大速度
溥仪不仅是清朝最后一位皇帝 也是中国历史上中华帝制的终结者
四季护肤全攻略:不同季节的护肤要点与注意事项
盘点历史上著名的四次藩王叛乱,最后一次是三藩之乱!
信用社贷款年化率详细解析:各类贷款产品的利率对比与选择建议
2025自动化领域的未来趋势与挑战