查询条件:客户姓名模糊查询 客户性别精确查询
String sql ="select * from tb_customer where cusName like '%"+cusName+"%' and sex="+sex;
String cusName;
Integer sex;
String sql="select * from tb_customer";
String sql ="select * from tb_customer where sex="+sex;
//12个查询条件
String sql="select * from tb_customer where 1=1";
if(cusName!=null){
sql+=" and cusName like"
}
if(sex!=null){
sql+=" and sex="
}
String sql="select * from tb_customer";
if(cusName!=null || sex!=null){
sql+=" where "
};
int num=0;
if(cusName!=null and num==0){
sql+=" cusName="
}
if(cusName!=null){
}
// 判断是否包含有查询条件
根据业务需求的变化,sql语句会发生变化,sql语句不是固定的sql语句
1.什么时候有where
2.第一个查询条件没有and,以后的查询条件都有and 或or
要结合if标签或choose标签使用。自动增加where关键字,并去除第一个and关键字
and
and
and
<select id="selectUsers" resultType="user">
select id id2,name name2,sex sex2 from tb_user
<where>
<if test="name!=null and name!=''">
and name like #{name}
if>
<if test="sex!=null">
and sex=#{sex}
if>
<if test="age!=null">
and age=#{age}
if>
where>
select>
修改用户信息,只修改不为空的属性
String sql="update tb_user set "; if(name!=null){ sql+="name="+name+","; } if(age!=null){ sql+=" age="+age+"," }
只能用于update语句,自动增加SET关键字,并去除最后一个,
<update id="updateById">
update tb_user
<set>
<if test="name!=null and name!=''">
name=#{name},
if>
<if test="age!=null">
age=#{age},
if>
<if test="sex!=null">
sex=#{sex},
if>
set>
where id=#{id}
update>
当逻辑表达式成立时,标签内部的内容显示
当逻辑表达式成立时,标签内部的内容显示
逻辑运算符:
==
!=
> > 转义支付
< < 转义字符
>=
<=
and
or
变量:如果输入参数是简单类型 变量_parameter 代表输入的参数的值
输入参数是自定义类型,属性名就代表的输入参数
输入参数是map,key代表的输入参数
id>10查询id>10的所有用户,如果id<=10,查询所有用户
注意
如果输入参数中有自定义类型的属性,在判断时必须先判断自定义类型是否为空,才能够调用自定义类型的属性中的属性名
<select id="selectUsers" resultType="user">
select id id2,name name2,sex sex2 from tb_user
<if test="map.id>10">
where id <#{id}
if>
select>
....
....
<select id="selectUsers" resultType="user">
select id id2,name name2,sex sex2 from tb_user
<choose>
<when test="map!=null and map.id>10">
where id>#{id}
when>
<otherwise>
order by id desc
otherwise>
choose>
select>
in子句
where id in(1,2,3,4,5)
数组
delete from tb_user
#{id}
List
delete from tb_user
#{id}
自定义类型
<delete id="deleteById" parameterType="user">
delete from tb_user
<foreach collection="ids" item="id" open=" where id in(" close=")" separator=",">
#{id}
foreach>
delete>
注意
foreach遍历时,如果输入参数是数组,collection=“array”
如果输入参数是集合 collection=“list”
如果输入参数是自定义类型 collection=“集合类型的属性的属性名”
可以自定义实现where和set
update tb_user
name=#{name},
age=#{age},
sex=#{sex},
where id=#{id}
定义sql片段,定义的sql片段可以重复使用的模板
select * from 表
// 表30个字段
select 30个字段 from
id,name,sex,age,'hello'
order by id desc,name asc
多表查询
订单主表:1
订单明细表:n
查询订单明细,并关联显示订单主表信息
订单明细id 商品id 商品个数 单价 小计 订单编号 订单状态
关联查询:
内连接(隐式内连接,显示内连接)
外连接(左,右)
全连接(full join)x
select a.*,b.order_no,b.flag from tb_order_detail a
left join tb_order_main b on b.id = a.main_id
注意
多表查询不能使用号,会出现重复的列。技巧:需要显示的字段多的表使用x.,另外的表只能使用字段
扩展类
Dto结尾的,对目标类型进行扩展,需要通过扩展类来描述查询结果表之间的关系
<resultMap type="OrderDetailDto" id="map22">
<id column="id" property="id"/>
<result column="main_id" property="mainId"/>
<result column="goods_id" property="goodsId"/>
<result column="num" property="num"/>
<result column="total" property="total"/>
<result column="order_no" property="orderNo"/>
<result column="flag" property="flag"/>
resultMap>
<select id="selectDetailsByMain" resultMap="map22">
select a.*,b.order_no,b.flag from tb_order_detail a
left join tb_order_main b on b.id = a.main_id
select>
扩展类
添加一个自定义类型的属性
package com.xxx.pojo;
/**
* 1个dto对象,这个对象时一个detail,同时对应一个main
* @author admin
*
*/
public class OrderDetailDto extends OrderDetail{
private OrderMain main;
public OrderMain getMain() {
return main;
}
public void setMain(OrderMain main) {
this.main = main;
}
}
淘宝中:实现我的订单功能
1?request作用域中存放什么样的数据
List>
List
?
// 1.确定需要几张表
// 2.确定表间过膝
// 3.确定连接方式
order_main tb_order_detail
1vN
确定主从关系
SELECT a.*,b.id detal_id,b.goods_id ,b.num,b.total,b.price FROM tb_order_main a LEFT JOIN
tb_order_detail b ON a.id = b.main_id
扩展类
package com.xxx.pojo.dto;
import java.util.List;
import com.xxx.pojo.OrderDetail;
import com.xxx.pojo.OrderMain;
public class OrderMainDto extends OrderMain{
List details;
public List getDetails() {
return details;
}
public void setDetails(List details) {
this.details = details;
}
}
需要在扩展类在中增加集合类型的属性
List mains;
request.setAttribute("mains",mains);
request.getDispatch('/order.jsp').forward(request,response);
${main.orderNo},${main.total}
商品id:${details.goodsId}
采用association和collection的嵌套使用
用户表:
create table tb_user( id int not null primary key auto_increment, name varchar(200) );
商品表
create table tb_goods( id int not null primary key auto_increment, name varchar(20), price int );
查询用户信息并显示用户购买的商品信息
用户1
订单主表n 1
订单明细 n 1
商品 1
SELECT * FROM tb_user a
LEFT JOIN tb_order_main b on b.user_id = a.id
LEFT JOIN tb_order_detail c on c.main_id = b.id
LEFT JOIN tb_goods d on c.goods_id = d.id
<resultMap type="userdto" id="map24">
<id column="id" property="id"/>
<result column="name" property="name"/>
<collection property="mains" ofType="OrderMainDto">
<id column="main_id" property="id"/>
<result column="order_no" property="orderNo"/>
<result column="flag" property="flag"/>
<result column="total" property="total"/>
<result column="id" property="userId"/>
<collection property="details" ofType="OrderDetailDto">
<id column="detail_id" property="id"/>
<result column="num" property="num"/>
<result column="xj" property="total"/>
<association property="goods" javaType="goods">
<id column="goods_id" property="id"/>
<result column="goods_name" property="name"/>
association>
collection>
collection>
resultMap>
<select id="selectUserGoods" resultMap="map24">
SELECT a.*,b.id main_id,b.order_no,b.flag,b.total,
c.id detail_id,c.num,c.total xj,d.id goods_id,d.name goods_name
FROM tb_user a
LEFT JOIN tb_order_main b on b.user_id = a.id
LEFT JOIN tb_order_detail c on c.main_id = b.id
LEFT JOIN tb_goods d on c.goods_id = d.id
select>
<resultMap type="userdto" id="map24">
<id column="id" property="id"/>
<result column="name" property="name"/>
<collection property="goods" ofType="goods">
<id column="goods_id" property="id"/>
<result column="goods_name" property="name"/>
collection>
resultMap>
<select id="selectUserGoods" resultMap="map24">
SELECT a.*,b.id main_id,b.order_no,b.flag,b.total,
c.id detail_id,c.num,c.total xj,d.id goods_id,d.name goods_name
FROM tb_user a
LEFT JOIN tb_order_main b on b.user_id = a.id
LEFT JOIN tb_order_detail c on c.main_id = b.id
LEFT JOIN tb_goods d on c.goods_id = d.id
select>
总结
1.重点在于编写关联查询的sql语句
2.创建扩展类
3.在翻译映射规则(主键列用id,普通列用result,自定义类型的属性用association,集合类型的属性用collection)
select 查询字段列表,函数(sum(a)),常量('hello'),子查询(子查询结果只能为一条)
from 表名,查询结果(select * from ssdsd) b
where
group by
having
order by
limit
admin,(select sex from 表)
延迟加载必须使用resultMap,只有在高级查询结果映射时才会使用延迟加载。按需加载
select * from tb_user a left join tb_role b on a.role_id = b.id
电商项目中需要考虑性能
100条数据 100条用户信息和100条关联查询结果
select * from s_user
mybatis默认关闭了延迟加载(需要手动开启延迟加载)
将多表查询拆分成单表查询
1.查询所有的订单明细信息
2.根据订单主表id查询主表信息
<resultMap type="OrderDetailDto" id="map25">
<id column="id" property="id"/>
<result column="main_id" property="mainId"/>
<result column="goods_id" property="goodsId"/>
<result column="num" property="num"/>
<result column="total" property="total"/>
<association property="main" javaType="ordermain" select="selectMainById" column="{id=main_id,id2=id}">
association>
resultMap>
<select id="selectDetails" resultMap="map25">
select * from tb_order_detail
select>
<select id="selectMainById" parameterType="map" resultType="ordermain">
select id,order_no orderNo,user_id userId,flag,total
from tb_order_main where id=#{id} and id=#{id2}
select>
计算机的存储机制:内存储器、外存储器
外存储器:硬盘、U盘、软盘
优点:存储空间大
64核 20T
缺点:读写效率低
内存储器:内存
优点:读写效率高
缺点:空间小
如果将数据存储在内容中,操作快。考虑内存中数据的大小。内存管理的数据库
所有的非关系型数据库都是基于内存存储。
内存的设计方式:map
mybatis中以及缓存是sqlSession级别的缓存,同一个sqlSession多次调用相同的mapperstatement(sqlid相同,输入参数也相同)会触发一级缓存。默认开启了一级缓存。
package com.xxx.test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import com.xxx.mapper.UserMapper;
import com.xx.pojo.dto.OrderMainDto;
import com.xx.util.SqlSessionUtil;
public class Test2 {
private static Map cache = new HashMap();
public static void main(String[] args) {
SqlSession session = SqlSessionUtil.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.selectMains1(); // 第一 次调用selectMains1 从数据库中查询
mapper.selectMains1();
mapper.selectMains1();
mapper.selectMains1();
session.close();
}
}
mybatis二级缓存是mapper级别的缓存,同一个mapper的同一一个方法(包含输入参数相同)被不同的sqlSession调用,多次调用会触发二级缓存。(默认未开启二级缓存,需要手动开启)
service
n:
SqlSession session = SqlSessionUtil.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.selectMains1(); // 第一 次调用selectMains1 从数据库中查询
session.close();
二级缓存发生的几率很高,内存溢出。序列化的功能。使用频率较低的数据序列化到磁盘中,反序列化到内存中
注意
1.使用二级缓存,结果映射的类必须可序列化
2.不同的sqlSession必须来自于同一个sqlSessionFactory
package com.xxx.test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import com.xxx.mapper.UserMapper;
import com.xxx.pojo.dto.OrderMainDto;
import com.xxx.util.SqlSessionUtil;
public class Test2 {
private static Map cache = new HashMap();
public static void main(String[] args) {
SqlSession session = SqlSessionUtil.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.selectMains1(); // 第一 次调用selectMains1 从数据库中查询
session.close();
SqlSession session2 = SqlSessionUtil.getSession();
UserMapper mapper2 = session2.getMapper(UserMapper.class);
mapper2.selectMains1(); // 第一 次调用selectMains1 从数据库中查询
session2.close();
// update
SqlSession session4 = SqlSessionUtil.getSession();
UserMapper mapper4 = session4.getMapper(UserMapper.class);
mapper4.deleteMainById(2);
session4.close();
SqlSession session3 = SqlSessionUtil.getSession();
UserMapper mapper3 = session3.getMapper(UserMapper.class);
mapper3.selectMains1(); // 第一 次调用selectMains1 从数据库中查询
session3.close();
}
}
mybatis业务层分页
public class OrderMainServiceImpl{
public Page selectMainByPage(Integer pageNumber,Integer pageSize){
//调用Mapper
page.setTotal(mapper.selectMainCount())
page.setPages(page.getTotal()%pageSize==0?page.getTotal()/pageSize:page.getTotal()/pageSize+1);
mapper.selectBylimit()
}
}
需要下载依赖并添加到构建路径中
特别注意,新版拦截器是 com.github.pagehelper.PageInterceptor
。 com.github.pagehelper.PageHelper
现在是一个特殊的 dialect
实现类,是分页插件的默认实现类,提供了和以前相同的用法。
helperDialect
(分页的方言):分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect
属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值: oracle
,mysql
,mariadb
,sqlite
,hsqldb
,postgresql
,db2
,sqlserver
,informix
,h2
,sqlserver2012
,derby
(完整内容看 PageAutoDialect) **特别注意:**使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012
,否则会使用 SqlServer2005 的方式进行分页,还可以设置 useSqlserver2012=true
将2012改为sqlserver的默认方式。 你也可以实现 AbstractHelperDialect
,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。useSqlserver2012
(sqlserver):使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012
,否则会使用 SqlServer2005 的方式进行分页,还可以设置 useSqlserver2012=true
将2012改为sqlserver的默认方式。pageSizeZero
:默认值为 false
,当该参数设置为 true
时,如果 pageSize=0
或者 RowBounds.limit = 0
就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page
类型)。PageHelper.startPage
静态方法调用除了 PageHelper.startPage
方法外,还提供了类似用法的 PageHelper.offsetPage
方法。
在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage
静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。
//获取第1页,10条内容,默认查询总数count
// 参数1 pageNumber
// 参数2 pageSize
PageHelper.startPage(1, 10);
//紧跟着的第一个select方法会被分页
int i=0;
int b=1;
int c=2;
List list = userMapper.selectIf(1);
List list1 = userMapper.selectIf(1);
List list2 = userMapper.selectIf(1);
List list3 = userMapper.selectIf(1);
//用PageInfo对结果进行包装==Page
PageInfo page = new PageInfo(list);
//测试PageInfo全部属性
//PageInfo包含了非常全面的分页属性
assertEquals(1, page.getPageNum());
assertEquals(10, page.getPageSize());
assertEquals(1, page.getStartRow());
assertEquals(10, page.getEndRow());
assertEquals(183, page.getTotal());
assertEquals(19, page.getPages());
assertEquals(1, page.getFirstPage());
assertEquals(8, page.getLastPage());
assertEquals(true, page.isFirstPage());
assertEquals(false, page.isLastPage());
assertEquals(false, page.isHasPreviousPage());
assertEquals(true, page.isHasNextPage());
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2022 [email protected]
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.github.pagehelper;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* 对Page结果进行包装
*
* 新增分页的多项属性,主要参考:http://bbs.csdn.net/topics/360010907
*
* @author liuzh/abel533/isea533
* @version 3.3.0
* @since 3.2.2
* 项目地址 : http://git.oschina.net/free/Mybatis_PageHelper
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public class PageInfo extends PageSerializable {
public static final int DEFAULT_NAVIGATE_PAGES = 8;
public static final PageInfo EMPTY = new PageInfo(Collections.emptyList(), 0);
/**
* 当前页
*/
private int pageNum;
/**
* 每页的数量
*/
private int pageSize;
/**
* 当前页的数量
*/
private int size;
/**
* 由于startRow和endRow不常用,这里说个具体的用法
* 可以在页面中"显示startRow到endRow 共size条数据"
* 当前页面第一个元素在数据库中的行号
*/
private long startRow;
/**
* 当前页面最后一个元素在数据库中的行号
*/
private long endRow;
/**
* 总页数
*/
private int pages;
/**
* 前一页
*/
private int prePage;
/**
* 下一页
*/
private int nextPage;
/**
* 是否为第一页
*/
private boolean isFirstPage = false;
/**
* 是否为最后一页
*/
private boolean isLastPage = false;
/**
* 是否有前一页
*/
private boolean hasPreviousPage = false;
/**
* 是否有下一页
*/
private boolean hasNextPage = false;
/**
* 导航页码数
*/
private int navigatePages;
/**
* 所有导航页号
*/
private int[] navigatepageNums;
/**
* 导航条上的第一页
*/
private int navigateFirstPage;
/**
* 导航条上的最后一页
*/
private int navigateLastPage;
public PageInfo() {
}
/**
* 包装Page对象
*
* @param list
*/
public PageInfo(List extends T> list) {
this(list, DEFAULT_NAVIGATE_PAGES);
}
/**
* 包装Page对象
*
* @param list page结果
* @param navigatePages 页码数量
*/
public PageInfo(List extends T> list, int navigatePages) {
super(list);
if (list instanceof Page) {
Page page = (Page) list;
this.pageNum = page.getPageNum();
this.pageSize = page.getPageSize();
this.pages = page.getPages();
this.size = page.size();
//由于结果是>startRow的,所以实际的需要+1
if (this.size == 0) {
this.startRow = 0;
this.endRow = 0;
} else {
this.startRow = page.getStartRow() + 1;
//计算实际的endRow(最后一页的时候特殊)
this.endRow = this.startRow - 1 + this.size;
}
} else if (list instanceof Collection) {
this.pageNum = 1;
this.pageSize = list.size();
this.pages = this.pageSize > 0 ? 1 : 0;
this.size = list.size();
this.startRow = 0;
this.endRow = list.size() > 0 ? list.size() - 1 : 0;
}
if (list instanceof Collection) {
calcByNavigatePages(navigatePages);
}
}
public static PageInfo of(List extends T> list) {
return new PageInfo(list);
}
public static PageInfo of(List extends T> list, int navigatePages) {
return new PageInfo(list, navigatePages);
}
/**
* 返回一个空的 Pageinfo 对象
*
* @return
*/
public static PageInfo emptyPageInfo() {
return EMPTY;
}
public void calcByNavigatePages(int navigatePages) {
setNavigatePages(navigatePages);
//计算导航页
calcNavigatepageNums();
//计算前后页,第一页,最后一页
calcPage();
//判断页面边界
judgePageBoudary();
}
/**
* 计算导航页
*/
private void calcNavigatepageNums() {
//当总页数小于或等于导航页码数时
if (pages <= navigatePages) {
navigatepageNums = new int[pages];
for (int i = 0; i < pages; i++) {
navigatepageNums[i] = i + 1;
}
} else { //当总页数大于导航页码数时
navigatepageNums = new int[navigatePages];
int startNum = pageNum - navigatePages / 2;
int endNum = pageNum + navigatePages / 2;
if (startNum < 1) {
startNum = 1;
//(最前navigatePages页
for (int i = 0; i < navigatePages; i++) {
navigatepageNums[i] = startNum++;
}
} else if (endNum > pages) {
endNum = pages;
//最后navigatePages页
for (int i = navigatePages - 1; i >= 0; i--) {
navigatepageNums[i] = endNum--;
}
} else {
//所有中间页
for (int i = 0; i < navigatePages; i++) {
navigatepageNums[i] = startNum++;
}
}
}
}
/**
* 计算前后页,第一页,最后一页
*/
private void calcPage() {
if (navigatepageNums != null && navigatepageNums.length > 0) {
navigateFirstPage = navigatepageNums[0];
navigateLastPage = navigatepageNums[navigatepageNums.length - 1];
if (pageNum > 1) {
prePage = pageNum - 1;
}
if (pageNum < pages) {
nextPage = pageNum + 1;
}
}
}
/**
* 判定页面边界
*/
private void judgePageBoudary() {
isFirstPage = pageNum == 1;
isLastPage = pageNum == pages || pages == 0;
hasPreviousPage = pageNum > 1;
hasNextPage = pageNum < pages;
}
/**
* 是否包含内容
*/
public boolean hasContent() {
return this.size > 0;
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public long getStartRow() {
return startRow;
}
public void setStartRow(long startRow) {
this.startRow = startRow;
}
public long getEndRow() {
return endRow;
}
public void setEndRow(long endRow) {
this.endRow = endRow;
}
public int getPages() {
return pages;
}
public void setPages(int pages) {
this.pages = pages;
}
public int getPrePage() {
return prePage;
}
public void setPrePage(int prePage) {
this.prePage = prePage;
}
public int getNextPage() {
return nextPage;
}
public void setNextPage(int nextPage) {
this.nextPage = nextPage;
}
public boolean isIsFirstPage() {
return isFirstPage;
}
public void setIsFirstPage(boolean isFirstPage) {
this.isFirstPage = isFirstPage;
}
public boolean isIsLastPage() {
return isLastPage;
}
public void setIsLastPage(boolean isLastPage) {
this.isLastPage = isLastPage;
}
public boolean isHasPreviousPage() {
return hasPreviousPage;
}
public void setHasPreviousPage(boolean hasPreviousPage) {
this.hasPreviousPage = hasPreviousPage;
}
public boolean isHasNextPage() {
return hasNextPage;
}
public void setHasNextPage(boolean hasNextPage) {
this.hasNextPage = hasNextPage;
}
public int getNavigatePages() {
return navigatePages;
}
public void setNavigatePages(int navigatePages) {
this.navigatePages = navigatePages;
}
public int[] getNavigatepageNums() {
return navigatepageNums;
}
public void setNavigatepageNums(int[] navigatepageNums) {
this.navigatepageNums = navigatepageNums;
}
public int getNavigateFirstPage() {
return navigateFirstPage;
}
public int getNavigateLastPage() {
return navigateLastPage;
}
public void setNavigateFirstPage(int navigateFirstPage) {
this.navigateFirstPage = navigateFirstPage;
}
public void setNavigateLastPage(int navigateLastPage) {
this.navigateLastPage = navigateLastPage;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("PageInfo{");
sb.append("pageNum=").append(pageNum);
sb.append(", pageSize=").append(pageSize);
sb.append(", size=").append(size);
sb.append(", startRow=").append(startRow);
sb.append(", endRow=").append(endRow);
sb.append(", total=").append(total);
sb.append(", pages=").append(pages);
sb.append(", list=").append(list);
sb.append(", prePage=").append(prePage);
sb.append(", nextPage=").append(nextPage);
sb.append(", isFirstPage=").append(isFirstPage);
sb.append(", isLastPage=").append(isLastPage);
sb.append(", hasPreviousPage=").append(hasPreviousPage);
sb.append(", hasNextPage=").append(hasNextPage);
sb.append(", navigatePages=").append(navigatePages);
sb.append(", navigateFirstPage=").append(navigateFirstPage);
sb.append(", navigateLastPage=").append(navigateLastPage);
sb.append(", navigatepageNums=");
if (navigatepageNums == null) {
sb.append("null");
} else {
sb.append('[');
for (int i = 0; i < navigatepageNums.length; ++i) {
sb.append(i == 0 ? "" : ", ").append(navigatepageNums[i]);
}
sb.append(']');
}
sb.append('}');
return sb.toString();
}
}