SpringBoot项目04之实现分页功能

SpringBoot项目04之实现分页功能,第1张

1.准备工作

为了演示分页效果,首先需要导入大量数据才能体现分页功能的作用;所以,第一步需要导入数据,实验所需的SQL脚本内容较多,这里就不一一展示,其导入后效果如下图。

sql脚本下载地址为:sql下载地址

2.实现分页功能

分页功能的交互流程是前端将所需页码page和每页展示条数limit两个参数传输给后端,而后端在接受到分页请求后会对分页参数进行处理并计算出需要查询的是从第几条数据到第几条数据,然后利用MySQL的limit关键字去查询对应的记录并返回给前端。

2.1 新建实体类和Mapper接口

在entity包下创建AdminUser,java。在Dao包下创建AdminUserDao.java。
AdminUser.java

@Data
public class AdminUser implements Serializable {
    private Long id;
    private String userName;
    private String password;
    private String userToken;
    private int isDeleted;

    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date createTime;
}

AdminUserDao.java

@Mapper
public interface AdminUserDao {

    // 查询用户列表
    List<AdminUser> findAdminUsers(Map param);

    // 查询用户总数
    int getTotalAdminUser(Map param);
}
2.2 创建Mapper接口的映射文件

在resources/mapper目录下新建Mapper接口的映射文件AdminUserDao.xml,之后进行映射文件的编写。
AdminUserDao.xml


DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.pikacho.springbootbbs.dao.AdminUserDao">
    <resultMap type="com.pikacho.springbootbbs.entity.AdminUser" id="AdminUserResult">
        <id property="id" column="id" jdbcType="BIGINT"/>
        <result property="userName" column="user_name" jdbcType="VARCHAR"/>
        <result property="password" column="password_md5" jdbcType="VARCHAR"/>
        <result property="userToken" column="user_token" jdbcType="VARCHAR"/>
        <result property="isDeleted" column="is_deleted" jdbcType="TINYINT"/>
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
    resultMap>

    
    <select id="findAdminUsers" parameterType="Map" resultMap="AdminUserResult">
        select id, user_name, create_time from tb_admin_user
        where is_deleted = 0
        order by id desc
        <if test="start != null and limit != null">
            limit #{start}, #{limit}
        if>
    select>

    
    <select id="getTotalAdminUser" parameterType="Map" resultType="int">
        select count(*) from tb_admin_user
        where is_delete = 0
    select> 
mapper>
2.3 创建分页工具类

分页结果需要使用一个对象返回给前端,所以这里需要一个包装类对结果进行包装。新建一个utils包,然后在该包下新建PageResult.java。
PageResult.java

@Data
public class PageResult implements Serializable {
    // 总记录数
    private int totalCount;
    // 每页记录数
    private int pageSize;
    // 总页数
    private int totalPage;
    // 当前页数
    private int currPage;
    // 列表数据
    private List<?> list;
    // 分页结果
    public PageResult(List<?> list, int totalCount, int pageSize, int currPage){
        this.list = list;
        this.totalCount = totalCount;
        this.pageSize = pageSize;
        this.currPage = currPage;
        this.totalPage = (int)Math.ceil((double)totalCount/pageSize);
    }
}

同样,前端传过来的数据与后端中书写sql语句需要的数据不一致,所以需要一个包装类进行包装,在utils包下新建PageUtil.java。
PageUtil.java

@Data
public class PageUtil extends LinkedHashMap<String, Object> {
    // 当前页码
    private int page;
    // 每页条数
    private int limit;

    public PageUtil(Map<String, Object> params){
        this.putAll(params);

        // 分页参数
        this.page = Integer.parseInt(params.get("page").toString());
        this.limit = Integer.parseInt(params.get("limit").toString());

        this.put("start", (page -1) * limit);
        this.put("page", page);
        this.put("limit", limit);
    }
}
2.4 创建Service接口及其实现类

创建service包并在该包下创建AdminUserService.java以及实现类。

public interface AdminUserService {
    // 分页功能
    PageResult getAdminUserPage(PageUtil pageUtil);
}

@Service("adminUserService")
public class AdminUserServiceImpl implements AdminUserService {
    @Autowired
    private AdminUserDao adminUserDao;

    @Override
    public PageResult getAdminUserPage(PageUtil pageUtil){
        List<AdminUser> users = adminUserDao.findAdminUsers(pageUtil);
        int total = adminUserDao.getTotalAdminUser(pageUtil);
        PageResult pageResult = new PageResult(users, total, pageUtil.getLimit(), pageUtil.getPage());
        return pageResult;
    }
}
2.5 创建控制器

AdminUserControler.java

@RestController
@RequestMapping("/fenye")
public class AdminUserController {

    @Autowired
    private AdminUserService adminUserService;

    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public PageResult list(@RequestParam Map<String, Object> params) {
        if (StringUtils.isEmpty(params.get("page")) || StringUtils.isEmpty(params.get("limit"))) {
            return null;
        }
        //查询列表数据
        PageUtil pageUtil = new PageUtil(params);
        return adminUserService.getAdminUserPage(pageUtil);
    }

}
2.6 测试分页效果

http://localhost:8080/bbs/fenye/list?page=1&limit=10

http://localhost:8080/bbs/fenye/list?page=3&limit=10

可以看到,基本完成了分页功能;实际上,可以使用插件完成该功能,并不需要自己来实现这个功能。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/905312.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-15
下一篇 2022-05-15

发表评论

登录后才能评论

评论列表(0条)

保存