7、Mybatis——分页


为什么需要分页?

  • 减少数据的处理量

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/

视频链接:https://www.bilibili.com/video/BV1NE411Q7Nx?p=13

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值