【MyBatis笔记】 - 4 - 缓存 + 逆向工程 + 分页插件 - 指南

【MyBatis笔记】 - 4 - 缓存 + 逆向工程 + 分页插件

一、MyBatis的缓存

1、MyBatis的一级缓存

  • 一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问

  • 使一级缓存失效的四种情况:

    1. 不同的SqlSession对应不同的一级缓存
    2. 同一个SqlSession但是查询条件不同
    3. 同一个SqlSession两次查询期间执行了任何一次增删改操作
    4. 同一个SqlSession两次查询期间手动清空了缓存
    1.不同的SqlSession对应不同的一级缓存
    @Test
    public void testOneCache1() throws IOException {
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    CacheMapper mapper = sqlSession.getMapper(CacheMapper.class);
    Emp emp1 = mapper.getEmpById(3);
    System.out.println(emp1);
    System.out.println("========第二次调用========从缓存中取数据");
    Emp emp2 = mapper.getEmpById(3);
    System.out.println(emp2);
    System.out.println("\n========即使用的不是同一个Mapper,也同样从缓存中取(同一个sqlsession)========");
    CacheMapper mapper2 = sqlSession.getMapper(CacheMapper.class);
    Emp empByMapper2 = mapper2.getEmpById(3);
    System.out.println(empByMapper2);
    System.out.println("\n========一级缓存的范围在sqlsession中,换一个新的sqlsession就会再次用sql读取数据========");
    SqlSession sqlSession2 = SqlSessionUtils.getSqlSession();
    CacheMapper mapper2BySqlSession2 = sqlSession2.getMapper(CacheMapper.class);
    System.out.println(mapper2BySqlSession2.getEmpById(3));
    }

    在这里插入图片描述

    2.同一个SqlSession但是查询条件不同
    @Test
    public void testCache3(){
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    CacheMapper mapper = sqlSession.getMapper(CacheMapper.class);
    System.out.println("=====第一次获取数据=====");
    Emp emp1 = mapper.getEmpById(3);
    System.out.println(emp1);
    System.out.println("\n=====查询条件不同=====");
    Emp emp2 = mapper.getEmpById(5);
    System.out.println(emp2);
    }

    在这里插入图片描述

    3.同一个SqlSession两次查询期间执行了任何一次增删改操作
    @Test
    public void testCache2(){
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    CacheMapper mapper = sqlSession.getMapper(CacheMapper.class);
    System.out.println("=====第一次获取数据=====");
    Emp emp1 = mapper.getEmpById(3);
    System.out.println(emp1);
    Emp emp2 = mapper.getEmpById(3);
    System.out.println(emp2);
    System.out.println("\n=====进行增删改操作=====");
    mapper.insetEmp(new Emp(null, "Joey", 44, "男", "8888@gmai.com"));
    System.out.println("\n=====同一个sqlsession,再获取数据=====");
    Emp emp3 = mapper.getEmpById(3);
    System.out.println(emp3);
    }

    在这里插入图片描述

    4.同一个SqlSession两次查询期间手动清空了缓存
    @Test
    public void testCache4() throws IOException {
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    CacheMapper mapper = sqlSession.getMapper(CacheMapper.class);
    System.out.println("=====第一次获取数据=====");
    Emp emp1 = mapper.getEmpById(3);
    System.out.println(emp1);
    System.out.println("\n=====两次查询期间手动清空缓存=====");
    sqlSession.clearCache();
    System.out.println("\n=====再次查询id=3的emp=====");
    Emp emp2 = mapper.getEmpById(3);
    System.out.println(emp2);
    }

在这里插入图片描述

2、MyBatis的二级缓存

  • 二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取

  • 二级缓存开启的条件

    1. 在核心配置文件中,设置全局配置属性cacheEnabled=“true”,默认为true,不需要设置
    2. 在映射文件中设置标签
    3. 二级缓存必须在SqlSession关闭或提交之后有效
    4. 查询的数据所转换的实体类类型必须实现序列化的接口
  • 使二级缓存失效的情况:两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效

    没有提交sqlsession时,数据会保存在一级缓存中,提交后,会保存在二级缓存中。

    1.在映射文件中设置标签<cache />
    <?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.zzz.mapper.CacheMapper">
        <cache/>
          <select id="getEmpById" resultType="Emp">
          select * from t_emp where eid = #{eid}
        </select>
          <insert id="insertEmp" useGeneratedKeys="true" keyProperty="eid">
          insert into t_emp(emp_name, age, sex, email)
          values(#{empName},#{age},#{sex},#{email})
        </insert>
      </mapper>

    在这里插入图片描述

    2.要把Emp类加上implements Serializable
    public class Emp  implements Serializable {
    ......
    }
@Test
public void testTwoCache() throws IOException {
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession1 = sqlSessionFactory.openSession(true);
CacheMapper mapper1 = sqlSession1.getMapper(CacheMapper.class);
System.out.println(mapper1.getEmpById(1));
System.out.println("Cache Hit Ratio:缓存命中率,指的是在缓存中有没有这条数据");
System.out.println("=====二级缓存未打开,没从缓存中获取数据=====");
SqlSession sqlSession2 = sqlSessionFactory.openSession(true);
CacheMapper mapper2 = sqlSession2.getMapper(CacheMapper.class);
System.out.println(mapper2.getEmpById(1));
} catch (IOException e) {
e.printStackTrace();
}
}

在这里插入图片描述

@Test
public void testTwoCache() throws IOException {
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession1 = sqlSessionFactory.openSession(true);
CacheMapper mapper1 = sqlSession1.getMapper(CacheMapper.class);
System.out.println(mapper1.getEmpById(1));
System.out.println("==========sqlSession1关闭后==========");
sqlSession1.close();
System.out.println("再次查看命中率:");
SqlSession sqlSession2 = sqlSessionFactory.openSession(true);
CacheMapper mapper2 = sqlSession2.getMapper(CacheMapper.class);
System.out.println(mapper2.getEmpById(1));
sqlSession2.close();
} catch (IOException e) {
e.printStackTrace();
}
}

在这里插入图片描述

3、二级缓存的相关配置

在mapper配置文件中添加的cache标签可以设置一些属性

(1) eviction属性:缓存回收策略

  • LRU(Least Recently Used) – 最近最少使用的:移除最长时间不被使用的对象。

  • FIFO(First in First out) – 先进先出:按对象进入缓存的顺序来移除它们。

  • SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。

  • WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

  • 默认的是 LRU

(2) flushInterval属性:刷新间隔,单位毫秒

默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句(增删改)时刷新

(3) size属性:引用数目,正整数

代表缓存最多可以存储多少个对象,太大容易导致内存溢出

(4) readOnly属性:只读,true/false

  • true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。
  • false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false

4、MyBatis缓存查询的顺序

  • 先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用
  • 如果二级缓存没有命中,再查询一级缓存
  • 如果一级缓存也没有命中,则查询数据库
  • SqlSession关闭之后,一级缓存中的数据会写入二级缓存

5、整合第三方缓存EHCache

只能代替二级缓存

1.添加依赖
<!-- Mybatis EHCache整合包 -->
  <dependency>
  <groupId>org.mybatis.caches</groupId>
  <artifactId>mybatis-ehcache</artifactId>
  <version>1.2.1</version>
  </dependency>
  <!-- slf4j日志门面的一个具体实现 -->
    <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
    </dependency>
2.各个jar包的功能
jar包名称作用
mybatis-ehcacheMybatis和EHCache的整合包
ehcacheEHCache核心包
slf4j-apiSLF4J日志门面包
logback-classic支持SLF4J门面接口的一个具体实现
3.创建EHCache的配置文件ehcache.xml
  • 名字必须叫ehcache.xml
<?xml version="1.0" encoding="utf-8" ?>
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
  <!-- 磁盘保存路径 -->
    <diskStore path="D:\atguigu\ehcache"/>
    <defaultCache
      maxElementsInMemory="1000"
      maxElementsOnDisk="10000000"
      eternal="false"
      overflowToDisk="true"
      timeToIdleSeconds="120"
      timeToLiveSeconds="120"
      diskExpiryThreadIntervalSeconds="120"
      memoryStoreEvictionPolicy="LRU">
  </defaultCache>
</ehcache>

"../config/ehcache.xsd”报错,则创建这个文件

4.设置二级缓存的类型
  • 在xxxMapper.xml文件中设置二级缓存类型
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
5.加入logback日志
  • 存在SLF4J时,作为简易日志的log4j将失效,此时我们需要借助SLF4J的具体实现logback来打印日志。创建logback的配置文件logback.xml,名字固定,不可改变
<?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="true">
    <!-- 指定日志输出的位置 -->
        <appender name="STDOUT"
        class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
        <!-- 日志输出的格式 -->
          <!-- 按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主体内容、换行 -->
          <pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
          </encoder>
        </appender>
        <!-- 设置全局日志级别。日志级别按顺序分别是:DEBUG、INFO、WARN、ERROR -->
          <!-- 指定任何一个日志级别都只打印当前级别和后面级别的日志。 -->
              <root level="DEBUG">
              <!-- 指定打印日志的appender,这里通过“STDOUT”引用了前面配置的appender -->
                <appender-ref ref="STDOUT" />
              </root>
              <!-- 根据特殊需求指定局部日志级别 -->
                <logger name="com.atguigu.crowd.mapper" level="DEBUG"/>
              </configuration>
6.EHCache配置文件说明
属性名是否必须作用
maxElementsInMemory在内存中缓存的element的最大数目
maxElementsOnDisk在磁盘上缓存的element的最大数目,若是0表示无穷大
eternal设定缓存的elements是否永远不过期。 如果为true,则缓存的数据始终有效, 如果为false那么还要根据timeToIdleSeconds、timeToLiveSeconds判断
overflowToDisk设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
timeToIdleSeconds当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时, 这些数据便会删除,默认值是0,也就是可闲置时间无穷大
timeToLiveSeconds缓存element的有效生命期,默认是0.,也就是element存活时间无穷大
diskSpoolBufferSizeMBDiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
diskPersistent在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false
diskExpiryThreadIntervalSeconds磁盘缓存的清理线程运行间隔,默认是120秒。每个120s, 相应的线程会进行一次EhCache中数据的清理工作
memoryStoreEvictionPolicy当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。 默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出

二、MyBatis的逆向工程

  • 正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的
  • 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源:
  • Java实体类
    • Mapper接口
    • Mapper映射文件

1、创建逆向工程的步骤

1.添加依赖和插件
<dependencies>
  <!-- MyBatis核心依赖包 -->
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.9</version>
    </dependency>
    <!-- junit测试 -->
      <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
      </dependency>
      <!-- MySQL驱动 -->
        <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.27</version>
        </dependency>
        <!-- log4j日志 -->
          <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.17</version>
          </dependency>
        </dependencies>
        <!-- 控制Maven在构建过程中相关配置 -->
          <build>
            <!-- 构建过程中用到的插件 -->
              <plugins>
                <!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 -->
                  <plugin>
                  <groupId>org.mybatis.generator</groupId>
                  <artifactId>mybatis-generator-maven-plugin</artifactId>
                  <version>1.3.0</version>
                    <!-- 插件的依赖 -->
                      <dependencies>
                        <!-- 逆向工程的核心依赖 -->
                          <dependency>
                          <groupId>org.mybatis.generator</groupId>
                          <artifactId>mybatis-generator-core</artifactId>
                          <version>1.3.2</version>
                          </dependency>
                          <!-- 数据库连接池 -->
                            <dependency>
                            <groupId>com.mchange</groupId>
                            <artifactId>c3p0</artifactId>
                            <version>0.9.2</version>
                            </dependency>
                            <!-- MySQL驱动 -->
                              <dependency>
                              <groupId>mysql</groupId>
                              <artifactId>mysql-connector-java</artifactId>
                              <version>8.0.27</version>
                              </dependency>
                            </dependencies>
                          </plugin>
                        </plugins>
                      </build>
2.创建MyBatis的核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
  <!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
  <configuration>
    <properties resource="jdbc.properties"/>
    <typeAliases>
      <package name=""/>
    </typeAliases>
      <environments default="development">
        <environment id="development">
        <transactionManager type="JDBC"/>
          <dataSource type="POOLED">
          <property name="driver" value="${jdbc.driver}"/>
          <property name="url" value="${jdbc.url}"/>
          <property name="username" value="${jdbc.username}"/>
          <property name="password" value="${jdbc.password}"/>
        </dataSource>
      </environment>
    </environments>
    <mappers>
      <package name=""/>
    </mappers>
  </configuration>
3.创建逆向工程的配置文件
  • 文件名必须是:generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
  <generatorConfiguration>
    <!--
    targetRuntime: 执行生成的逆向工程的版本
    MyBatis3Simple: 生成基本的CRUD(清新简洁版)
    MyBatis3: 生成带条件的CRUD(奢华尊享版)
    -->
      <context id="DB2Tables" targetRuntime="MyBatis3Simple">
      <!-- 数据库的连接信息 -->
          <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
          connectionURL="jdbc:mysql://localhost:3306/mybatis"
          userId="root"
          password="123456">
      </jdbcConnection>
      <!-- javaBean的生成策略-->
          <javaModelGenerator targetPackage="com.atguigu.mybatis.pojo" targetProject=".\src\main\java">
          <property name="enableSubPackages" value="true" />
          <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- SQL映射文件的生成策略 -->
            <sqlMapGenerator targetPackage="com.atguigu.mybatis.mapper"
            targetProject=".\src\main\resources">
          <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!-- Mapper接口的生成策略 -->
            <javaClientGenerator type="XMLMAPPER"
            targetPackage="com.atguigu.mybatis.mapper" targetProject=".\src\main\java">
          <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!-- 逆向分析的表 -->
          <!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName -->
            <!-- domainObjectName属性指定生成出来的实体类的类名 -->
              <table tableName="t_emp" domainObjectName="Emp"/>
              <table tableName="t_dept" domainObjectName="Dept"/>
            </context>
          </generatorConfiguration>
4.执行MBG插件的generate目标

在这里插入图片描述

如果出现报错:Exception getting JDBC Driver,可能是pom.xml中,数据库驱动配置错误

dependency中的驱动

在这里插入图片描述

mybatis-generator-maven-plugin插件中的驱动

在这里插入图片描述

两者的驱动版本应该相同

执行结果
在这里插入图片描述

2、QBC

1.查询
  • selectByExample:按条件查询,需要传入一个example对象或者null;如果传入一个null,则表示没有条件,也就是查询所有数据
  • example.createCriteria().xxx:创建条件对象,通过andXXX方法为SQL添加查询添加,每个条件之间是and关系
  • example.or().xxx:将之前添加的条件通过or拼接其他条件
    在这里插入图片描述
@Test public void testMBG() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
EmpExample example = new EmpExample();
//名字为张三,且年龄大于等于20
example.createCriteria().andEmpNameEqualTo("张三").andAgeGreaterThanOrEqualTo(20);
//或者did不为空
example.or().andDidIsNotNull();
List<Emp> emps = mapper.selectByExample(example);
  emps.forEach(System.out::println);
  }

在这里插入图片描述

2.增改
  • updateByPrimaryKey:通过主键进行数据修改,如果某一个值为null,也会将对应的字段改为null

  • mapper.updateByPrimaryKey(new Emp(1,"admin",22,null,"456@qq.com",3));

    • 在这里插入图片描述
  • updateByPrimaryKeySelective():通过主键进行选择性数据修改,如果某个值为null,则不修改这个字段

  • mapper.updateByPrimaryKeySelective(new Emp(2,"admin2",22,null,"456@qq.com",3));

    • 在这里插入图片描述

三、分页插件

分页原理

limit index,pagesize

index 当前页的起始索引

pageSize 每页显示的条数

pageNum 当前页的页码

当前页的起始索引 = (当前页码 - 1) * 每页条数

index = (pageNum - 1) * pageSize

通过索引获得数据 索引从0开始

比如 pageSize = 5

第一页 0 - 4

第二页 5 - 9

第三页 10 - 14

1、分页插件使用步骤

1.添加依赖
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
  <dependency>
  <groupId>com.github.pagehelper</groupId>
  <artifactId>pagehelper</artifactId>
  <version>5.2.0</version>
  </dependency>
2.配置分页插件

在MyBatis的核心配置文件(mybatis-config.xml)中配置插件

<plugins>
  <!--设置分页插件-->
  <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
  </plugins>

在这里插入图片描述

2、分页插件的使用

1.开启分页功能
  • 在查询功能之前使用PageHelper.startPage(int pageNum, int pageSize)开启分页功能
  • pageNum:当前页的页码
    • pageSize:每页显示的条数
@Test
public void testPageHelper() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
//访问第一页,每页四条数据
PageHelper.startPage(1,4);
List<Emp> emps = mapper.selectByExample(null);
  emps.forEach(System.out::println);
  }

在这里插入图片描述

2.分页相关数据
方法一:直接输出

在查询功能之前使用PageHelper.startPage(int pageNum, int pageSize)开启分页功能

  • pageNum:当前页的页码
  • pageSize:每页显示的条数
@Test
public void testPageHelper() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
//访问第一页,每页四条数据
Page<Object> page = PageHelper.startPage(1, 4);
  List<Emp> emps = mapper.selectByExample(null);
    //在查询到List集合后,打印分页数据
    System.out.println(page);
    }
  • 分页相关数据:

    Page{count=true, pageNum=1, pageSize=4, startRow=0, endRow=4, total=8, pages=2, reasonable=false, pageSizeZero=false}[Emp{eid=1, empName='admin', age=22, sex='男', email='456@qq.com', did=3}, Emp{eid=2, empName='admin2', age=22, sex='男', email='456@qq.com', did=3}, Emp{eid=3, empName='王五', age=12, sex='女', email='123@qq.com', did=3}, Emp{eid=4, empName='赵六', age=32, sex='男', email='123@qq.com', did=1}]
方法二使用PageInfo
  • 在查询获取list集合之后,使用PageInfo<T> pageInfo = new PageInfo<>(List<T> list, intnavigatePages)获取分页相关数据
  • list:分页之后的数据
  • navigatePages:导航分页的页码数
@Test
public void testPageHelper() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
PageHelper.startPage(1, 4);
List<Emp> emps = mapper.selectByExample(null);
  PageInfo<Emp> page = new PageInfo<>(emps,5);
    System.out.println(page);
    }
  • 分页相关数据:

    PageInfo{
    pageNum=1, pageSize=4, size=4, startRow=1, endRow=4, total=8, pages=2,
    list=Page{count=true, pageNum=1, pageSize=4, startRow=0, endRow=4, total=8, pages=2, reasonable=false, pageSizeZero=false}[Emp{eid=1, empName='admin', age=22, sex='男', email='456@qq.com', did=3}, Emp{eid=2, empName='admin2', age=22, sex='男', email='456@qq.com', did=3}, Emp{eid=3, empName='王五', age=12, sex='女', email='123@qq.com', did=3}, Emp{eid=4, empName='赵六', age=32, sex='男', email='123@qq.com', did=1}],
    prePage=0, nextPage=2, isFirstPage=true, isLastPage=false, hasPreviousPage=false, hasNextPage=true, navigatePages=5, navigateFirstPage=1, navigateLastPage=2, navigatepageNums=[1, 2]}

    其中list中的数据等同于方法一中直接输出的page数据

    在这里插入图片描述

常用数据:
  • pageNum:当前页的页码
  • pageSize:每页显示的条数
  • size:当前页显示的真实条数
  • total:总记录数
  • pages:总页数
  • prePage:上一页的页码
  • nextPage:下一页的页码
  • isFirstPage/isLastPage:是否为第一页/最后一页
  • hasPreviousPage/hasNextPage:是否存在上一页/下一页
  • navigatePages:导航分页的页码数
    x=‘男’, email=‘456@qq.com’, did=3}, Emp{eid=3, empName=‘王五’, age=12, sex=‘女’, email=‘123@qq.com’, did=3}, Emp{eid=4, empName=‘赵六’, age=32, sex=‘男’, email=‘123@qq.com’, did=1}],
    prePage=0, nextPage=2, isFirstPage=true, isLastPage=false, hasPreviousPage=false, hasNextPage=true, navigatePages=5, navigateFirstPage=1, navigateLastPage=2, navigatepageNums=[1, 2]}
posted @ 2025-12-09 21:17  clnchanpin  阅读(1)  评论(0)    收藏  举报