7. 分页的实现
mysql的分页语句
select * from user limit #{startIndex},#{pageSize};
# startIndex : 起始位置 ,默认是0开始
# pageSize :页面大小
# 如何计算出当前页面
currentPage = (currentPage-1)* pageSize
使用limit实现分页【掌握】
-
编写dao接口
//查询全部用户实现分页 List<User> selectUserByLimit(Map<String,Integer> map);
-
编写对应mapper映射文件的方法
【参数我们可以使用map封装,方便参数传递】
<select id="selectUserByLimit" parameterType="Map" resultType="User"> select * from mybatis.user limit #{startIndex},#{pageSize} </select>
-
测试
【模拟分页数据: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();//关闭连接 }
测试结果:
使用RowBounds实现分页(了解)
-
写接口
//查询全部用户实现分页使用RowBounds List<User> selectUserByRowBounds();
-
写Mapper映射文件
<select id="selectUserByRowBounds" resultType="User"> select * from mybatis.user </select>
-
编写测试代码
@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); } }
测试结果:
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
面向接口编程
提出的原因:解耦,方便拓展,提高代码的复用性,上层不用管下层实现,只用去调用对应的接口即可。规范性好。
面向过程编程:随着系统越来越大,我们无法使用面向过程的思想满足。面对对象。
面向对象编程:所有系统耦合性高,所有的功能都是由许许多多不同的对象去完成的。随着系统越来越大。提纲
接口 & 抽象类
面向接口编程:约束开发人员操作,而且方便扩展以及规划。
更深层次的分离:定义与实现的一个分离;
接口可以反映一个开发人员的水平高低以及对系统架构理解;