java mysql模仿百度搜索技术_JAVAEE之-----MySQL分页技术(带搜索)

本文介绍了在Java中使用MySQL实现分页查询技术,包括确定每页显示数量、计算总页数、处理搜索条件,并给出了DAO层的简易版和完整版(带搜索)的代码示例,以及Servlet中处理页面跳转和搜索结果的方法。
摘要由CSDN通过智能技术生成

需求:

为什么需要采用分页技术呢?在数据库中我们查询数据的时候,需要将数据返回到显示页面,数据库中含有大量数据,全部显示在一个页面过于太多,所以我们需要采用分页技术,每一页显示不同数据。

主要解决问题方法:

1,我们必须需要确定每一页显示数目 pageSize=20

2,我们需要查询出共有多少条数据,sunNums

3,我们需要计算出需要一共有多少页 ----采用总数据/pageSize,还要判断是否整除的情况   sunNums/pageSize+(sunNums%pageSize==0?0:1)

4,我们需要从前台传过去的页面(pageNum),计算出需要显示数据从哪里开始(pageNum-1)*pageSize

5,我们需要将查询出的数据封装成一个list> ,然后存map,然后将map返回给前台。

PS:当然需要带搜索就需要改点参数:如从前台需要将查询的条件传到dao层,进行处理。这里采用 分层技术  前台----->servlet----->service------>dao

用到的数据库语句:

SELECT COUNT(*) FROM stud //查询共有多少数据

SELECT * FROM stud LIMIT 120,20 //从第120条数据开始,往后20条数据

核心代码:

核心代码主要是DAO数据层

简易版:不带搜索

Map map =new HashMap();

Integer pageSize=20;//每页显示的数目

String sql="select count(1) from stud";//执行这个sql语句得到所有的数据一共多少条

//这里采用c3p0的数据池(基础上自己添加了点功能,作出了 C3P0Utils),dbutils工具包含有(QueryRunnerle)

QueryRunner run =new QueryRunner(C3p0Utils.getDs());

String sumNum=""+run.query(sql, new ScalarHandler());//把数据封装成一行一列就是一个结果值,这里就不需要自己去处理,直接采用包里面

int sunNums=Integer.valueOf(sumNum);//所有的数据条数

//计算有多少页数据

int allPageNum=sunNums/pageSize+(sunNums%pageSize==0?0:1);

map.put("sumNum", allPageNum);//将一起有多少页存起来

sql="select * from stud limit "+(pageNum-1)*pageSize+","+pageSize;

//System.out.println(sql+"-----"+pageNum);

List> list=run.query(sql, new MapListHandler());

map.put("list", list);//添加到map中去

//System.out.println(list);

return map;

上面的代码只能实现简单的对数据进行分页,没有对其进行搜索,

效果:

0818b9ca8b590ca3270a3433284dd417.png

里面的上一页和下一页技术在servlet里面完成。

完整版:(带搜索)

在搜索中,我们从前台传过来的数据是封装一个值对象里面的。所以在后台只需要从值对象VO里面去取值就行了。

Map map =new HashMap();

Integer pagesize=20;

/*

* 这里是采用新技术,兼容查询部分和查询ALl的功能,因为从前台传过来的数据在这里可能会没有(前台没有输入),这里这种查询方式兼容所有的查询方式 */

String sql ="select count(*) from stud where 1=1 ";

String sql2="select * from stud where 1=1 ";//这样写1=1,可以和后面的条件想匹配

if(stud.getId()!=null&&stud.getId().trim().length()>0){

sql=sql+"And id like '%"+stud.getId()+"%'";

sql2= sql2+"and id like '%"+stud.getName()+"%'";//模糊查询

}

if(stud.getName()!=null&&stud.getName().trim().length()>0){

sql =sql+"and name like '%"+stud.getName()+"%'";

sql2 =sql2+"and name like '%"+stud.getName()+"%'";

}

QueryRunner run =new QueryRunner(C3p0Utils.getDs());//采用dbutils的查询功能包

String str="" +run.query(sql, new ScalarHandler());//获得所有的数据,一起共有多少条

int sumNum=Integer.valueOf(str);//转成int型

//需要计算一起有多少页

sumNum=sumNum/pagesize+((sumNum%pagesize)==0?0:1);

map.put("sumNum", sumNum);//将总页数传到前台

List> list=run.query(sql2 +" limit "+(pageNum-1)*pagesize+","+pagesize, new MapListHandler());

map.put("list", list);

return map;

台的技术就是这样子的,当我们数据传往前台,还需要在servlet处理页面显示问题,如上一页,下一页,页面自动移动。

Servlet的控制部分

servlet部分,需要控制页面的上一页,下一页,搜索之后,页面点击也是搜索的暖融融

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//注入

IstudService service=new ServiceDAO();

///必须接受从前台传过来的页面数,没有就赋值为1

response.setContentType("text/html;charset=utf-8");//从前台读取值可能会有中文,必须设置编码,可以采用filter,进行过滤

request.setCharacterEncoding("utf-8");

Integer pageNum=null;

Map map=new HashMap();

//从前台获得点击的页面数----第一次是没有数据的,默认设置为1

String num=request.getParameter("num");//没有写的就是空,赋值为1

if(num==null || num.trim().length()==0){

pageNum=1;

}else{

pageNum=Integer.valueOf(num);//否则就解析传进来的值

}

下面需要对提交方式进行区别,因为 表单提交的是需要带查询条件的,直接点击页码是在查询条件之下去数据库查询数据,是不一样的,必须区别:

Stud stud =new Stud();

/*

* 这里采用的技术 ,,超链接和表单提交是不同的两个方式,所以区分,当然这也是数据提交的时候需要

* 采用数据保存起来,供下一次使用

*/

if(request.getMethod().equalsIgnoreCase("get")){

stud=(Stud) request.getSession().getAttribute("stud");//要是点击的是超链接,直接获取session里面的值就可以了

}else{

String id=request.getParameter("id");

String name=request.getParameter("name");

stud.setId(id);

stud.setName(name);

request.getSession().setAttribute("stud", stud);//将数据到session里面存储起来,搜到结果之后,我们点击页码就不会调到其他页面

}

try {

map = service.query(pageNum,stud);

map.put("current", pageNum);//当前页存起来,但是前台读取不需要超链接

} catch (Exception e) {

e.printStackTrace();

}

下面就是对页面显示上一页,下一页的技术

//需要进行分页的分页,我们需要每一页显示多少,起始,和结束,然后点击之后的位置需要计算

int startPage=1;//起始位置

int endPage=10;//结束位置

int sizePage=10;//确定每一页显示多少

int sunNum=(Integer)(map.get("sumNum"));

/*

* 最重要的是-----以传过来的参数为主

* 首先要判断第一页是否能完全占满,没有沾满就把全部给endPage

* 要是一页占不了,就需要我们去开始设置 start和end,start=当前页加上一半,end等于start+sizePage,但是需要判断

* 是否超过了总页数的范围,接下来在进行赋值

*

*/

if(sunNum

endPage=sunNum;//防止总数少于10,就要重新赋值了

}else{

if(pageNum>((endPage-startPage)/2)){

startPage=pageNum-sizePage/2+1;

endPage=startPage+sizePage;

if(sunNum

endPage=sunNum;

}

}

}

map.put("start", startPage);

map.put("end", endPage);

最后就是封装好的数据传往前台:

request.setAttribute("result", map);

request.getRequestDispatcher("/jsps/show.jsp").forward(request, response);

前台页面

前台页面采用jstl来获取容器里面的数据

ID

NAME

${m.id} , ${m.name }


<上一页

${x}

${ x}

下一页>

效果图:

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

带条件查询:

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

具体的项目代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值