分页

为什么要分页?

提高性能,减少内存的压力,加快查询效率。

分页方式:逻辑分页、物理分页

逻辑分页是在用户第一次访问时,将数据库的所有记录全部查询出来,添加到一个大集合中,然后存放在session对象,再通过页码计算出当前页需要显示的数据内容,存储到一个小的list的集合中,并将其存储到request对象中,跳转到JSP页面,进行遍历显示。 当用户第二次访问时,只要不关闭浏览器,还会从session中获取数据,来进行显示。因为此种方法是在内存的session对象中进行计算分页显示的,而不是真正的将我们数据库进行分页的,所以叫做逻辑分页。

  • 缺点:如果需要查询的数据量过大,session将耗费大量的内存;因为是在session中获取数据,如果第二次或者更多此的不关闭浏览器访问,会直接访问session,从而不能保证数据是最新的
  • 优点:统一代码处理方式,较容易跨数据库做迁移。

物理分页,使用数据库自带的分页机制,例如,Oracle数据库的rownum,或者Mysql数据库中的limit等机制来完成分页操作。因为是对数据库的数据进行分页条件查询,所以叫物理分页。

  • 缺点 : 每一次物理分页都会去连接数据库。
  • 优点:数据能够保证最新,由于根据分页条件会查询出少量的数据,所以不会占用太多的内存。

1 使用limit实现分页(物理分页)

-- SQL语句实现分页 startIndex开始索引,pageSize页面大小
select * from user limit startIndex,pageSize;

1.定义接口方法

//使用limit完成分页
List<User>getUserList1(HashMap<String,Integer> map);

2.编写接口对应xml配置文件的SQL语句

<!--    分页-->
<select id="getUserList1" parameterType="map" resultType="User">
    select * from mybatis.user limit #{startIndex},#{pageSize};
</select>

3.测试

//limit分页测试
@Test
public void getUserList01(){
    SqlSession sqlSession = MybatisUtils4.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    HashMap<String, Integer> map = new HashMap<String, Integer>();
    map.put("startIndex",1);
    map.put("pageSize",4);

    List<User> userList = mapper.getUserList1(map);

    for (User u:userList ) {
        System.out.println(u);
    }
    sqlSession.close();     

}

2 使用RowBounds(逻辑分页)

不使用SQL分页

1.定义接口方法

//使用RowBounds
List<User>getUserList2();

2.编写接口对应xml配置文件的SQL语句

<!--    分页2-->
<select id="getUserList2" parameterType="map" resultType="User">
     select * from mybatis.user ;
</select>

3.测试

//RowBounds分页测试
@Test
public void getUserList02(){
    RowBounds rowBounds = new RowBounds(1, 4);

    SqlSession sqlSession = MybatisUtils4.getSqlSession();
    List<User> userList2 = sqlSession.selectList("com.JH.dao.UserMapper.getUserList2", null, rowBounds);

    for (User u: userList2) {
        System.out.println(u);
    }
    sqlSession.close();
}