为了提高用户的浏览体验,列表显示往往会进行分页显示,因此后端也需要编写分页查询接口。在网上查阅了一番分页相关的资料,发现了许多数据库分页查询的插件,但一般都有些许复杂,想了想直接自己手撸一个岂不妙哉,在此记录一下此次小小的尝试。
如上图所示,点击向左的箭头可向前翻页,点击数字可跳转至指定页面,点击向右箭头可向后翻页。
前端:使用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);
}
}
手撸看似简单,但容易出现隐藏bug,而且性能咋样有待商榷,欢迎评论交流指点。