本文將介紹如何實現分頁查詢功能,推薦使用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<T> 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)這句話,直接專注自己的邏輯。 省時省力,空出時間來多陪陪家人,陪陪女朋友 。bingo!
最後,以上示例代碼可在我的github.com中找到。 我的個人公衆號:developlee的瀟灑人生。 關注了也不一定更新,更新就不得了了。