上一篇文章对Mybatis进行了集成,实现了对单表的查询,并且使用MockMvc对Controller代码进行了单元测试。这一篇文章重点说明对PageHelper分页的整合。
以前我记得通常要实现分页,需要两条SQL语句来实现。首先会查询出数据总数,然后计算出总页数,传递页码进行查询,不同的数据库进行分页查询的方式还不一样。
现在针对Mybatis分页,有两款插件,一个是通用Mapper,另一个是PageHelper,通过整合这两个插件,可以大大简化代码开发。
一、添加依赖
在pom.xml文件中添加分页相关的依赖
tk.mybatis
mapper-spring-boot-starter
2.0.4
com.github.pagehelper
pagehelper-spring-boot-starter
1.2.9
二、添加配置
# 通用Mapper start
# 主键自增回写方法,默认值MYSQL
mapper.identity=MYSQL
mapper.mappers=tk.mybatis.mapper.common.BaseMapper
# insert和update语句中,是否要判断字符串类型不等于空
mapper.not-empty=true
# 枚举按简单类型处理
mapper.enum-as-simple-type=true
# 通用Mapper end
# PageHelper start
pagehelper.helper-dialect=mysql
pagehelper.params=count=countSql
pagehelper.reasonable=false
pagehelper.support-methods-arguments=true
# PageHelper end
配置说明:
三、下面开始编写相关代码
编写自定义的Mapper接口类
创建com.aicode.bgms目录下创建common目录,然后创建PageMapper.java
package com.aicode.bgms.common;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
/**
* 自定义的PageMapper接口,启动类不能扫描到此接口
*
* @param
*/
public interface PageMapper extends Mapper, MySqlMapper {
}
下面的用到的查询条件类,我们在com.aicode.bgms.common目录中为分页定义一个基础查询类BaseQuery.java
package com.aicode.bgms.common;
public class BaseQuery {
private int pageNum;
private int pageSize;
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
}
在com.aicode.bgms.model.extra目录下,编写业务相关的查询类UserInfoExtraQuery.java使之继承上面的BaseQuery.java
package com.aicode.bgms.model.extra;
import com.aicode.bgms.common.BaseQuery;
import java.util.Date;
public class UserInfoExtraQuery extends BaseQuery{
private String userName;
private Date createStartTime;
private Date createEndTime;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getCreateStartTime() {
return createStartTime;
}
public void setCreateStartTime(Date createStartTime) {
this.createStartTime = createStartTime;
}
public Date getCreateEndTime() {
return createEndTime;
}
public void setCreateEndTime(Date createEndTime) {
this.createEndTime = createEndTime;
}
}
修改接口UserInfoExtraMapper.java接口类,使之继承上面的PageMapper接口,并且添加分页方法。
package com.aicode.bgms.mapper.extra;
import com.aicode.bgms.model.UserInfo;
import com.aicode.bgms.model.extra.UserInfoExtraQuery;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface UserInfoExtraMapper {
UserInfo findUserInfoByUserName(@Param("userName") String userName);
List findUserInfoByPage(UserInfoExtraQuery query);
}
我们这里的方法是比较复杂的类型,可传入多种查询条件。
在UserInfoExtraMapper.xml文件中添加对应的sql映射
在UserInfoService.java接口中添加分页查询的业务方法,如下:
PageInfo queryUserInfoByPage(UserInfoExtraQuery userInfoExtraQuery);
在UserInfoServiceImpl.java实现类中实现上面的方法:
@Override
public PageInfo queryUserInfoByPage(UserInfoExtraQuery userInfoExtraQuery) {
PageHelper.startPage(userInfoExtraQuery.getPageNum(),userInfoExtraQuery.getPageSize());
List userInfoList = userInfoExtraMapper.findUserInfoByPage(userInfoExtraQuery);
PageInfo pageInfo = new PageInfo<>(userInfoList);
return pageInfo;
}
如果是单表没有查询条件的情况下,在Mapper层可以不编写任何代码;直接在Service层编写如下代码即可。
public PageInfo queryPage(int pageNum, int pageSize){
PageHelper.startPage(pageNum,pageSize);
List userInfoList = userInfoExtraMapper.selectAll();
PageInfo pageInfo = new PageInfo<>(userInfoList);
return pageInfo;
}
下面接着编写controller层,在UserInfoController.java中添加如下方法:
@GetMapping("/pageQuery/{pageNum}/{pageSize}")
public PageInfo pageQuery(@PathVariable("pageNum") Integer pageNum,
@PathVariable("pageSize") Integer pageSize,
UserInfoExtraQuery userInfoExtraQuery){
if (pageNum <= 0) {
//页码不合法
}
if (pageSize > 100 || pageSize <= 0) {
//每页数据数不合法
}
userInfoExtraQuery.setPageNum(pageNum);
userInfoExtraQuery.setPageSize(pageSize);
return userInfoService.queryUserInfoByPage(userInfoExtraQuery);
}
至此,我们的代码基本写完了。
上面代码中有一个PageInfo的类,这里用到的泛型方式PageInfo
如果是多张表联合查询,或者返回的结果字段与原生的实体类不对应,可以自定义一个Pojo类用于结果集。
四、使用MockMvc进行测试
在UserInfoControllerTest.java文件中添加如下的测试方法:
@Test
public void queryByPage() throws Exception {
String mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/pageQuery/1/10"))
.andReturn().getResponse().getContentAsString();
System.out.println("Result === " + mvcResult);
}
使用Postman进行测试
可以看到进行了分页,当前查询的是第1页,每页3条数据,共1页。