今天在写淘淘商城的时候,淘淘商城介绍了一种全新的分页写法,我想到了到现在为止,我看到过三种分页方式,所以写一写,将我看到的分页方式原理总结一下,或许其中存在极大的耦合性:
一:mvc模式下的分页
mvc中使用一个写好的PageModel去装载,model中记录了当前页,上/下一页,总页数等参数,并且用一定的算法,使得只需要输入当前页和总页数,就能得到所有的数据,最后,在DBHelper的方法中传入PageModel参数,在sql语句中用limit限制,实现分页
二:ssr项目中的分页
实习中遇到的ssr项目,从action中开始,传入pageInfo这个实体类,类似于mvc模式下的分页,在到层的xxxDaoImp中,将参数pageInfo作为param传入到sql中
举例: public List<AdminPojo> getAdminPojoListByPage(AdminQuery adminQuery,
PageInfo pageInfo) {
Hashtable<String, Object> param = new Hashtable<String, Object>();
if (pageInfo != null && pageInfo.getSkip() != null) {
param.put("skip", pageInfo.getSkip());
}
if (pageInfo != null && pageInfo.getPageSize() != null) {
param.put("pageSize", pageInfo.getPageSize());
}
return this.smcTemplate.queryForList(
"sqlmap_admin_lz_cc.getAdminPojoListByPage", param);
}
三:淘淘商城的分页
淘淘商城的分页写法是,导入了gitHub官网的pageHelper插件(在MyBatis的xml配置文件中添加plugins),这个插件的原理是实现了MyBatis的interceptor接口,扩展了MyBatis的功能。这样就可以在插件中获得sql语句,为sql语句添加限制条件
测试类如下:
public class TestPageHelper {
@Test
public void testPageHelper() {
//创建一个spring容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
//从spring容器中获得Mapper的代理对象
TbItemMapper mapper = applicationContext.getBean(TbItemMapper.class);
//执行查询,并分页
TbItemExample example = new TbItemExample();
//分页处理
PageHelper.startPage(2, 10);
List<TbItem> list = mapper.selectByExample(example);
//取商品列表
for (TbItem tbItem : list) {
System.out.println(tbItem.getTitle());
}
//取分页信息
PageInfo<TbItem> pageInfo = new PageInfo<>(list);
long total = pageInfo.getTotal();
System.out.println("共有商品:"+ total);}
}
但是视频教学中说到,分页插件对逆向工程生成的代码支持不好,不能对有查询条件的查询分页。会抛异常。
所以需要使用它修改过的版本。