|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
市场分额,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笔记录应当这么写:
[pre]select*from(
selectmy_table.*,rownumasmy_rownumfrom(
selectname,birthdayfromemployeeorderbybirthday
)my_tablewhererownum<120
)wheremy_rownum>=100
[/pre]
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[0].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语言的团队,是微软重金挖过去的啊 |
|