为什么需要分页?
- 减少数据的处理量
7.1、使用Limit实现分页
#语法
SELECT * FROM table LIMIT stratIndex,pageSize
SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
#为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
#如果只给定一个参数,它表示返回最大的记录行数目:
SELECT * FROM table LIMIT 5; //检索前 5 个记录行
#换句话说,LIMIT n 等价于 LIMIT 0,n。
7.2、使用Mybatis实现分页
1、接口
//选择全部用户实现分页
List<User> selectUser(Map<String,Integer> map);
2、Mapper.xml
<select id="selectUser" parameterType="map" resultType="user">
select * from user limit #{startIndex},#{pageSize}
</select>
3、测试
//分页查询 , 两个参数startIndex , pageSize
@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();
}
分页公式:
起始位置:(当前页-1)*页面大小
例如:每页显示5个
0,5 -> (1-1)*5=0
5,5 -> (2-1)*5=5
10,5 -> (3-1)*5=10
7.3、RowBounds分页
不再使用SQL实现分页
1、接口
List<User> getUserByRowBounds(Map<String,Integer> map);
2、mapper.xml
<select id="getUserByRowBounds" resultType="com.chen.pojo.User">
select * from user;
</select>
3、测试
@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();
}
7.4、PageBean分页
1、编写一个PageGean用来存放页面信息
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用来获取session,等学了Spring,托管给Spring,就不需要此类了
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中的SQL语句
<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;
}
}
6、编写测试类
@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);
}
}
结果:
7.5、分页插件
1、添加依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
2、给UserService接口添加方法
PageInfo<User> findPageInfo(Integer pageNum, Integer pageSize) throws Exception;
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、在mybatis核心配置文件中配置拦截器
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
</plugin>
</plugins>
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);
}
}
6、结果
PageHelper:https://pagehelper.github.io/docs/howtouse/