Oracle下的Java分页功能_动力节点Java学院整理
就如平时我们很在分页中看到的,分页的时候返回的不仅包括查询的结果集(List),而且还包括总的页数(pageNum)、当前第几页(pageNo)等等信息,所以我们封装一个查询结果PageModel类,代码如下:
packagecom.bjpowernode.test; importjava.util.List; publicclassPageModel{ privateList list; privateintpageNo; privateintpageSize; privateinttotalNum; privateinttotalPage; publicList getList(){ returnlist; } publicvoidsetList(List list){ this.list=list; } publicintgetPageNo(){ returnpageNo; } publicvoidsetPageNo(intpageNo){ this.pageNo=pageNo; } publicintgetPageSize(){ returnpageSize; } publicvoidsetPageSize(intpageSize){ this.pageSize=pageSize; } publicintgetTotalNum(){ returntotalNum; } publicvoidsetTotalNum(inttotalNum){ this.totalNum=totalNum; setTotalPage((getTotalNum()%pageSize)==0?(getTotalNum()/pageSize) :(getTotalNum()/pageSize+1)); } publicintgetTotalPage(){ returntotalPage; } publicvoidsetTotalPage(inttotalPage){ this.totalPage=totalPage; } //获取第一页 publicintgetFirstPage(){ return1; } //获取最后页 publicintgetLastPage(){ returntotalPage; } //获取前页 publicintgetPrePage(){ if(pageNo>1) returnpageNo-1; return1; } //获取后页 publicintgetBackPage(){ if(pageNo 其中使用泛型是为了能使的该分页类能进行重用,比如在查询用户时可以封装User对象、在查询财务中的流向单时可以封装流向单FlowCard类。
我们以查询用户为例,用户选择查询条件,首先调用Servlet获取查询参数,然后请求业务逻辑层取得分页封装结果类。业务逻辑调用Dao层取得结果集、取得中记录数封装成分页类。最后Servlet将结果设置到jsp页面显示。
首先来讲解Servlet,代码如下:
packagecom.bjpowernode.test; importjava.io.*; importjava.util.*; importjavax.servlet.ServletConfig; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importkane.UserInfo; importkane.UserInfoManage; importkane.PageModel; publicclassUserBasicSearchServletextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L; privateintpageSize=0; @Override publicvoidinit(ServletConfigconfig)throwsServletException{ pageSize=Integer.parseInt(config.getInitParameter("pageSize")); } @Override protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp) throwsServletException,IOException{ doPost(req,resp); } @Override protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp) throwsServletException,IOException{ //1.取得页面参数并构造参数对象 intpageNo=Integer.parseInt(req.getParameter("pageNo")); Stringsex=req.getParameter("gender"); Stringhome=req.getParameter("newlocation"); Stringcolleage=req.getParameter("colleage"); Stringcomingyear=req.getParameter("ComingYear"); UserInfou=newUserInfo(); u.setSex(sex); u.setHome(home); u.setColleage(colleage); u.setCy(comingyear); //2.调用业务逻辑取得结果集 UserInfoManageuserInfoManage=newUserInfoManage(); PageModelpagination=userInfoManage.userBasicSearch(u, pageNo,pageSize); List userList=pagination.getList(); //3.封装返回结果 StringBufferresultXML=newStringBuffer(); try{ resultXML.append("/n"); resultXML.append(" /n"); for(Iterator /n"); }catch(Exceptione){ e.printStackTrace(); } writeResponse(req,resp,resultXML.toString()); } publicvoidwriteResponse(HttpServletRequestrequest, HttpServletResponseresponse,Stringresult)throwsIOException{ response.setContentType("text/xml"); response.setHeader("Cache-Control","no-cache"); response.setHeader("Content-Type","text/xml;charset=gb18030"); PrintWriterpw=response.getWriter(); pw.write(result); pw.close(); } }iterator=userList.iterator();iterator .hasNext();){ UserInfouserInfo=iterator.next(); resultXML.append("/n"); resultXML.append("/t "+userInfo.getId()+" /n"); resultXML.append("/t"+userInfo.getTruename() +" /n"); resultXML.append("/t"+userInfo.getSex()+" /n"); resultXML.append("/t"+userInfo.getHome()+" /n"); resultXML.append("/n"); } resultXML.append("/n"); resultXML.append("/t /n"); resultXML.append(""+pagination.getTotalPage() +" /n"); resultXML.append("/t"+pagination.getFirstPage() +" /n"); resultXML.append("/t"+pagination.getLastPage()+" /n"); resultXML.append("/t"+pagination.getPageNo() +" /n"); resultXML.append("其中User对象代码如下:
packagecom.bjpowernode.test; importjava.util.Date; publicclassUserInfo{ privateintid; privateStringusername; privateStringpassword; privateStringtruename; privateStringsex; privateDatebirthday; privateStringhome; privateStringcolleage; privateStringcomingYear; publicintgetId(){ returnid; } publicvoidsetId(intid){ this.id=id; } publicStringgetUsername(){ returnusername; } publicvoidsetUsername(Stringusername){ this.username=username; } publicStringgetPassword(){ returnpassword; } publicvoidsetPassword(Stringpassword){ this.password=password; } publicStringgetTruename(){ returntruename; } publicvoidsetTruename(Stringtruename){ this.truename=truename; } publicStringgetSex(){ returnsex; } publicvoidsetSex(Stringsex){ this.sex=sex; } publicDategetBirthday(){ returnbirthday; } publicvoidsetBirthday(Datebirthday){ this.birthday=birthday; } publicStringgetHome(){ returnhome; } publicvoidsetHome(Stringhome){ this.home=home; } publicStringgetColleage(){ returncolleage; } publicvoidsetColleage(Stringcolleage){ this.colleage=colleage; } publicStringgetCy(){ returncomingYear; } publicvoidsetCy(Stringcy){ this.comingYear=cy; } }接着是业务逻辑层代码,代码如下:
packagecom.bjpowernode.test; importjava.sql.Connection; importkane.DBUtility; importkane.PageModel; publicclassUserInfoManage{ privateUserInfoDaouserInfoDao=null; publicUserInfoManage(){ userInfoDao=newUserInfoDao(); } publicPageModeluserBasicSearch(UserInfou,intpageNo, intpageSize)throwsException{ Connectionconnection=null; PageModel pagination=newPageModel (); try{ connection=DBUtility.getConnection(); DBUtility.setAutoCommit(connection,false); pagination.setList(userInfoDao.getUserList(u,pageNo,pageSize)); pagination.setPageNo(pageNo); pagination.setPageSize(pageSize); pagination.setTotalNum(userInfoDao.getTotalNum(u)); DBUtility.commit(connection); }catch(Exceptione){ DBUtility.rollBack(connection); e.printStackTrace(); thrownewException(); }finally{ DBUtility.closeConnection(); } returnpagination; } } 其中DBUtility为数据库的连接封装类。
最后是Dao层代码实现,代码如下:
packagecom.bjpowernode.test; importjava.sql.Connection; importjava.sql.PreparedStatement; importjava.sql.ResultSet; importjava.sql.SQLException; importjava.util.ArrayList; importjava.util.List; importkane.UserInfo; importkane.DBUtility; publicclassUserInfoDao{ publicListgetUserList(UserInfouserInfo,intpageNo, intpageSize)throwsException{ PreparedStatementpstmt=null; ResultSetrs=null; List userList=null; try{ Stringsql="select*from(selectrownumnum,u.*from(select*fromuser_infowheresex=?andhomelike'" +userInfo.getHome() +"%" +"'andcolleagelike'" +userInfo.getColleage() +"%" +"'andcomingyearlike'" +userInfo.getCy() +"%" +"'orderbyid)uwhererownum<=?)wherenum>=?"; userList=newArrayList (); Connectionconn=DBUtility.getConnection(); pstmt=conn.prepareStatement(sql); pstmt.setString(1,userInfo.getSex()); pstmt.setInt(2,pageNo*pageSize); pstmt.setInt(3,(pageNo-1)*pageSize+1); rs=pstmt.executeQuery(); while(rs.next()){ UserInfouser=newUserInfo(); user.setId(rs.getInt("id")); user.setTruename(rs.getString("truename")); user.setSex(rs.getString("sex")); user.setHome(rs.getString("home")); userList.add(user); } }catch(SQLExceptione){ e.printStackTrace(); thrownewException(e); }finally{ DBUtility.closeResultSet(rs); DBUtility.closePreparedStatement(pstmt); } returnuserList; } publicintgetTotalNum(UserInfouserInfo)throwsException{ PreparedStatementpstmt=null; ResultSetrs=null; intcount=0; try{ Stringsql="selectcount(*)fromuser_infowheresex=?andhomelike'" +userInfo.getHome() +"%" +"'andcolleagelike'" +userInfo.getColleage() +"%" +"'andcomingyearlike'" +userInfo.getCy()+"%"+"'"; Connectionconn=DBUtility.getConnection(); pstmt=conn.prepareStatement(sql); pstmt.setString(1,userInfo.getSex()); rs=pstmt.executeQuery(); if(rs.next()){ count=rs.getInt(1); } }catch(SQLExceptione){ e.printStackTrace(); thrownewException(e); }finally{ DBUtility.closeResultSet(rs); DBUtility.closePreparedStatement(pstmt); } returncount; } } 最后就是servlet将得到的结果返回给jsp页面显示出来。
注:其中DBUtility代码是封装数据库连接操作的代码,如下:
1.packagecom.bjpowernode.test;
importjava.sql.Connection; importjava.sql.DriverManager; importjava.sql.PreparedStatement; importjava.sql.ResultSet; importjava.sql.SQLException; publicclassDBUtility{ privatestaticThreadLocalthreadLocal=newThreadLocal (); publicstaticConnectiongetConnection(){ Connectionconn=null; conn=threadLocal.get(); if(conn==null){ try{ Class.forName("oracle.jdbc.driver.OracleDriver"); conn=DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:oracle","admin", "admin"); threadLocal.set(conn); }catch(ClassNotFoundExceptione){ e.printStackTrace(); }catch(SQLExceptione){ e.printStackTrace(); } } returnconn; } //封装设置Connection自动提交 publicstaticvoidsetAutoCommit(Connectionconn,Booleanflag){ try{ conn.setAutoCommit(flag); }catch(SQLExceptione){ e.printStackTrace(); } } //设置事务提交 publicstaticvoidcommit(Connectionconn){ try{ conn.commit(); }catch(SQLExceptione){ e.printStackTrace(); } } //封装设置Connection回滚 publicstaticvoidrollBack(Connectionconn){ try{ conn.rollback(); }catch(SQLExceptione){ e.printStackTrace(); } } //封装关闭Connection、PreparedStatement、ResultSet的函数 publicstaticvoidcloseConnection(){ Connectionconn=threadLocal.get(); try{ if(conn!=null){ conn.close(); conn=null; threadLocal.remove(); } }catch(SQLExceptione){ e.printStackTrace(); } } publicstaticvoidclosePreparedStatement(PreparedStatementpstmt){ try{ if(pstmt!=null){ pstmt.close(); pstmt=null; } }catch(SQLExceptione){ e.printStackTrace(); } } publicstaticvoidcloseResultSet(ResultSetrs){ try{ if(rs!=null){ rs.close(); rs=null; } }catch(SQLExceptione){ e.printStackTrace(); } } } 使用ThreadLocal是为了保证事务的一致,使得同一个线程的所有数据库操作使用同一个Connection。
到此一个简单的代码实现就完成了。
总结
以上所述是小编给大家介绍的Oracle下的Java分页功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!