网页分页显示一般分为以下三种方式:
1.把数据库所有的数据查询出来放在内存中,
然后从内存逐页取数据(不推荐)
2.要取某一个数据,在数据库中分页查询,一次
只查询一页数据(推荐)
3.上面两种结合,从数据库中拿出一批数据缓存到
内存中(redis)
分页sql语句,不同的数据库,分页sql语句不同,现在只说一下MySQL数据库的分页
mysql:
/*
limit 语句放在sql语句的最后
limit 参数1,参数2
参数1:起始位置 (实际上从起始位置+1的那条记录开始)
(currentPage-1)*pageSize
参数2:查几条数据 ,每页的记录条数
*/
/*
int currentPage=1
int pageSize=3;
从0的下一条记录开始,查询3调数据
*/
select * from t_user limit 0,3;
/*
int currentPage=2
int pageSize=3;
从3的下一条记录开始,查询3调数据
*/
select * from t_user limit 3,3;
/*
int currentPage=3
int pageSize=3;
从6的下一条记录开始,查询3调数据
*/
select * from t_user limit 6,3;
分页的算法
假设有10页,显示的分页条中最多显示5个超链接,有如下算法:
/**
* 此方法是计算页面分页条中有多少个超链接
* @param currentPage
* @param pageSize
* @param totalCount
* @param totalPage
* @return
*/
public List<Integer> getFenYe_a_Num(
int currentPage,
int pageSize,
int totalCount,
int totalPage){
List<Integer> aNum=new ArrayList<Integer>();
//int showNum_a=CommonValue.showNum_a;
if(totalCount/pageSize>=showNum_a){
//总页数大于等于showNum_a 5
f(currentPage<showNum_a/2+1){
//当前页在showNum_a的中间左边
for(int i=1;i<=showNum_a;i++){
aNum.add(new Integer(i));
}
}else if((totalPage-currentPage)<(showNum_a/2+1)){
//判断如果是到最后,最后的那几个数字不能移动的
for(int i=1;i<=showNum_a;i++){
aNum.add(new Integer(totalPage-showNum_a+i));
}
}else{
//不是头,也不是尾,是中间部分
for(int i=(currentPage-(showNum_a-(showNum_a/2+1)));i<=(currentPage+(showNum_a-(showNum_a/2+1)));i++){
aNum.add(new Integer(i));
}
}
}else{
//总页数不够showNum_a 5
for(int i=1;i<=totalPage;i++){
aNum.add(new Integer(i));
}
}
return aNum;
}
显示效果如下:
第1页
1 2 3 4 5
第2页
1 2 3 4 5
第3页
1 2 3 4 5
第4页
2 3 4 5 6
第5页
3 4 5 6 7
第6页
4 5 6 7 8
第7页
5 6 7 8 9
第8页
6 7 8 9 10
第9页
6 7 8 9 10
第10页
6 7 8 9 10
有关于多模糊条件查询问题:
方案一:
select * from t_user
where user_loginname like '%%' and
user_nickname like '%知%'
原理:列名 like '%%',相当于没条件
列名 like '%条件值%' 有模糊条件
方案二:
必须借助mybatis的动态sql
<select id="findUsersByPage"
parameterType="User"
resultMap="user_Map">
select * from
<where>
<if test="loginName !=null">
user_loginname like #{loginName}
</if
<if test="nickName !=null">
and user_nickname like #{nickName}
</if
</where>
</select>