🎒1.逻辑分页(假分页)
逻辑分页:逻辑分页依赖于代码。(例:Mybatis自带的分页插件就是逻辑分页)
同时逻辑分页是先查询出所有的数据,再根据代码块的所需(例:你需要拿到第几页,每页几条的数据)筛选出合适的数据进行分页。
通过SQL将所有数据全部查询出来,然后根据游标进行筛选,只是显示出来部分而已。
好处是所有数据库都统一,坏处就是效率低。
📚2.物理分页(真分页)
物理分页:物理分页依赖于数据库。(更侧重于sql语句)
例:MySQL数据库提供的分页关键字"limit",程序员只需要编写带有关键字的SQL语句,数据库返回的数据就是分页结果。
物理分页就是数据库本身提供了分页方式,如MySQL的limit,oracle的rownum 。
好处是效率高,不好的地方就是不同数据库有不同的搞法。
🏃3.两者对比
概念简单点讲:
逻辑分页就是半自动化的一个分页步骤(因为需要传递相关参数,所以是半自动化的);
物理分页就是手写SQL语句实现的分页。
1.数据库方面
物理分页是手写SQL语句,故每一次分页都需要访问数据库;逻辑分页是将全部数据查询出来后再进行的分页,只需访问一次数据库。所以说,物理分页对于数据库造成的负担大。
2.服务器方面
逻辑分页一次性将所有的数据读取至内存中,占用了较大的内存空间;物理分页每次只读取所需的数据,占用内存比较小。
3.实时性
逻辑分页一次性将数据全部查询出来,如果数据库中的数据发生了改变,逻辑分页就不能够获取最新数据(不能自动更新数据),可能导致脏数据的出现,实时性较低
物理分页每一次分页都需要从数据库中进行查询,这样能够获取数据库中数据的最新状态,实时性较高。
👯4.逻辑分页代码实现;
导入pom的依赖;
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter --> <dependency><!--导入分页插件--> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.3</version> </dependency> 注意版本依赖不然会使循环 报错
核心代码
核心代码展示说明:
//开启分页 ,pageNum 页数 pageSize 每页几条数据 切记查询全部的方法是和 PageHelper.startPage(pageNum,pageSize); 必须在一起否者会导致报错;返回对象的话可以使用 return pageInfo.getList(); PageHelper.startPage(pageNum,pageSize); List<Student> students = studentmapper.queryAllByPage(); PageInfo<Student> pageInfo = new PageInfo<>(students); return pageInfo;
完整demo:
引入pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.7</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.huyangfeng</groupId> <artifactId>springboot-student-crud</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-student-crud</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!--JDBC--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>--> <!--thymeleaf--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--mybatis整合springboot--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.1</version> </dependency> <!--<dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity5</artifactId> </dependency>--> <!--mysql连接驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--lombok:偷懒神器--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter --> <dependency><!--导入分页插件--> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
实体类
Dao接口
数据库 mapper.xml
查询全部的代码
核心代码:
ServiceImpl
package com.xc.service.serviceImpl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.xc.mapper.Studentmapper; import com.xc.pojo.Student; import com.xc.service.StudentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class StudentServiceImpl implements StudentService { @Autowired private Studentmapper studentmapper; @Override public PageInfo<Student> queryAllByPage(Integer pageNum, Integer pageSize) { //开启分页 PageHelper.startPage(pageNum,pageSize); List<Student> students = studentmapper.queryAllByPage(); PageInfo<Student> pageInfo = new PageInfo<>(students); return pageInfo; } }
控制台Controller
package com.xc.controller; import com.github.pagehelper.PageInfo; import com.xc.pojo.Student; import com.xc.service.StudentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class StudentController { @Autowired private StudentService studentService; @RequestMapping("/list") public String queryAllByPage(@RequestParam(value = "pageNum",required = false,defaultValue = "1")Integer pageNum, @RequestParam(value = "pageSize",required = false,defaultValue = "5")Integer pageSize, Model model){ PageInfo<Student> studentPageInfo = studentService.queryAllByPage(pageNum, pageSize); model.addAttribute("studentPageInfo",studentPageInfo); return "list"; } }
👯4.1逻辑分页代码实现(第二种自定义分页);
controller 控制台
/** * * @param * @param * @return * 查询table全部页面 */ //指定k,v 和默认值(defaultValue ) @RequestMapping("/selectAllDb") @ResponseBody public MsgContext selectallDb(@RequestParam(value = "pageNum",name = "pageNum" ,required = false,defaultValue = "1")Integer pageNum, @RequestParam(value = "pageSize",name = "pageSize",required = false,defaultValue = "9")Integer pageSize ) { MsgContext mc = new MsgContext(); MyPageInfo<BizDsJdbc> bizDsJdbcVOS = dsService.selectallDb(pageNum,pageSize); mc.addResult("data", bizDsJdbcVOS); return mc; }
接口server
/** * 查询展示字段 * @return */ MyPageInfo<BizDsJdbc> selectallDb(Integer pageNum,Integer pageSize);
实现 impl
/** *查看展示信息 * @return */ @Override public MyPageInfo<BizDsJdbc> selectallDb(Integer pageNum,Integer pageSize) { //自己的查询全部的代码 List<BizDsJdbc> bizDsJdbc1 = dsJdbcMapper.selectallDb(); MyPageInfo<BizDsJdbc> myPageInfo = new MyPageInfo<>(bizDsJdbc1, pageNum, pageSize); return myPageInfo; }