1、功能
这个通用分页类实现的功能是输入页数(第几页)和每页的数目,就能获得相应的数据。
2、实现原理
分页的实现通常分为两种,一种是先把数据全查询出来再分页,一种是需要多少查询多少,这里使用第二种,所以就需要先实现在dao层能够查询一定范围内的数据,这里就实现通过id作为键值,查询一定范围内的数据的功能
dao层需要实现一个返回id在一个范围内的数据,那就在dao层的接口中添加一个这个方法:
List<User> selectByRange(@Param("low") Integer low, @Param("high") Integer high);
在mapper.xml中,添加相应的sql语句:
<select id="selectByRange" resultMap="BaseResultMap"> SELECT <include refid="Base_Column_List"/> FROM t_user WHERE id BETWEEN #{low,jdbcType=INTEGER} AND #{high,jdbcType=INTEGER} </select>
然后在Service层的接口和类添加这样一个方法,这里实现了输入上下标返回一个User的List:
public List<User> findByRange(int low, int high) { return userDao.selectByRange(Integer.valueOf(low), Integer.valueOf(high)); }
再然后是通用的分页类,这里的low和high,将在pagenumber当前页数或limit被修改时同时被修改:
public class pageEntity<T> { private List<T> list; //对象记录结果集 private int total; // 总条数数 private int limit; // 每页显示条数 private int pages; // 总页数 private int pageNumber; // 当前页 private int low; //需要获取数据的第一个id private int high; //需要获取数据的最后一个id public int getLow() { return low; } public void setLow(int low) { this.low = low; } public int getHigh() { return high; } public void setHigh(int high) { this.high = high; } public List<T> getList() { return list; } public void setList(List<T> list) { this.list = list; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public int getLimit() { return limit; } public void setLimit(int limit) { this.limit = limit; this.low = (this.pageNumber - 1) * this.limit; this.high = low + this.limit - 1; } public int getPages() { return pages; } public void setPages(int pages) { this.pages = pages; } public int getPageNumber() { return pageNumber; } public void setPageNumber(int pageNumber) { this.pageNumber = pageNumber; this.low = (this.pageNumber - 1) * this.limit; this.high = low + this.limit - 1; } }
然后是测试类,其实这个测试类我是准备命名为manager类的,这样dao层实现基本的数据库操作,service层实现针对实体类的基本操作,然后manager类中实现前端的需求,然后api类,也就是jersey中就只需要调用manager中的方法即可,不过我还得在想想这样是否合理。。。
总之先这样写着吧,test中将添加这样的方法及实现:
public pageEntity<User> Paging(pageEntity<User> pageEntity) { pageEntity.setList(userService.findByRange(pageEntity.getLow(),pageEntity.getHigh())); return pageEntity; }
然后就是api类中调用了:
@Path("hello") public class JerseyTest { @GET @Produces("text/plain") @Path("page") public String getString(@QueryParam("page") int page, @QueryParam("limit") int limit) { ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml"); TestAPI test = (TestAPI) context.getBean("test"); pageEntity<User> pageEntity = new pageEntity<User>(); pageEntity.setLimit(limit); pageEntity.setPageNumber(page); pageEntity = test.Paging(pageEntity); StringBuilder stringBuilder = new StringBuilder(); for (User user : pageEntity.getList()) { stringBuilder.append(" "); stringBuilder.append(user.getUsername()); } return stringBuilder.toString(); } }
3、实现效果:
先看看数据库的数据吧:
然后是浏览器中使用时的状态:
4、总结
这里我实现了一个pageEntity类,这个类使用了泛型所以也支持其他类,目前实现的功能能够传入当前页和每页的数目,得到相应的数据,前端应该还需要我们返回,总的数据量,总共有多少页等等的数据,不过这都是额外的操作了,实现也挺简单的。通过在dao层添加方法,用sql语句计算出来,再给赋值就好了。
5、源代码
源代码可以从这里获取:https://github.com/xbtshady/spring_mybatis