分页
为什么要分页?
提高性能,减少内存的压力,加快查询效率。
分页方式:逻辑分页、物理分页。
逻辑分页是在用户第一次访问时,将数据库的所有记录全部查询出来,添加到一个大集合中,然后存放在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();
}