一、功能前端
這個通用分頁類實現的功能是輸入頁數(第幾頁)和每頁的數目,就能得到相應的數據。git
二、實現原理github
分頁的實現一般分爲兩種,一種是先把數據全查詢出來再分頁,一種是須要多少查詢多少,這裏使用第二種,因此就須要先實如今dao層可以查詢必定範圍內的數據,這裏就實現經過id做爲鍵值,查詢必定範圍內的數據的功能spring
dao層須要實現一個返回id在一個範圍內的數據,那就在dao層的接口中添加一個這個方法:sql
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:api
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中的方法便可,不過我還得在想一想這樣是否合理。。。mybatis
總之先這樣寫着吧,test中將添加這樣的方法及實現:app
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(); } }
三、實現效果:
先看看數據庫的數據吧:
而後是瀏覽器中使用時的狀態:
四、總結
這裏我實現了一個pageEntity類,這個類使用了泛型因此也支持其餘類,目前實現的功能可以傳入當前頁和每頁的數目,獲得相應的數據,前端應該還須要咱們返回,總的數據量,總共有多少頁等等的數據,不過這都是額外的操做了,實現也挺簡單的。經過在dao層添加方法,用sql語句計算出來,再給賦值就行了。
五、源代碼
源代碼能夠從這裏獲取:https://github.com/xbtshady/spring_mybatis