兰色精灵 发表于 2015-1-18 11:19:56

JAVA编程:JSP分页手艺完成 利用工具类完成通用分...

市场分额,java比asp高一点,因为C#是仿照java开发的,所以哦C#能做的java都能做到,但是java能做的,C#不一定都能做到。毕竟是抄袭吗。js|分页今朝对照普遍利用的分页体例是将查询了局缓存在HttpSession或有形态bean中,翻页的时分从缓存中掏出一页数据显现。这类办法有两个次要的弱点:一是用户大概看到的是过时数据;二是假如数据量十分年夜时第一次查询遍历了局会议泯灭很长工夫,而且缓存的数据也会占用大批内存,效力分明下落。
  别的罕见的办法另有每次翻页都查询一次数据库,从ResultSet中只掏出一页数据(利用rs.last();rs.getRow()取得总计录条数,利用rs.absolute()定位到本页肇端纪录)。这类体例在某些数据库(如oracle)的JDBC完成中差未几也是必要遍历一切纪录,实行证实在纪录数很年夜时速率十分慢。
  至于缓存了局集ResultSet的办法则完整是一种毛病的做法。由于ResultSet在Statement或Connection封闭时也会被封闭,假如要使ResultSet无效必将长工夫占用数据库毗连。

  因而对照好的分页做法应当是每次翻页的时分只从数据库里检索页面巨细的块区的数据。如许固然每次翻页都必要查询数据库,但查询出的纪录数很少,收集传输数据量不年夜,假如利用毗连池更能够略过最耗时的创建数据库毗连历程。而在数据库端有各类成熟的优化手艺用于进步查询速率,比在使用服务器层做缓存无效多了。

  在oracle数据库中查询了局的行号利用伪列ROWNUM暗示(从1入手下手)。比方select*fromemployeewhererownum<10前往前10笔记录。但由于rownum是在查询以后排序之前赋值的,以是查询employee按birthday排序的第100到120笔记录应当这么写:
select*from(
selectmy_table.*,rownumasmy_rownumfrom(
selectname,birthdayfromemployeeorderbybirthday
)my_tablewhererownum<120
)wheremy_rownum>=100

  mySQL可使用LIMIT子句:
    selectname,birthdayfromemployeeorderbybirthdayLIMIT99,20
  DB2有rownumber()函数用于猎取以后行数。
  SQLServer没研讨过,能够参考这篇文章:http://www.csdn.net/develop/article/18/18627.shtm

  在Web程序平分页会被频仍利用,但分页的完成细节倒是编程过程当中对照贫苦的事变。年夜多分页显现的查询操纵都同时必要处置庞大的多重查询前提,sql语句必要静态拼接构成,再加上分页必要的纪录定位、总纪录条数查询和查询了局的遍历、封装和显现,程序会变得很庞大而且难以了解。因而必要一些工具类简化分页代码,使程序员专注于营业逻辑部分。上面是我计划的两个工具类:
  PagedStatement封装了数据库毗连、总纪录数查询、分页查询、了局数据封装和封闭数据库毗连等操纵,并利用了PreparedStatement撑持静态设置参数。
  RowSetPage参考PetStore的pagebypageiterator形式,计划RowSetPage用于封装查询了局(利用OracleCachedRowSet缓存查询出的一页数据,关于利用CachedRowSet封装数据库查询了局请参考JSP页面查询显现经常使用形式)和以后页码、总纪录条数、以后纪录数等信息,而且能够天生复杂的HTML分页代码。
  PagedStatement查询的了局封装成RowsetPage。

  上面是复杂的利用示例:


//DAO查询数据部分代码:

publicRowSetPagegetEmployee(Stringgender,intpageNo)throwsException{
Stringsql="selectemp_id,emp_code,user_name,real_namefromemployeewheregender=?";
//利用Oracle数据库的分页查询完成,每页显现5条
PagedStatementpst=newPagedStatementOracleImpl(sql,pageNo,5);
pst.setString(1,gender);
returnpst.executeQuery();
}


//Servlet处置查询哀求部分代码:


intpageNo;
try{
//能够经由过程参数pageno取得用户选择的页码
pageNo=Integer.parseInt(request.getParameter("pageno"));
}catch(Exceptionex){
//默许为第一页
pageNo=1;
}
Stringgender=request.getParameter("gender");
request.setAttribute("empPage",myBean.getEmployee(gender,pageNo));


//JSP显现部分代码
<%@pageimport="page.RowSetPage"%>

<scriptlanguage="javascript">
functiondoQuery(){
form1.actionType.value="doQuery";
form1.submit();
}
</script>

<formname=form1method=get>
<inputtype=hiddenname=actionType>
性别:
<inputtype=textname=gendersize=1value="<%=request.getParameter("gender")%>">
<inputtype=buttonvalue="查询">
<%
RowSetPageempPage=(RowSetPage)request.getAttribute("empPage");
if(empPage==null)empPage=RowSetPage.EMPTY_PAGE;
%>

<tablecellspacing="0"width="90%">
<tr><td>ID</td><td>代码</td><td>用户名</td><td>姓名</td></tr>
<%
javax.sql.RowSetempRS=(javax.sql.RowSet)empPage.getRowSet();
if(empRS!=null)while(empRS.next()){
%>
<tr>
<td><%=empRS.getString("EMP_ID")%></td>
<td><%=empRS.getString("EMP_CODE")%></td>
<td><%=empRS.getString("USER_NAME")%></td>
<td><%=empRS.getString("REAL_NAME")%></td>
</tr>
<%
}//endwhile
%>
<tr>
<%
//显现总页数和以后页数(pageno)和分页代码。
//此处doQuery为页面上提交查询举措的javascript函数名,pageno为标识以后页码的参数名
%>
<tdcolspan=4><%=empPage.getHTML("doQuery","pageno")%></td>
</tr>
</table>
</form>

  效果如图:

由于分页显现一样平常城市伴随查询前提和查询举措,页面应已有校验查询前提和提交查询的javascript办法(如下面的doQuery),以是RowSetPage.getHTML()天生的分页代码在用户选择新页码时间接回调后面的处置提交查询的javascript办法。注重在显现查询了局的时分前次的查询前提也必要坚持,如<inputtype=textname=gendersize=1value="<%=request.getParameter("gender")%>">。同时因为页码的参数名能够指定,因而也撑持在统一页面中有多个分页区。
  另外一种分页代码完成是天生每页的URL,将查询参数和页码作为QueryString附在URL前面。这类办法的缺点是在查询前提对照庞大时难以处置,而且必要指定处置查询举措的servlet,大概不合适某些定制的查询操纵。
  假如对RowSetPage.getHTML()天生的默许分页代码不中意能够编写本人的分页处置代码,RowSetPage供应了良多getter办法用于猎取相干信息(如以后页码、总页数、总纪录数和以后纪录数等)。
  在实践使用中能够将分页查询和显现做成jsptaglib,进一步简化JSP代码,屏障JavaCode。

附:分页工具类的源代码,有正文,应当很简单了解。

1.Page.java
2.RowSetPage.java(RowSetPage承继Page)
3.PagedStatement.java
4.PagedStatementOracleImpl.java(PagedStatementOracleImpl承继PagedStatement)



您能够恣意利用这些源代码,但必需保存authorevan_zhao@hotmail.com字样


///////////////////////////////////
//
//Page.java
//author:evan_zhao@hotmail.com
//
///////////////////////////////////

packagepage;

importjava.util.List;
importjava.util.ArrayList;
importjava.util.Collection;
importjava.util.Collections;


/**
*Title:分页对象<br>
*Description:用于包括数据及分页信息的对象<br>
*Page类完成了用于显现分页信息的基础办法,但未指定所含数据的范例,
*可依据必要完成以特定体例构造数据的子类,<br>
*如RowSetPage以RowSet封装数据,ListPage以List封装数据<br>
*Copyright:Copyright(c)2002<br>
*@authorevan_zhao@hotmail.com<br>
*@version1.0
*/
publicclassPageimplementsjava.io.Serializable{
publicstaticfinalPageEMPTY_PAGE=newPage();
publicstaticfinalintDEFAULT_PAGE_SIZE=20;
publicstaticfinalintMAX_PAGE_SIZE=9999;

privateintmyPageSize=DEFAULT_PAGE_SIZE;

privateintstart;
privateintavaCount,totalSize;
privateObjectdata;

privateintcurrentPageno;
privateinttotalPageCount;

/**
*默许机关办法,只机关空页
*/
protectedPage(){
this.init(0,0,0,DEFAULT_PAGE_SIZE,newObject());
}

/**
*分页数据初始办法,由子类挪用
*@paramstart本页数据在数据库中的肇端地位
*@paramavaCount本页包括的数据条数
*@paramtotalSize数据库中总纪录条数
*@parampageSize本页容量
*@paramdata本页包括的数据
*/
protectedvoidinit(intstart,intavaCount,inttotalSize,intpageSize,Objectdata){

this.avaCount=avaCount;
this.myPageSize=pageSize;

this.start=start;
this.totalSize=totalSize;

this.data=data;

//System.out.println("avaCount:"+avaCount);
//System.out.println("totalSize:"+totalSize);
if(avaCount>totalSize){
//thrownewRuntimeException("纪录条数年夜于总条数?!");
}

this.currentPageno=(start-1)/pageSize+1;
this.totalPageCount=(totalSize+pageSize-1)/pageSize;

if(totalSize==0&&avaCount==0){
this.currentPageno=1;
this.totalPageCount=1;
}
//System.out.println("StartIndextoPageNo:"+start+"-"+currentPageno);
}

publicObjectgetData(){
returnthis.data;
}

/**
*取本页数据容量(本页能包括的纪录数)
*@return本页能包括的纪录数
*/
publicintgetPageSize(){
returnthis.myPageSize;
}

/**
*是不是有下一页
*@return是不是有下一页
*/
publicbooleanhas下一页:把持字符串的超长部分用省略号暗示(){
/*
if(avaCount==0&&totalSize==0){
returnfalse;
}
return(start+avaCount-1)<totalSize;
*/
return(this.getCurrentPageNo()<this.getTotalPageCount());
}

/**
*是不是有上一页
*@return是不是有上一页
*/
publicbooleanhasPreviousPage(){
/*
returnstart>1;
*/
return(this.getCurrentPageNo()>1);
}

/**
*猎取以后页第一条数据在数据库中的地位
*@return
*/
publicintgetStart(){
returnstart;
}

/**
*猎取以后页最初一条数据在数据库中的地位
*@return
*/
publicintgetEnd(){
intend=this.getStart()+this.getSize()-1;
if(end<0){
end=0;
}
returnend;
}

/**
*猎取上一页第一条数据在数据库中的地位
*@return纪录对应的rownum
*/
publicintgetStartOfPreviousPage(){
returnMath.max(start-myPageSize,1);
}


/**
*猎取下一页第一条数据在数据库中的地位
*@return纪录对应的rownum
*/
publicintgetStartOf下一页:把持字符串的超长部分用省略号暗示(){
returnstart+avaCount;
}

/**
*猎取任一页第一条数据在数据库中的地位,每页条数利用默许值
*@parampageNo页号
*@return纪录对应的rownum
*/
publicstaticintgetStartOfAnyPage(intpageNo){
returngetStartOfAnyPage(pageNo,DEFAULT_PAGE_SIZE);
}

/**
*猎取任一页第一条数据在数据库中的地位
*@parampageNo页号
*@parampageSize每页包括的纪录数
*@return纪录对应的rownum
*/
publicstaticintgetStartOfAnyPage(intpageNo,intpageSize){
intstartIndex=(pageNo-1)*pageSize+1;
if(startIndex<1)startIndex=1;
//System.out.println("PageNotoStartIndex:"+pageNo+"-"+startIndex);
returnstartIndex;
}

/**
*取本页包括的纪录数
*@return本页包括的纪录数
*/
publicintgetSize(){
returnavaCount;
}

/**
*取数据库中包括的总纪录数
*@return数据库中包括的总纪录数
*/
publicintgetTotalSize(){
returnthis.totalSize;
}

/**
*取以后页码
*@return以后页码
*/
publicintgetCurrentPageNo(){
returnthis.currentPageno;
}

/**
*取总页码
*@return总页码
*/
publicintgetTotalPageCount(){
returnthis.totalPageCount;
}


/**
*
*@paramqueryJSFunctionName完成分页的JS剧本名字,页码变化时会主动回调该办法
*@parampageNoParamName页码参数称号
*@return
*/
publicStringgetHTML(StringqueryJSFunctionName,StringpageNoParamName){
if(getTotalPageCount()<1){
return"<inputtype=hiddenname="+pageNoParamName+"value=1>";
}
if(queryJSFunctionName==null||queryJSFunctionName.trim().length()<1){
queryJSFunctionName="gotoPage";
}
if(pageNoParamName==null||pageNoParamName.trim().length()<1){
pageNoParamName="pageno";
}

StringgotoPage="_"+queryJSFunctionName;

StringBufferhtml=newStringBuffer("
");
html.append("<scriptlanguage="Javascript1.2">
")
.append("function").append(gotoPage).append("(pageNo){
")
.append("varcurPage=1;
")
.append("try{curPage=document.all["")
.append(pageNoParamName).append(""].value;
")
.append("document.all["").append(pageNoParamName)
.append(""].value=pageNo;
")
.append("").append(queryJSFunctionName).append("(pageNo);
")
.append("returntrue;
")
.append("}catch(e){
")
//.append("try{
")
//.append("document.forms.submit();
")
//.append("}catch(e){
")
.append("alert(还没有界说查询办法:function")
.append(queryJSFunctionName).append("());
")
.append("document.all["").append(pageNoParamName)
.append(""].value=curPage;
")
.append("returnfalse;
")
//.append("}
")
.append("}
")
.append("}")
.append("</script>
")
.append("");
html.append("<tableborder=0cellspacing=0cellpadding=0align=centerwidth=80%>
")
.append("<tr>
")
.append("<tdalign=left><br>
");
html.append("共").append(getTotalPageCount()).append("页")
.append("[").append(getStart()).append("..").append(getEnd())
.append("/").append(this.getTotalSize()).append("]
")
.append("</td>
")
.append("<tdalign=right>
");
if(hasPreviousPage()){
html.append("[<ahref=javascript:").append(gotoPage)
.append("(").append(getCurrentPageNo()-1)
.append(")>上一页</a>]
");
}
html.append("第")
.append("<selectname=")
.append(pageNoParamName).append("onChange=javascript:")
.append(gotoPage).append("(this.value)>
");
Stringselected="selected";
for(inti=1;i<=getTotalPageCount();i++){
if(i==getCurrentPageNo())
selected="selected";
elseselected="";
html.append("<optionvalue=").append(i).append("")
.append(selected).append(">").append(i).append("</option>
");
}
if(getCurrentPageNo()>getTotalPageCount()){
html.append("<optionvalue=").append(getCurrentPageNo())
.append("selected>").append(getCurrentPageNo())
.append("</option>
");
}
html.append("</select>页
");
if(has下一页:把持字符串的超长部分用省略号暗示()){
html.append("[<ahref=javascript:").append(gotoPage)
.append("(").append((getCurrentPageNo()+1))
.append(")>下一页</a>]
");
}
html.append("</td></tr></table>
");

returnhtml.toString();

}
}




///////////////////////////////////
//
//RowSetPage.java
//author:evan_zhao@hotmail.com
//
///////////////////////////////////
packagepage;

importjavax.sql.RowSet;


/**
*<p>Title:RowSetPage</p>
*<p>Description:利用RowSet封装数据的分页对象</p>
*<p>Copyright:Copyright(c)2003</p>
*@authorevan_zhao@hotmail.com
*@version1.0
*/

publicclassRowSetPageextendsPage{
privatejavax.sql.RowSetrs;

/**
*空页
*/
publicstaticfinalRowSetPageEMPTY_PAGE=newRowSetPage();

/**
*默许机关办法,创立空页
*/
publicRowSetPage(){
this(null,0,0);
}

/**
*机关分页对象
*@paramcrs包括一页数据的OracleCachedRowSet
*@paramstart该页数据在数据库中的肇端地位
*@paramtotalSize数据库中包括的纪录总数
*/
publicRowSetPage(RowSetcrs,intstart,inttotalSize){
this(crs,start,totalSize,Page.DEFAULT_PAGE_SIZE);
}

/**
*机关分页对象
*@paramcrs包括一页数据的OracleCachedRowSet
*@paramstart该页数据在数据库中的肇端地位
*@paramtotalSize数据库中包括的纪录总数
*@pageSize本页能包容的纪录数
*/
publicRowSetPage(RowSetcrs,intstart,inttotalSize,intpageSize){
try{
intavaCount=0;
if(crs!=null){
crs.beforeFirst();
if(crs.next()){
crs.last();
avaCount=crs.getRow();
}
crs.beforeFirst();
}
rs=crs;
super.init(start,avaCount,totalSize,pageSize,rs);
}catch(java.sql.SQLExceptionsqle){
thrownewRuntimeException(sqle.toString());
}
}

/**
*取分页对象中的纪录数据
*/
publicjavax.sql.RowSetgetRowSet(){
returnrs;
}


}




///////////////////////////////////
//
//PagedStatement.java
//author:evan_zhao@hotmail.com
//
///////////////////////////////////

packagepage;

importfoo.DBUtil;

importjava.math.BigDecimal;
importjava.util.List;
importjava.util.Iterator;
importjava.util.Collections;

importjava.sql.Connection;
importjava.sql.SQLException;
importjava.sql.ResultSet;
importjava.sql.Statement;
importjava.sql.PreparedStatement;
importjava.sql.Timestamp;
importjavax.sql.RowSet;

/**
*<p>Title:分页查询</p>
*<p>Description:依据查询语句和页码查询出当页数据</p>
*<p>Copyright:Copyright(c)2002</p>
*@authorevan_zhao@hotmail.com
*@version1.0
*/
publicabstractclassPagedStatement{
publicfinalstaticintMAX_PAGE_SIZE=Page.MAX_PAGE_SIZE;

protectedStringcountSQL,querySQL;
protectedintpageNo,pageSize,startIndex,totalCount;
protectedjavax.sql.RowSetrowSet;
protectedRowSetPagerowSetPage;

privateListboundParams;

/**
*机关一查询出一切数据的PageStatement
*@paramsqlquerysql
*/
publicPagedStatement(Stringsql){
this(sql,1,MAX_PAGE_SIZE);
}


/**
*机关一查询出当页数据的PageStatement
*@paramsqlquerysql
*@parampageNo页码
*/
publicPagedStatement(Stringsql,intpageNo){
this(sql,pageNo,Page.DEFAULT_PAGE_SIZE);
}

/**
*机关一查询出当页数据的PageStatement,并指定每页显现纪录条数
*@paramsqlquerysql
*@parampageNo页码
*@parampageSize每页容量
*/
publicPagedStatement(Stringsql,intpageNo,intpageSize){
this.pageNo=pageNo;
this.pageSize=pageSize;
this.startIndex=Page.getStartOfAnyPage(pageNo,pageSize);
this.boundParams=Collections.synchronizedList(newjava.util.LinkedList());

this.countSQL="selectcount(*)from("+sql+")";
this.querySQL=intiQuerySQL(sql,this.startIndex,pageSize);
}


/**
*天生查询一页数据的sql语句
*@paramsql原查询语句
*@startIndex入手下手纪录地位
*@size必要猎取的纪录数
*/
protectedabstractStringintiQuerySQL(Stringsql,intstartIndex,intsize);


/**
*利用给出的对象设置指定参数的值
*@paramindex第一个参数为1,第二个为2,。。。
*@paramobj包括参数值的对象
*/
publicvoidsetObject(intindex,Objectobj)throwsSQLException{
BoundParambp=newBoundParam(index,obj);
boundParams.remove(bp);
boundParams.add(bp);
}

/**
*利用给出的对象设置指定参数的值
*@paramindex第一个参数为1,第二个为2,。。。
*@paramobj包括参数值的对象
*@paramtargetSqlType参数的数据库范例
*/
publicvoidsetObject(intindex,Objectobj,inttargetSqlType)throwsSQLException{
BoundParambp=newBoundParam(index,obj,targetSqlType);
boundParams.remove(bp);
boundParams.add(bp);
}

/**
*利用给出的对象设置指定参数的值
*@paramindex第一个参数为1,第二个为2,。。。
*@paramobj包括参数值的对象
*@paramtargetSqlType参数的数据库范例(常量界说在java.sql.Types中)
*@paramscale精度,小数点后的位数
*(只对targetSqlType是Types.NUMBER或Types.DECIMAL无效,别的范例则疏忽)
*/
publicvoidsetObject(intindex,Objectobj,inttargetSqlType,intscale)throwsSQLException{
BoundParambp=newBoundParam(index,obj,targetSqlType,scale);
boundParams.remove(bp);
boundParams.add(bp);
}

/**
*利用给出的字符串设置指定参数的值
*@paramindex第一个参数为1,第二个为2,。。。
*@paramstr包括参数值的字符串
*/
publicvoidsetString(intindex,Stringstr)throwsSQLException{
BoundParambp=newBoundParam(index,str);
boundParams.remove(bp);
boundParams.add(bp);
}

/**
*利用给出的字符串设置指定参数的值
*@paramindex第一个参数为1,第二个为2,。。。
*@paramtimestamp包括参数值的工夫戳
*/
publicvoidsetTimestamp(intindex,Timestamptimestamp)throwsSQLException{
BoundParambp=newBoundParam(index,timestamp);
boundParams.remove(bp);
boundParams.add(bp);
}

/**
*利用给出的整数设置指定参数的值
*@paramindex第一个参数为1,第二个为2,。。。
*@paramvalue包括参数值的整数
*/
publicvoidsetInt(intindex,intvalue)throwsSQLException{
BoundParambp=newBoundParam(index,newInteger(value));
boundParams.remove(bp);
boundParams.add(bp);
}

/**
*利用给出的长整数设置指定参数的值
*@paramindex第一个参数为1,第二个为2,。。。
*@paramvalue包括参数值的长整数
*/
publicvoidsetLong(intindex,longvalue)throwsSQLException{
BoundParambp=newBoundParam(index,newLong(value));
boundParams.remove(bp);
boundParams.add(bp);
}

/**
*利用给出的双精度浮点数设置指定参数的值
*@paramindex第一个参数为1,第二个为2,。。。
*@paramvalue包括参数值的双精度浮点数
*/
publicvoidsetDouble(intindex,doublevalue)throwsSQLException{
BoundParambp=newBoundParam(index,newDouble(value));
boundParams.remove(bp);
boundParams.add(bp);
}

/**
*利用给出的BigDecimal设置指定参数的值
*@paramindex第一个参数为1,第二个为2,。。。
*@parambd包括参数值的BigDecimal
*/
publicvoidsetBigDecimal(intindex,BigDecimalbd)throwsSQLException{
BoundParambp=newBoundParam(index,bd);
boundParams.remove(bp);
boundParams.add(bp);
}

privatevoidsetParams(PreparedStatementpst)throwsSQLException{
if(pst==null||this.boundParams==null||this.boundParams.size()==0)return;
BoundParamparam;
for(Iteratoritr=this.boundParams.iterator();itr.hasNext();){
param=(BoundParam)itr.next();
if(param==null)continue;
if(param.sqlType==java.sql.Types.OTHER){
pst.setObject(param.index,param.value);
}else{
pst.setObject(param.index,param.value,param.sqlType,param.scale);
}
}
}



/**
*实行查询获得一页数据,实行停止后封闭数据库毗连
*@returnRowSetPage
*@throwsSQLException
*/
publicRowSetPageexecuteQuery()throwsSQLException{
System.out.println("executeQueryUsingPreparedStatement");
Connectionconn=DBUtil.getConnection();
PreparedStatementpst=null;
ResultSetrs=null;
try{
pst=conn.prepareStatement(this.countSQL);
setParams(pst);
rs=pst.executeQuery();
if(rs.next()){
totalCount=rs.getInt(1);
}else{
totalCount=0;
}

rs.close();
pst.close();

if(totalCount<1)returnRowSetPage.EMPTY_PAGE;

pst=conn.prepareStatement(this.querySQL);
System.out.println(querySQL);
pst.setFetchSize(this.pageSize);
setParams(pst);
rs=pst.executeQuery();
//rs.setFetchSize(pageSize);

this.rowSet=populate(rs);

rs.close();
rs=null;
pst.close();
pst=null;

this.rowSetPage=newRowSetPage(this.rowSet,startIndex,totalCount,pageSize);
returnthis.rowSetPage;
}catch(SQLExceptionsqle){
//System.out.println("executeQuerySQLException");
sqle.printStackTrace();
throwsqle;
}catch(Exceptione){
e.printStackTrace();
thrownewRuntimeException(e.toString());
}finally{
//System.out.println("executeQueryfinally");
DBUtil.close(rs,pst,conn);
}
}

/**
*将ResultSet数据添补进CachedRowSet
*/
protectedabstractRowSetpopulate(ResultSetrs)throwsSQLException;

/**
*取封装成RowSet查询了局
*@returnRowSet
*/
publicjavax.sql.RowSetgetRowSet(){
returnthis.rowSet;
}


/**
*取封装成RowSetPage的查询了局
*@returnRowSetPage
*/
publicRowSetPagegetRowSetPage(){
returnthis.rowSetPage;
}



/**
*封闭数据库毗连
*/
publicvoidclose(){
//由于数据库毗连在查询停止或产生非常时即封闭,此处不做任何事变
//留待扩大。
}



privateclassBoundParam{
intindex;
Objectvalue;
intsqlType;
intscale;

publicBoundParam(intindex,Objectvalue){
this(index,value,java.sql.Types.OTHER);
}

publicBoundParam(intindex,Objectvalue,intsqlType){
this(index,value,sqlType,0);
}

publicBoundParam(intindex,Objectvalue,intsqlType,intscale){
this.index=index;
this.value=value;
this.sqlType=sqlType;
this.scale=scale;
}

publicbooleanequals(Objectobj){
if(obj!=null&&this.getClass().isInstance(obj)){
BoundParambp=(BoundParam)obj;
if(this.index==bp.index)returntrue;
}
returnfalse;
}
}

}


///////////////////////////////////
//
//PagedStatementOracleImpl.java
//author:evan_zhao@hotmail.com
//
///////////////////////////////////
packagepage;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjavax.sql.RowSet;
importoracle.jdbc.rowset.OracleCachedRowSet;

/**
*<p>Title:分页查询Oracle数据库完成</p>
*<p>Copyright:Copyright(c)2002</p>
*@authorevan_zhao@hotmail.com
*@version1.0
*/
publicclassPagedStatementOracleImplextendsPagedStatement{

/**
*机关一查询出一切数据的PageStatement
*@paramsqlquerysql
*/
publicPagedStatementOracleImpl(Stringsql){
super(sql);
}


/**
*机关一查询出当页数据的PageStatement
*@paramsqlquerysql
*@parampageNo页码
*/
publicPagedStatementOracleImpl(Stringsql,intpageNo){
super(sql,pageNo);
}

/**
*机关一查询出当页数据的PageStatement,并指定每页显现纪录条数
*@paramsqlquerysql
*@parampageNo页码
*@parampageSize每页容量
*/
publicPagedStatementOracleImpl(Stringsql,intpageNo,intpageSize){
super(sql,pageNo,pageSize);
}


/**
*天生查询一页数据的sql语句
*@paramsql原查询语句
*@startIndex入手下手纪录地位
*@size必要猎取的纪录数
*/
protectedStringintiQuerySQL(Stringsql,intstartIndex,intsize){
StringBufferquerySQL=newStringBuffer();
if(size!=super.MAX_PAGE_SIZE){
querySQL.append("select*from(selectmy_table.*,rownumasmy_rownumfrom(")
.append(sql)
.append(")my_tablewhererownum<").append(startIndex+size)
.append(")wheremy_rownum>=").append(startIndex);
}else{
querySQL.append("select*from(selectmy_table.*,rownumasmy_rownumfrom(")
.append(sql)
.append(")my_table")
.append(")wheremy_rownum>=").append(startIndex);
}
returnquerySQL.toString();
}

/**
*将ResultSet数据添补进CachedRowSet
*/
protectedRowSetpopulate(ResultSetrs)throwsSQLException{
OracleCachedRowSetocrs=newOracleCachedRowSet();
ocrs.populate(rs);
returnocrs;
}

}
C#是盗用了Java的源代码,仿照开发的,原因是Java是开源的啊,盗了也白盗,还有一点,开发C#语言的团队是就是开发Java语言的团队,是微软重金挖过去的啊

山那边是海 发表于 2015-1-19 08:26:29

Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。

小妖女 发表于 2015-1-24 11:26:31

是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言

变相怪杰 发表于 2015-1-29 06:28:46

Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台

灵魂腐蚀 发表于 2015-1-31 18:36:16

关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。

活着的死人 发表于 2015-2-6 20:55:17

有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)

兰色精灵 发表于 2015-2-9 16:46:17

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

深爱那片海 发表于 2015-2-10 11:39:39

Java 编程语言的风格十分接近C、C++语言。

小魔女 发表于 2015-2-28 11:00:09

《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。

精灵巫婆 发表于 2015-3-7 22:37:58

另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。

若相依 发表于 2015-3-15 15:18:34

多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

飘灵儿 发表于 2015-3-22 01:33:32

是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
页: [1]
查看完整版本: JAVA编程:JSP分页手艺完成 利用工具类完成通用分...