问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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来实现分页。具体步骤如下:

  1. Mapper.xml配置

    <select id="selectUser" parameterType="map" resultType="user">
      select * from user limit #{startIndex},#{pageSize}
    </select>
    
  2. 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对象来控制分页。

  1. Mapper.xml配置

    <select id="getUserByRowBounds" resultType="com.chen.pojo.User">
        select * from user;
    </select>
    
  2. 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是一种自定义的分页实现方式,通过封装分页信息和数据列表来实现分页功能。

  1. 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。。。
    }
    
  2. 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();
                }
            }
        }
    }
    
  3. UserMapper接口定义

    // 查询数据条数
    long selectAllCount();
    
    // 分页查询用户
    List<User> selectUserLimit(@Param("startIndex") int startIndex,@Param("pageSize") int pageSize);
    
  4. UserMapper.xml配置

    <select id="selectAllCount" resultType="long">
        select count(*) from user
    </select>
    
    <select id="selectUserLimit" resultType="user">
        select * from user limit #{startIndex},#{pageSize}
    </select>
    
  5. UserService接口定义

    public interface UserService {
        /**
         * 分页查询
         * @param page  当前页
         * @param count 每页显示多少条数据
         * @return
         */
        PageBean getPageBean(Integer page, Integer count);
    }
    
  6. 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;
        }
    }
    
  7. 测试类

    @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是一个非常方便的分页插件,可以简化分页的实现。

  1. 添加依赖

  2. UserService接口定义

  3. 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;
        }
    }
    
  4. 配置拦截器

  5. 测试

    @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/

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号