Mybatis(三):分页的实现(Limit和RowBounds两种实现方式),面向接口编程

文章目录

  • 7. 分页的实现
      • mysql的分页语句
      • 使用limit实现分页【掌握】
      • 使用RowBounds实现分页(了解)
      • limit 和 rowBounds区别
    • 面向接口编程
    • 接口 & 抽象类

7. 分页的实现

mysql的分页语句

select * from user limit #{startIndex},#{pageSize};
# startIndex : 起始位置 ,默认是0开始
# pageSize :页面大小
# 如何计算出当前页面
currentPage = (currentPage-1* pageSize  

使用limit实现分页【掌握】

  1. 编写dao接口

    //查询全部用户实现分页
    List<User> selectUserByLimit(Map<String,Integer> map);
    
  2. 编写对应mapper映射文件的方法

    【参数我们可以使用map封装,方便参数传递】

    <select id="selectUserByLimit" parameterType="Map" resultType="User">
        select * from mybatis.user limit #{startIndex},#{pageSize}
    select>
    
  3. 测试

    【模拟分页数据:currentPage,pageSize】

    @Test
    public void selectUserByLimit(){
    
        //创建sqlSession
        SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
    
        //准备数据
        int currentPage = 2;//当前是第几页
        int pageSize = 2; //页面大小
    
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("startIndex",(currentPage-1)*pageSize);
        map.put("pageSize",pageSize);
    
        //测试
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> users = mapper.selectUserByLimit(map);
    
        for (User user : users) {
            System.out.println(user);
        }
    
        sqlSession.close();//关闭连接
    
    }
    

测试结果:
Mybatis(三):分页的实现(Limit和RowBounds两种实现方式),面向接口编程_第1张图片

使用RowBounds实现分页(了解)

  1. 写接口

    //查询全部用户实现分页使用RowBounds
    List<User> selectUserByRowBounds();
    
  2. 写Mapper映射文件

    <select id="selectUserByRowBounds" resultType="User">
        select * from mybatis.user
    select>
    
  3. 编写测试代码

    @Test
    public void selectUserByRowBounds(){
        //创建sqlSession
        SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
    
        int currentPage = 2; //当前页
        int pageSize = 2; //页面大小
    
        RowBounds rowBounds = new RowBounds((currentPage - 1) * pageSize, pageSize);
    
        //注意点;使用RowBounds就不能使用getMapper了
        //selectList: 接收一个List
        //selectMap: 接收一个Map
        //selectOne : 接收只有一个对象的时候
    
        List<User> users = sqlSession.selectList("com.westos.dao.UserDao.selectUserByRowBounds", null, rowBounds);
    
        for (User user : users) {
            System.out.println(user);
        }
    
    
    }
    

测试结果:
Mybatis(三):分页的实现(Limit和RowBounds两种实现方式),面向接口编程_第2张图片

limit 和 rowBounds区别

  • rowBounds 本质就是封装了limit
  • limit 是在SQL层面实现分页,需要先通过SqlSession获得拿到Mapper的接口的实现类,通过实现类传入参数(起始位置,页面大小),从而实现分页的功能
  • rowBounds 在代码层面实现分页。不需要获取Mapper接口的实现类,需要先通过有参构造,在通过SqlSession对象调用selectList,selectMap或者selectOne方法实现分页,出入的参数依次是对应的mapper接口中的抽象方法的全域名,一个指定的Object对象(一般为null),以及RowBounds对象,如selectList(“com.westos.dao.UserDao.selectUserByRowBounds”, null, rowBounds)。RowBounds本质就是封装了limit

面向接口编程

提出的原因:解耦,方便拓展,提高代码的复用性,上层不用管下层实现,只用去调用对应的接口即可。规范性好。

面向过程编程:随着系统越来越大,我们无法使用面向过程的思想满足。面对对象。

面向对象编程:所有系统耦合性高,所有的功能都是由许许多多不同的对象去完成的。随着系统越来越大。提纲

接口 & 抽象类

面向接口编程:约束开发人员操作,而且方便扩展以及规划。

更深层次的分离:定义与实现的一个分离;

接口可以反映一个开发人员的水平高低以及对系统架构理解;

你可能感兴趣的:(Mybatis)