一、基本部署 1.1 xml部署 1.1.1 依赖 <dependency > <groupId > org.mybatis</groupId > <artifactId > mybatis</artifactId > <version > x.x.x</version > </dependency >
1.1.2 业务代码 String resource = "mybatis-config.xml" ;InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder (); SqlSessionFactory sqlSessionFactory= sqlSessionFactoryBuilder.build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(true );UserMapper mapper = sqlSession.getMapper(UserMapper.class);使用... sqlSession.close();
1.1.3 mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd" > <configuration > <environments default ="development" > <environment id ="development" > <transactionManager type ="JDBC" /> <dataSource type ="POOLED" > <property name ="driver" value ="${driver}" /> <property name ="url" value ="${url}" /> <property name ="username" value ="${username}" /> <property name ="password" value ="${password}" /> </dataSource > </environment > </environments > <mappers > <package name ="com.bamboo.mapper" /> </mappers > </configuration >
1.1.4 mapper.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace ="org.mybatis.example.BlogMapper" > <select id ="selectBlog" resultType ="Blog" > select * from Blog where id = #{id} </select > </mapper >
1.2 springboot部署 1.2.1 依赖 <dependency > <groupId > org.mybatis.spring.boot</groupId > <artifactId > mybatis-spring-boot-starter</artifactId > <version > 2.3.0</version > </dependency > <dependency > <groupId > com.mysql</groupId > <artifactId > mysql-connector-j</artifactId > </dependency >
1.2.2 yml配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/fruitdb?useSSL=false username: root password: root mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.bamboo.model
1.3 Mapper.java 和 Mapper.xml映射关系 <insert id ="insertUser" > insert into ... </insert >
public interface UserMapper { int insertUser () ; }
*映射关系使用id进行绑定mapper.java中的方法名
二、属性 2.1 返回集 集合的返回集也是Bean,自动装配只设置类型就好
resultType: 设置默认的映射关系
resultMap: 设置自定义的映射关系
注意:
查询的标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射关系
resultType:自动映射,用于属性名和表中字段名一致的情况
resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况
当查询的数据为多条时,不能使用实体类作为返回值,只能使用集合,否则会抛出异常 TooManyResultsException;
但是若查询的数据只有一条,可以使用实体类或集合作为返回值
2.2 别名 *typeAliases :写在config.xml中设置类型别名,只能别名javabean,如果不填写type设置别名,那么该类型拥有默认的别名,即类名不区分大小写
项目使用
包内所有Bean都被设置别名,且类名不区分大小写
2.3 mappers配置
mapper接口所在的包要和映射文件所在包位置 一致
mapper接口所在的包要和映射文件所在包名字 一致
2.4 MyBatis获取参数值* 两种方式:${} #{}
传值是按照顺序来进行的,与参数名无关
${} 字符串拼接方法,相当于createstatement,会导致SQL注入,使用需要增加引号 ‘${param}’
#{} 占位符赋值 方法,相当于preparedstatement,安全
使用 :**#{}**
${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号
#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
2.5 mapper多参数传递 *单参数 时以任意的名称获取参数的值#{ }
方式一【map集合】
#{arg0} #{arg1}
#{param1} #{param2}
两者可混用
Map手动设置
实体类类型
命名参数@Param
2.6 resultType注意事项 2.6.1 常用规范 在resultType=”Person”中,person类型别名不区分大小写
它的值可以是实体类,集合,Map(单实体)
List<Map<String,Object>>接收多个实体为Map集合
@MapKey(“id”) + Map<String,Object> 查多条,key为id
Mybatis的Java常用类型别名
java.lang.Integer –> int | integer
int –> _int | _integer
Map –> map , List –> list
2.6.2 查多条map集合 方式一:
List<Map<String, Object>> getAllUserToMap () ;
<select id ="getAllUserToMap" resultType ="map" > select * from t_user </select >
方式二【返回值无法转换,直接输出map查看即可】:
@MapKey("id") Map<String, Object> getAllUserToMap () ;
<select id ="getAllUserToMap" resultType ="map" > select * from t_user </select > 结果:
2.7 特殊SQL 模糊查询
like ‘%#{param}%’ // 错误使用
like ‘%${param}%’
like concat(‘%’,#{param},’%’)
like “%”#{param}”%” // 建议使用
批量删除
delete from table in (${ids})
// ids = ‘1,2,3’ ,类型是string,这样传递过来的数据没有单引号包围
动态表名
获取添加功能自增的主键
mapper.xml中useGeneratedKeys=’true’ keyProperty=’id’
其中useGeneratedKeys为开启主键自增,keyProperty将自增主键的值传递到映射文件中的某个属性(这里指定id属性)
例:传递User(id:null,…) 数据进行添加操作后,User对象的id为自增主键值
2.8 自定义映射resultMap 用于处理字段名和属性名不一致问题
例:emp_name empName
不一一对应会导致赋值失败,null
字段名起别名:emp_name as empName
全局配置 config.xml
<settings > <setting name ="mapUnderscoreToCamelCase" value ="true" > </settings >
resultMap 自定义映射关系(处理多对一,一对一)
<resultMap id ='xxxResultMap' type ='pojo' > <id property ='id' column ='eid' /> <result property ='name' column ='fname' /> ... </resultMap > <select id ='methodName' resultMap ='xxxResultMap' > .... </select >
2.8.1 resultMap处理字段和属性的映射关系 若字段名和实体类中的属性名不一致,则可以通过resultMap设置自定义映射
<resultMap id ="userMap" type ="User" > <id property ="id" column ="id" > </id > <result property ="userName" column ="user_name" > </result > <result property ="password" column ="password" > </result > <result property ="age" column ="age" > </result > <result property ="sex" column ="sex" > </result > </resultMap > <select id ="testMohu" resultMap ="userMap" > select id,user_name,password,age,sex from t_user where user_name like concat('%',#{mohu},'%') </select >
2.8.2 多对一映射处理 例:查询员工信息以及员工所对应的部门信息
① 级联方式处理映射关系
property=”dept.dname”的方式嵌套类,低级
<resultMap id ="empDeptMap" type ="Emp" > <id column ="eid" property ="eid" > </id > <result column ="ename" property ="ename" > </result > <result column ="age" property ="age" > </result > <result column ="sex" property ="sex" > </result > <result column ="did" property ="dept.did" > </result > <result column ="dname" property ="dept.dname" > </result > </resultMap > <select id ="getEmpAndDeptByEid" resultMap ="empDeptMap" > select emp.*,dept.* from t_emp emp left join t_dept dept on emp.did = dept.did where emp.eid = #{eid} </select >
② 使用association处理映射关系
<resultMap id ="empDeptMap" type ="Emp" > <id column ="eid" property ="eid" > </id > <result column ="ename" property ="ename" > </result > <result column ="age" property ="age" > </result > <result column ="sex" property ="sex" > </result > <association property ="dept" javaType ="Dept" > <id column ="did" property ="did" > </id > <result column ="dname" property ="dname" > </result > </association > </resultMap > <select id ="getEmpAndDeptByEid" resultMap ="empDeptMap" > select emp.*,dept.* from t_emp emp left join t_dept dept on emp.did = dept.did where emp.eid = #{eid} </select >
③ 分布查询
先根据id查员工信息
再根据员工信息的部门id查部门信息
2.8.3 一对多映射处理 例:根据部门id查新部门以及部门中的员工信息
① collection <resultMap id ="deptEmpMap" type ="Dept" > <id property ="did" column ="did" > </id > <result property ="dname" column ="dname" > </result > <collection property ="emps" ofType ="Emp" > <id property ="eid" column ="eid" > </id > <result property ="ename" column ="ename" > </result > <result property ="age" column ="age" > </result > <result property ="sex" column ="sex" > </result > </collection > </resultMap > <select id ="getDeptEmpByDid" resultMap ="deptEmpMap" > select dept.*,emp.* from t_dept dept left join t_emp emp on dept.did = emp.did where dept.did = #{did} </select >
② 分布查询
查询部门信息
根据部门id查询部门中的所有员工
分步查询的优点:可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息
lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载
aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。 否则,每个属性会按需加载
此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql。此时可通过association和 collection中的fetchType属性设置当前的分步查询是否使用延迟加载,fetchType=”lazy(延迟加 载)|eager(立即加载)”
三、核心配置详解 核心配置文件中的标签必须按照固定的顺序:
properties
settings
typeAliases
typeHandlers
objectFactory
objectWrapperFactory
reflectorFactory
plugins
environments
databaseIdProvider
mappers
<?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" > </properties > <settings > <setting name ="mapUnderscoreToCamelCase" value ="true" /> <setting name ="lazyLoadingEnabled" value ="true" /> </settings > <typeAliases > <package name ="com.atguigu.mybatis.bean" /> </typeAliases > <environments default ="mysql_test" > <environment id ="mysql_test" > <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 > <mapper resource ="UserMapper.xml" /> <package name ="com.atguigu.mybatis.mapper" /> </mappers > </configuration >
四、动态SQL Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决 拼接SQL语句字符串时的痛点问题。
4.1 if if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签中的内容不会执行
<select id ="getEmpListByMoreTJ" resultType ="Emp" > select * from t_emp where 1=1 <if test ="ename != '' and ename != null" > and ename = #{ename} </if > <if test ="age != '' and age != null" > and age = #{age} </if > <if test ="sex != '' and sex != null" > and sex = #{sex} </if > </select >
4.2 where <select id ="getEmpListByMoreTJ2" resultType ="Emp" > select * from t_emp <where > <if test ="ename != '' and ename != null" > ename = #{ename} </if > <if test ="age != '' and age != null" > and age = #{age} </if > <if test ="sex != '' and sex != null" > and sex = #{sex} </if > </where > </select >
where和if一般结合使用:
若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字
若where标签中的if条件满足,则where标签会自动添加where关键字,并将条件最前方多余的and去掉
注意:where标签不能去掉 条件最后多余的and
4.3 trim <select id ="getEmpListByMoreTJ" resultType ="Emp" > select * from t_emp <trim prefix ="where" suffixOverrides ="and" > <if test ="ename != '' and ename != null" > ename = #{ename} and </if > <if test ="age != '' and age != null" > age = #{age} and </if > <if test ="sex != '' and sex != null" > sex = #{sex} </if > </trim > </select >
trim用于去掉或添加标签中的内容,常用属性:
prefix:在trim标签中的内容的前面添加某些内容
prefixOverrides:在trim标签中的内容的前面去掉某些内容
suffix:在trim标签中的内容的后面添加某些内容
suffixOverrides:在trim标签中的内容的后面去掉某些内容
4.4 choose、when、otherwise 多条件选其一
choose、when、otherwise相当于if…else if..else
<select id ="getEmpListByChoose" resultType ="Emp" > select <include refid ="empColumns" > </include > from t_emp <where > <choose > <when test ="ename != '' and ename != null" > ename = #{ename} </when > <when test ="age != '' and age != null" > age = #{age} </when > <when test ="sex != '' and sex != null" > sex = #{sex} </when > <when test ="email != '' and email != null" > email = #{email} </when > </choose > </where > </select >
4.5 foreach <insert id ="insertMoreEmp" > insert into t_emp values <foreach collection ="emps" item ="emp" separator ="," > (null,#{emp.ename},#{emp.age},#{emp.sex},#{emp.email},null) </foreach > </insert > <delete id ="deleteMoreByArray" > delete from t_emp where <foreach collection ="eids" item ="eid" separator ="or" > eid = #{eid} </foreach > </delete > <delete id ="deleteMoreByArray" > delete from t_emp where eid in <foreach collection ="eids" item ="eid" separator ="," open ="(" close =")" > #{eid} </foreach > </delete >
属性:
collection:设置要循环的数组或集合
item:表示集合或数组中的每一个数据
separator:设置循环体之间的分隔符
open:设置foreach标签中的内容的开始符
close:设置foreach标签中的内容的结束符
4.6 SQL片段 sql片段,可以记录一段公共sql片段,在使用的地方通过include标签进行引入
<sql id ="empColumns" > eid,ename,age,sex,did </sql > <select id ="getAllData" > select <include refid ="empColumns" > </include > from t_emp </select >
五、MyBatis的缓存 5.1 MyBatis的一级缓存 一级缓存是SqlSession级别 的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问
使一级缓存失效的四种情况:
不同的SqlSession对应不同的一级缓存
同一个SqlSession但是查询条件不同
同一个SqlSession两次查询期间执行了任何一次增删改操作
同一个SqlSession两次查询期间手动清空了缓存
5.2 MyBatis的二级缓存 二级缓存是SqlSessionFactory级别 ,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取
二级缓存开启 的条件:
在核心配置文件中,设置全局配置属性cacheEnabled=”true”,默认为true,不需要设置
在映射文件中设置标签
二级缓存必须在SqlSession关闭或提交之后有效
查询的数据所转换的实体类类型必须实现序列化的接口
使二级缓存失效 的情况:
两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效
5.3 二级缓存的相关配置 在mapper配置文件中添加的cache标签可以设置一些属性:
eviction属性:缓存回收策略
LRU(Least Recently Used) – 最近最少使用的:移除最长时间不被使用的对象。
FIFO(First in First out) – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象
WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
默认的是 LRU
flushInterval属性:刷新间隔,单位毫秒
默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新
size属性:引用数目,正整数
代表缓存最多可以存储多少个对象,太大容易导致内存溢出
readOnly属性:只读,true/false
true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。
false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false
5.4 MyBatis缓存查询的顺序
先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。
如果二级缓存没有命中,再查询一级缓存
如果一级缓存也没有命中,则查询数据库
SqlSession关闭之后,一级缓存中的数据会写入二级缓存
5.5 整合第三方缓存EHCache 5.5.1 添加依赖 <dependency > <groupId > org.mybatis.caches</groupId > <artifactId > mybatis-ehcache</artifactId > <version > 1.2.1</version > </dependency > <dependency > <groupId > ch.qos.logback</groupId > <artifactId > logback-classic</artifactId > <version > 1.2.3</version > </dependency >
5.5.2 各jar包功能
jar包名称
作用
mybatis-ehcache
Mybatis和EHCache的整合包
ehcache
EHCache核心包
slf4j-api
SLF4J日志门面包
logback-classic
支持SLF4J门面接口的一个具体实现
5.5.3 创建EHCache的配置文件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 >
5.5.4 设置二级缓存的类型 <cache type ="org.mybatis.caches.ehcache.EhcacheCache" />
5.5.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 > <root level ="DEBUG" > <appender-ref ref ="STDOUT" /> </root > <logger name ="com.bamboo.mapper" level ="DEBUG" /> </configuration >
5.5.6 EHCache配置文件说明
属性名
是否必须
作用
maxElementsInMemory
是
在内存中缓存的element的最大数目
maxElementsOnDisk
是
在磁盘上缓存的element的最大数目,若是0表示无穷大
eternal
是
设定缓存的elements是否永远不过期。 如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds、timeToLiveSeconds判断
overflowToDisk
是
设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
timeToIdleSeconds
否
当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时, 这些数据便会删除,默认值是0,也就是可闲置时间无穷大
timeToLiveSeconds
否
缓存element的有效生命期,默认是0,也就是element存活时间无穷大
diskSpoolBufferSizeMB
否
DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
diskPersistent
否
在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。
diskExpiryThreadIntervalSeconds
否
磁盘缓存的清理线程运行间隔,默认是120秒。每个120s, 相应的线程会进行一次EhCache中数据的清理工作
memoryStoreEvictionPolicy
否
当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。 默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)
六、MyBatis的逆向工程
正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的。
逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源:
Java实体类
Mapper接口
Mapper映射文件
6.1 创建逆向工程的步骤 6.1.1 添加依赖和插件 <dependencies > <dependency > <groupId > org.mybatis</groupId > <artifactId > mybatis</artifactId > <version > 3.5.13</version > </dependency > </dependencies > <build > <plugins > <plugin > <groupId > org.mybatis.generator</groupId > <artifactId > mybatis-generator-maven-plugin</artifactId > <version > 1.4.0</version > <dependencies > <dependency > <groupId > org.mybatis.generator</groupId > <artifactId > mybatis-generator-core</artifactId > <version > 1.4.0</version > </dependency > <dependency > <groupId > com.mchange</groupId > <artifactId > c3p0</artifactId > <version > 0.9.5.5</version > </dependency > <dependency > <groupId > mysql</groupId > <artifactId > mysql-connector-java</artifactId > <version > 5.1.49</version > </dependency > </dependencies > </plugin > </plugins > </build >
6.1.2 创建MyBatis的核心配置文件 6.1.3 创建逆向工程的配置文件 文件名必须是:generatorConfig.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" > <generatorConfiguration > <context id ="DB2Tables" targetRuntime ="MyBatis3Simple" > <jdbcConnection driverClass ="com.mysql.jdbc.Driver" connectionURL ="jdbc:mysql://localhost:3306/mybatis" userId ="root" password ="root" > </jdbcConnection > <javaModelGenerator targetPackage ="com.bamboo.mybatis.bean" targetProject =".\src\main\java" > <property name ="enableSubPackages" value ="true" /> <property name ="trimStrings" value ="true" /> </javaModelGenerator > <sqlMapGenerator targetPackage ="com.bamboo.mybatis.mapper" targetProject =".\src\main\resources" > <property name ="enableSubPackages" value ="true" /> </sqlMapGenerator > <javaClientGenerator type ="XMLMAPPER" targetPackage ="com.bamboo.mybatis.mapper" targetProject =".\src\main\java" > <property name ="enableSubPackages" value ="true" /> </javaClientGenerator > <table tableName ="t_emp" domainObjectName ="Emp" /> <table tableName ="t_dept" domainObjectName ="Dept" /> </context > </generatorConfiguration >
6.1.4 执行MBG插件的generate目标
七、分页查询 7.1 分页插件使用步骤 7.1.1 添加依赖 <dependency > <groupId > com.github.pagehelper</groupId > <artifactId > pagehelper</artifactId > <version > 5.3.3</version > </dependency >
7.1.2 配置分页插件 在MyBatis的核心配置文件中配置插件
<plugins > <plugin interceptor ="com.github.pagehelper.PageInterceptor" > </plugin > </plugins >
7.2 分页插件的使用 7.2.1 开启分页功能 在查询功能之前使用PageHelper.startPage(int pageNum, int pageSize)
开启分页功能
pageNum:当前页的页码
pageSize:每页显示的条数
PageHelper.startPage(3 , 5 );
即开即用,在调用Mapper前使用
7.2.2 获取分页相关数据 在查询获取list集合之后,使用PageInfo pageInfo = new PageInfo<>(List list, intnavigatePages)
获取分页相关数据
list:分页之后的数据
navigatePages:导航分页的页码数
UserMapper mapper = sqlSession.getMapper(UserMapper.class);PageHelper.startPage(3 , 5 ); Map<Integer, User> map = mapper.getAllUserToMap(); System.out.println(map);
PageHelper使用了ThreadLocal保存分页参数,分页参数和线程是绑定的。因此我们需要保证PageHelper 的startPage调用后紧跟 MyBatis 查询方法,这就是安全的 。因为 PageHelper 在 finally 代码段中自动清除了 ThreadLocal 存储的对象。
7.2.3 分页相关数据 PageInfo{ pageNum=8 , pageSize=4 , size=2 , startRow=29 , endRow=30 , total=30 , pages=8 , list=Page{count=true , pageNum=8 , pageSize=4 , startRow=28 , endRow=32 , total=30 , pages=8 , reasonable=false , pageSizeZero=false }, prePage=7 , nextPage=0 , isFirstPage=false , isLastPage=true , hasPreviousPage=true , hasNextPage=false , navigatePages=5 , navigateFirstPage4, navigateLastPage8, navigatepageNums=[4 , 5 , 6 , 7 , 8 ] }
常用数据:
pageNum:当前页的页码
pageSize:每页显示的条数
size:当前页显示的真实条数
total:总记录数
pages:总页数
prePage:上一页的页码
nextPage:下一页的页码
isFirstPage/isLastPage:是否为第一页/最后一页
hasPreviousPage/hasNextPage:是否存在上一页/下一页
navigatePages:导航分页的页码数
navigatepageNums:导航分页的页码,[1,2,3,4,5]