本文將介紹如何實現分頁查詢功能,推薦使用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配置
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開始,開干!隨便寫個簡單點的
@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實體做了什么。
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參數.
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) 來搞定。
講到這,似乎沒什么神奇之處,呃呃呃,是的,這些都是為了傳參數。看看PageEntity ,這才是今天的主角兒~~~
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 list) 這里頭對pageHelper的Page進行了進一步的完善。看看pageHelper的Page類
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接口,然后覆蓋該方法
/** * @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)這句話,直接專注自己的邏輯。