进阶MyBatis -- 实现分页的两种方式(limit AND RowBounds)

前言:

在实现分页时,我们先看看什么是分页,及分页的具体用处。

分页展示

  • 在搜索内容或者查找东西时,我们经常会看到如上图所展现的效果。这就是分页。简单来说,就是当前页已经无法展现我们所有内容,就需要分页这个功能来实现啦。

分页的优势:

	1、使得内容更加有条理。想一下,如果没有分页,那么所有内容都展现在同一页的时候,
	   用户就需要一直向下翻, 那么翻到啥时候才是头,哈哈。
	2、加载更快,性能更好。一次查20个,比一次查20000个性能肯定更好;另外如果数据量很大,
		一次性将内容都查询度出来,查询出来的结果是放在内存里面的,内存没有这么大。
	3、有时并不不需要这么多数据,如新闻,一般人可能只看最近前20条;如果我们将后面的也都
	   查询出来了,就是浪费。
    4、给予用户更好的视觉效果。通过分页使得页面内容更加美观,用户体验效果更好。

Mybatis中实现分页的两种方式:

1、通过Mysql语句进行实现:

// currentPage:当前页码 pageSize:页面大小
// Mysql 中的当前页是从 0 开始的,但是我们的页码往往是从 1 开始的,所以需要 - 1
select * from user limit (currentPage - 1) * pageSize,pageSize
虽然这个分页语句没问题,但是在实际运用时 limit 后面必须是常量,也就是说 limit 后面
是不能跟算术运算符的,如果要跟算术运算符,需要用 concat 进行字符串的拼接才可以实现。
为了解决上使用 limit 时所出现的问题,我们可以直接计算好值进行传入,这样分页语句接受到
的参数就是一个常量了。
还是拿之前的程序来测试一下该语句是否可以成功查询到数据:
从上面的语句可以看出,我们需要两个参数: 页面开始位置,页面大小。
两个参数我们需要怎么传递呢?
1、创建一个对象,传一个对象,将两个参数作为该对象的属性进行传值。
2、用 Map 对象进行传值,Map 是以键值对的进行存储信息,而我们取出相信的信息时也是利用
   键值对的形式,所以用 Map 相对来说比传一个实体类要好的多。

UserMapper.xml:

在改文件中添加下列内容:
<!-- 查找所有用户 -->
<select id="findAll" resultType="rj.cool.bean.User" parameterType="map">
    select * from user limit #{startIndex},#{pageSize}
 </select>

测试类代码:

   @Test
    /*
     * 分页查询
     *
     */
    public void selectAllUser() throws IOException {
        SqlSession session = MyBatisDButils.getSession();
        Map<String,Integer> map = new HashMap<String, Integer>();
        int currentPage = 1,pageSize = 3;
        map.put("startIndex",(currentPage - 1) * pageSize);
        map.put("pageSize",pageSize);
        List<User> list = session.selectList("rj.cool.dao.UserMapper.findAll",map);
        for(User u:list) {
            System.out.println(u.getId() + "   " + u.getName() + "  " + u.getPwd());
        }
        session.close();
    }

效果图:
在这里插入图片描述

2、通过RowBounds来实现分页:

在用 RowBounds 实现分页时先来了解一下为什么用这个来实现?
先看一下我们在用 selectList() 时对应的有几个方法:

在这里插入图片描述

看一下第二个方法,我们了解到 在用 selectList() 有这样一个方法:在该方法中就有 RowBounds 
类产生的对象。
接着我们看一下 RowBounds 这个 类 里面有哪些东西?

在这里插入图片描述

我们看到该类中有两个属性: offset,limit,这两个对象就对应着我们 sql 语句中的 startIndex,
pageSize, 所以我们将这两个值传给 offset, limit  就可以啦, 然后调用包含 Rowbounds 的
selectList() 就可以实现分页啦。

UserMapper.xml:

用 Rowbounds 实现时 sql 语句就不用 limit 了,Mybatis 都帮我们做好啦。
 <!-- 查找所有用户 (用 rowbounds 实现分页)-->
 <select id="getAllUser" resultType="rj.cool.bean.User">
   select * from user
 </select>

测试类代码:

    @Test
    public void getAllUser() throws IOException {
        SqlSession session = MyBatisDButils.getSession();
        RowBounds rowBounds = new RowBounds(0,2);
        List<User> list = session.selectList("rj.cool.dao.UserMapper.findAll",null, rowBounds);
        for(User u:list) {
            System.out.println(u.getId() + "   " + u.getName() + "  " + u.getPwd());
        }
        session.close();
    }

在这里插入图片描述

后记:

到此,分页的具体实现就结束了,可能还有多种实现分页的奇数,然后在下才疏学浅,如有解释的不到位
的地方,欢迎各位大佬能够悉数指出,在下万分感激。
嘻嘻,如果对您有帮助,愿您留下小赞,您的小小的鼓励是我前进的不懈动力。
加油!
原创文章 6 获赞 6 访问量 313

猜你喜欢

转载自blog.csdn.net/qq_43619271/article/details/106169452