手撸一个分页查询接口

引言

  为了提高用户的浏览体验,列表显示往往会进行分页显示,因此后端也需要编写分页查询接口。在网上查阅了一番分页相关的资料,发现了许多数据库分页查询的插件,但一般都有些许复杂,想了想直接自己手撸一个岂不妙哉,在此记录一下此次小小的尝试。

需求分析

手撸一个分页查询接口_第1张图片

​ 如上图所示,点击向左的箭头可向前翻页,点击数字可跳转至指定页面,点击向右箭头可向后翻页。

实现思路

前端:使用element ui里的 pagination组件,简单进行封装一下就可使用

pagination组件链接:https://element.eleme.cn/#/zh-CN/component/pagination

代码如下:



阅读代码我们不难发现,前后端所需要交互的参数为total(数据总数),page(当前页面),page-size(每页包含数据条数)可根据需求自行决定是否进行交互。

后端:通过select * from 表名 limit start,end 来进行分页查询,因此只需要count(*)来计算数据总数,通过page和page-size来计算起始数据和结束数据

代码实现

application.propertie里配置数据库

#配置启动端口
server.port=9000

#==============================数据库相关配置========================================
spring.datasource.driver-class-name =com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/wx_user?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username =root
spring.datasource.password =123456

#使用阿里巴巴druid数据源,默认使用自带的
#spring.datasource.type =com.alibaba.druid.pool.DruidDataSource
#开启控制台打印sql
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

# mybatis 下划线转驼峰配置,两者都可以
#mybatis.configuration.mapUnderscoreToCamelCase=true
mybatis.configuration.map-underscore-to-camel-case=true

封装两个实体类,一个与数据表相对应,一个封装成利于交互的数据类。

//User.java
package com.example.test.domain;

/**
 * @Author: ck
 * @Description:
 * @Date: Create in 20:23 2020/7/25
 */
public class User {
     
    private Integer id;
    private String name;
    private String pwd;

    public Integer getId() {
     
        return id;
    }

    public void setId(Integer id) {
     
        this.id = id;
    }

    public String getName() {
     
        return name;
    }

    public void setName(String name) {
     
        this.name = name;
    }

    public String getPwd() {
     
        return pwd;
    }

    public void setPwd(String pwd) {
     
        this.pwd = pwd;
    }
}
//UserResponse.java
package com.example.test.domain.responese;

import com.example.test.domain.User;

import java.util.List;

/**
 * @Author: ck
 * @Description:
 * @Date: Create in 16:27 2020/9/4
 */
public class UserResponse {
     
    private List<User> pageUser;
    private int count;

    public List<User> getPageUser() {
     
        return pageUser;
    }

    public void setPageUser(List<User> pageUser) {
     
        this.pageUser = pageUser;
    }

    public int getCount() {
     
        return count;
    }

    public void setCount(int count) {
     
        this.count = count;
    }
}

编写数据持久层

 //UserMapper.java
 @Select("select * from user limit #{start},#{end}")
 List<User> selectByPage(@Param("start") int start,@Param("end") int end);

 @Select("select count(*) from user")
 int CountUser();

编写业务逻辑层

//UserService.java
package com.example.test.service;

import com.example.test.domain.User;

import java.util.List;

/**
 * @Author: ck
 * @Description:
 * @Date: Create in 20:28 2020/7/25
 */
public interface UserService {
     
    List<User>  findByPage(int start,int end);

    int CountUser();
}

//UserServiceImpl.java
package com.example.test.service.impl;

import com.example.test.domain.User;
import com.example.test.mapper.UserMapper;
import com.example.test.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Author: ck
 * @Description:
 * @Date: Create in 20:28 2020/7/25
 */
@Service
public class UserServiceImpl implements UserService {
     

    @Autowired
    private UserMapper userMapper;
    @Override
    public List<User> findByPage(int start, int end) {
     
        return userMapper.selectByPage(start,end);
    }

    @Override
    public int CountUser() {
     
        return  userMapper.CountUser();
    }
}

编写Controller层

//UserController.java
package com.example.test.controller;

import com.example.test.domain.User;
import com.example.test.domain.responese.UserResponse;
import com.example.test.service.UserService;
import com.example.test.utils.JsonData;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: ck
 * @Description:
 * @Date: Create in 20:18 2020/7/25
 */
@RequestMapping("/user")
@RestController
public class UserController {
     
    @Autowired
    private UserService userService;

    @RequestMapping("selectByPage")
    public JsonData SelectPage(@Param("page") Integer page)
    {
     
        //计算共有多少条数据
        int count = userService.CountUser();
        UserResponse userResponse = new UserResponse();
        userResponse.setCount(count);
        int start = (page-1)*20;//起始
        int end = page*20>userService.CountUser()?count:page*20;//结束
        userResponse.setPageUser(userService.findByPage(start,end));
        return JsonData.buildSuccess(userResponse);

    }
}

测试

手撸一个分页查询接口_第2张图片

结语
手撸看似简单,但容易出现隐藏bug,而且性能咋样有待商榷,欢迎评论交流指点。

你可能感兴趣的:(Springboot,spring,boot,mybatis,mysql)