java 怎样分页存储数据到mysql数据库?

java 怎样分页存储数据到mysql数据库?,第1张

根据我的理解你的程序的主要作用是:

抓取另外一个网站的页面内容

解析后存储到自己的数据库里面

然后再在页面上显示刚刚抓取的数据

如果我的理解正确的话,你要做的是一个网站数据采集器,那么

分页存储的方法有两种:

方案A

在数据库找个表存储当前进行到的序号,比如现在网站上有1000个数据,有个字段可以标定数据的序号,就是网站文章的id(这个数据根据业务的不同要自己去寻找)

然后你读取对方网站的时候先把网站的html读取到java内存中,然后解析这些html,读出一个list列表

在对list列表遍历的时候,把文章的id跟数据库中存储的文章id比对,如果发现是已经存储过的文章id就不存储,如果是没存储过的再存储

在遍历的过程中记录下当前存储的文章数量,当达到一个指定的数量(你可以自己定义,比如是100个文章)的时候停止存储,并退出循环,然后把当前遍历到的文章id存储到数据库中

这样就实现了每次只存储指定的数量(比如100个文章)

方案B

如果你要抓取的网站也是分页的,那么你就每次抓取一页,并把当前抓取到的页数记录到数据库中

通过观察得出对方网站的不同页数据的url规律,比如发现他们网站第x页的数据总是根据 域名/具体的页面?page=x ,那么下次抓取的时候,从数据库读出上次抓取的页面数,然后加1

拼出新的页面的url,然后访问,再进行抓取

这样就实现了每次只存储一页数据

分页显示的方法:

使用mysql的 limit 语法:limit x,y ,代表从第x行开始读取 y 行数据

假定当前要翻到第page页,每页有row行数据,sql要这么写

select * from user limit ((page-1)*row),row

举个例子一页20条,第3页的写法

select * from user limit 40,20

给你一个非缓存分页类的简单例子吧(Page类可以视作javabean):

/**

* @author Administrator

*

*

* TODO 要更改此生成的类型注释的模板,请转至

* 窗口 - 首选项 - Java - 代码样式 - 代码模板

*/

import java.util.*

public class Pager {

private String PageUrl

private boolean hasNext

private boolean hasPrevious

private String previousPage

private String nextPage

private int offset

private int size

private int length

private int pagenumber

public Pager(int offset,int length, int size, String url){

this.offset=offset

this.length=length

this.size=size

int index=url.indexOf("&pager.offset")

if (index>-1){

this.PageUrl=url.substring(0,index)

}else{

this.PageUrl=url

}

}

public void setoffset(int offset){

this.offset=offset

}

public void setPagerUrl(String PagerUrl){

this.PageUrl=PagerUrl

}

public void setsize(int size){

this.size=size

}

public void setlength(int length){

this.length=length

}

public int getoffset(){

return this.offset

}

public String getPageUrl(){

return this.PageUrl

}

public boolean gethasNext(){

if((offset+1)*length>=size){

hasNext=false

}else{

hasNext=true

}

return hasNext

}

public boolean gethasPrevious(){

if(offset>=1){

this.hasPrevious=true

}else{

this.hasPrevious=false

}

return hasPrevious

}

public String getpreviousPage(){

this.previousPage=""

if (this.gethasPrevious()){

this.previousPage=this.PageUrl+"&pager.offset="+(offset-1)

}

return previousPage

}

public String getnextPage(){

this.nextPage=""

if(this.gethasNext()){

this.nextPage=this.PageUrl+"&pager.offset="+(offset+1)

}

return this.nextPage

}

public int getpagenumber(){

float temppn=(float)size/(float)length

pagenumber=new Float(temppn).intValue()

if (temppn>pagenumber){

this.pagenumber++

}

return this.pagenumber

}

public static ArrayList FindPageList(int offset,int length,List list){

ArrayList alist=new ArrayList()

for(int i=offset*lengthi<(offset*length+length)&&i<list.size()i++){

alist.add(list.get(i))

}

return alist

}

}

具体使用:

1、在servlet初始化这个page

List list=DataUtil.getSpecifiedList()//得到整个数据列表

int offset=0//便宜量

int length=10//每页数据记录数

String pageOffset=request.getParameter("pager.offset")

if(pageOffset==null||pageOffset.equals("")){

offset=0

}else{

offset=Integer.parseInt(pageOffset)

}

String Url=request.getRequestURL().toString()+"?"+request.getQueryString()

Pager pager=new Pager(offset,length,list.size(),Url)

List RsList=Pager.FindPageList(offset,length,list)

request.setAttribute("Pager",pager)

request.setAttribute("List",RsList)

RequestDispatcher dispatcher= request.getRequestDispatcher("/UI/someModule/list_display.jsp")

dispatcher.forward(request,response)

2、具体jsp中得到分页结果,并显示,并附页面跳转部分:

页面中得到分页结果

<%

List RpList=(List)request.getAttribute("List")

Pager pager=(Pager)request.getAttribute("Pager")

%>

<%--用for循环把RpList显示--%>

<!--页面跳转代码,这只是个形式,简化和改变方式的余地很大-->

<form name="pageForm"><%if(pager.gethasPrevious()){%><a href="<%= pager.getpreviousPage()%>">prev</a>

<%}%>

<%if( pager.gethasNext()){%><a href="<%=pager.getnextPage()%>">next</a><%}%><%if(pager.getpagenumber()>1) {%>第<select name="pager" onchange="window.location='<%=pager.getPageUrl()%>&pager.offset='+document.pageForm.pager.selectedIndex"><%for(int i=0i<pager.getpagenumber()i++){%><option value=<%=i%><%if(pager.getoffset()==i){ %>selected<%}%>><%=(i+1)%></option><%}%></select>页<%}%> 共<%=pager.getpagenumber()%>页</form>

ps:1、2两部分可以都放在页面类,不过你好像要MVC,所以给你这个代码。

是否可以解决您的问题?


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10869640.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-11
下一篇 2023-05-11

发表评论

登录后才能评论

评论列表(0条)

保存