本文將介紹如何實現分頁查詢功能,推薦使用github的pagehelper插件實現(事實上你們基本都是這麼幹的),但本文的實現方式和大多數不一樣,廢話少說,如今就帶着你們看看區別在哪裏。 先看pom.xml依賴:至關簡單的mybatis-spring依賴+mysql+pagehelper+fastjson前端
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.44</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--pageHelper--> <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.5</version> </dependency> </dependencies>
application.yml配置java
spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/javashop driver-class-name: com.mysql.jdbc.Driver http: encoding: charset: utf-8 enabled: true mybatis: type-aliases-package: com.developlee.mybatispagehelper.domain mapper-locations: classpath:/mapper/*.xml pagehelper: helper-dialect: mysql reasonable: true support-methods-arguments: true params: count=countSql
擼代碼了,先從controller開始,開幹!隨便寫個簡單點的mysql
@RestController public class UserController { @Autowired private UserServiceImpl userService; @PostMapping("/queryList") public ResponseEntity queryList(@RequestBody UserEntity userEntity) { List<UserEntity> userEntities = userService.findUserList(userEntity); return new ResponseEntity( new PageEntity<>(userEntities), HttpStatus.OK); } }
仔細看,是否是發現並_沒有PageHelper.startPage(int num, int size)這句話?固然沒有最好,每次分頁查詢都寫這句,是否是很煩。。。還有_PageEntity是個啥?不要着急,讓咱們慢慢揭開面紗。 service
和dao
還有userMapper.xml
沒什麼好講的,就是爲了userService.findList
能正常查出個list數組來。代碼懶得貼了,佔位置,相信你們也都會。 Next,就是重點了, 看看UserEntity實體作了什麼。git
public class UserEntity extends BaseEntity { private Long id; private String username; private String password; private String mobile; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } }
OMG,繼承了一個BaseEntity,那BaseEntity有哪些內容呢,其實至關easy,就是些咱們要傳的page參數.github
public abstract class BaseEntity { //分頁大小 private Integer pageSize; //分頁開始 private Integer pageNum; private Integer total; //排序類型DESC or AES private String sort; private String orderBy; @JSONField(serialize = false) public Integer getPageSize() { return pageSize; } public void setPageSize(Integer pageSize) { this.pageSize = pageSize; } @JSONField(serialize = false) public Integer getPageNum() { return pageNum; } public void setPageNum(Integer pageNum) { this.pageNum = pageNum; } @JSONField(serialize = false) public Integer getTotal() { return total; } public void setTotal(Integer total) { this.total = total; } @JSONField(serialize = false) public String getOrderBy() { return orderBy; } public void setOrderBy(String orderBy) { this.orderBy = orderBy; } @JSONField(serialize = false) public String getSort() { return sort; } public void setSort(String sort) { this.sort = sort; } }
注意哦,這些個參數返回給前端時都不須要給的哦。因此用了@JSONField(serialize=false) 來搞定。web
講到這,彷佛沒什麼神奇之處,呃呃呃,是的,這些都是爲了傳參數。看看PageEntity ,這纔是今天的主角兒~~~spring
import com.github.pagehelper.Page; import java.io.Serializable; import java.util.Collection; import java.util.List; /** * 對Page<E>結果進行包裝 * <p/> * 新增分頁的多項屬性 */ @SuppressWarnings({"rawtypes", "unchecked"}) public class PageEntity<T> implements Serializable { private static final long serialVersionUID = 1L; //當前頁 private int currentPage; //每頁的數量 private int pageSize; //總記錄數 private long total; //總頁數 private int pages; //結果集 private List<T> list; //是否爲第一頁 private boolean isFirstPage = false; //是否爲最後一頁 private boolean isLastPage = false; public PageEntity() { } /** * 包裝Page對象 * * @param list */ public PageEntity(List<T> list) { if (list instanceof Page) { Page page = (Page) list; this.currentPage = page.getPageNum(); this.pageSize = page.getPageSize(); this.pages = page.getPages(); this.list = page; this.total = page.getTotal(); } else if (list instanceof Collection) { this.currentPage = 1; this.pageSize = list.size(); this.pages = 1; this.list = list; this.total = list.size(); } if (list instanceof Collection) { //判斷頁面邊界 judgePageBoudary(); } } /** * 斷定頁面邊界 */ private void judgePageBoudary() { isFirstPage = currentPage == 1; isLastPage = currentPage == pages; } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public long getTotal() { return total; } public void setTotal(long total) { this.total = total; } public int getPages() { return pages; } public void setPages(int pages) { this.pages = pages; } public List<T> getList() { return list; } public void setList(List<T> List) { this.list = List; } public boolean isIsFirstPage() { return isFirstPage; } public void setIsFirstPage(boolean isFirstPage) { this.isFirstPage = isFirstPage; } public boolean isIsLastPage() { return isLastPage; } public void setIsLastPage(boolean isLastPage) { this.isLastPage = isLastPage; } @Override public String toString() { final StringBuffer sb = new StringBuffer("PageEntity{"); sb.append("currentPage=").append(currentPage); sb.append(", pageSize=").append(pageSize); sb.append(", total=").append(total); sb.append(", pages=").append(pages); sb.append(", list=").append(list); sb.append(", isFirstPage=").append(isFirstPage); sb.append(", isLastPage=").append(isLastPage); sb.append(", navigatepageNums="); sb.append('}'); return sb.toString(); } }
Watch Out!構造函數PageEntiy(List<T> list) 這裏頭對pageHelper的Page進行了進一步的完善。看看pageHelper的Page類sql
public class Page<E> extends ArrayList<E> implements Closeable { private static final long serialVersionUID = 1L; private int pageNum; private int pageSize; private int startRow; private int endRow; private long total; private int pages; private boolean count; private Boolean reasonable; private Boolean pageSizeZero; private String countColumn; private String orderBy; private boolean orderByOnly; //多餘不貼了。。。 }
光說不練空把式,postman 工具測試一波看看。 我擦,什麼狀況,說好的不要這些page參數呢,爲何list裏頭仍是有?嗯哼,SpringBoot默認的消息格式轉換,也就是messgeConvert,很明顯,咱們使用了fastjson ,天然MessageConvert也要改形成用fastjson的。 springboot2.0中實現WebMvcConfiguer接口,而後覆蓋該方法json
/** * @author Lensen * @desc * @since 2018/8/25 21:45 */ @Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { //消息格式轉換 @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { //1.須要定義一個convert轉換消息的對象; FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter(); //2.添加fastJson的配置信息,好比:是否要格式化返回的json數據; FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteDateUseDateFormat); //3處理中文亂碼問題 List<MediaType> fastMediaTypes = new ArrayList<>(); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); //4.在convert中添加配置信息. fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes); fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig); //5.將convert添加到converters當中. converters.add(fastJsonHttpMessageConverter); } }
@EnableWebMvc別忘了,忘了就不會生效的(我一開始就**忘記了) 在測試,走起 完美~ 代碼裏我根本不用寫PageHelper.startPage(int pageNum, int pageSize)這句話,直接專一本身的邏輯。 省時省力,空出時間來多陪陪家人,陪陪女友 。bingo!數組
最後,以上示例代碼可在個人github.com中找到。 個人我的公衆號:developlee的瀟灑人生。 關注了也不必定更新,更新就不得了了。