一個通用分頁類
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(intlow, 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
一個通用分頁類