目录
一.什么是PageHelper?
PageHelper,mybatis的一个插件,用于 mybatis 分页查询操作,以此来减轻我们对于分页查询的代码冗杂。
二.PageHelper的实战操作:
1.导入PageHelper的相关依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
2.配置代码展示:
首先我们列举 Controller 层的代码:
@RestController
@RequestMapping("/admin/employee")
@Slf4j
@Api(tags = "员工相关接口")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
/**
* 员工分页查询
* @param employeePageQueryDTO
* @return
*/
@GetMapping("/page")
@ApiOperation("员工分页查询")
public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO){
log.info("员工分页查询:{}",employeePageQueryDTO);
PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO);
return Result.success(pageResult);
}
}
其中 PageResult 类封装两种属性来返回给前端:(总记录数,当前页数据集合)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult implements Serializable {
private long total; //总记录数
private List records; //当前页数据集合
}
而我们的 Result 类封装一种格式来返回给前端:
@Data
public class Result<T> implements Serializable {
private Integer code; //编码:1成功,0和其它数字为失败
private String msg; //错误信息
private T data; //数据
public static <T> Result<T> success() {
Result<T> result = new Result<T>();
result.code = 1;
return result;
}
public static <T> Result<T> success(T object) {
Result<T> result = new Result<T>();
result.data = object;
result.code = 1;
return result;
}
public static <T> Result<T> error(String msg) {
Result result = new Result();
result.msg = msg;
result.code = 0;
return result;
}
}
3.分页查询代码解析:
随后,我们的分页查询在Service层逐渐体现:
分页查询分为两步:分页 , 查询
①PageHelper.startPage ( int 页码pageNum , int 每页记录数PageSize );
用来实现字符串的拼接 => select * from employee limit _,_ =>由插件动态计算生成 limit 后面的查询范围数,然后动态拼接成xml文件的代码。(分页)
eg:select * from employee limit 0,10 => 从第一条查,共查十条数据
②查询Page<查询类> page = ___Mapper.pageQuery(查询的DTO类);
这行代码是来写我们查询代码的条件。(查询)
③我们返回的page实际上在Page类内封装好能够拿到总记录数以及当前页数据集合,所以我们直接创建一个PageResult并有参构造返回就可以了。
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeMapper employeeMapper;
//分页查询 PageHelper
@Override
public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {
PageHelper.startPage(employeePageQueryDTO.getPage() ,employeePageQueryDTO.getPageSize());
Page<Employee> page = employeeMapper.pageQuery(employeePageQueryDTO);
return new PageResult(page.getTotal() , page.getResult());
}
}
随后我们就在mapper.java文件来编写代码:
@Mapper
public interface EmployeeMapper {
/**
* 员工分页查询
* @param employeePageQueryDTO
* @return
*/
Page<Employee> pageQuery(EmployeePageQueryDTO employeePageQueryDTO);
}
而因为需要动态拼接,所以我们要使用 mybatis 编写 xml 文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.EmployeeMapper">
<select id="pageQuery" resultType="com.sky.entity.Employee">
select * from employee
<where>
<if test = "name != null and name != ''">
and name like concat('%' , #{name} , '%') #concat来模糊查询名字
</if>
</where>
order by create_time desc #根据创建时间降序排序
</select>
</mapper>
因为我们使用PageHelper.startPage()方法,所以不需要拼接limit _,_ 。
而为了让我们的项目能够扫描到xml配置文件,我们就需要再application.yml文件去配置:
mybatis:
#mapper配置文件
mapper-locations: classpath:mapper/*.xml
另外,肯定读者会好奇为什么能够自动动态拼接?
实际上,在PageHelper插件的底层封装一个 setLocalPage() 方法,能够将我们的 page 类对象存到 ThreadLocal 存储空间,随后在进行分页查询就会自动在存储空间将页码以及每页记录数给取出并动态把 limit 关键字拼接进去,并将页码以及每页记录数来动态的计算出来,最后形成一个能进行分页查询的 xml 文件。
好了,今天的分享就到这里了,感谢收看,后序会继续分享Javaweb后端技术栈!!!