Oracle中Java分页功能有哪些

57次阅读
没有评论

共计 11004 个字符,预计需要花费 28 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下 Oracle 中 Java 分页功能有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

就如平时我们很在分页中看到的,分页的时候返回的不仅包括查询的结果集 (List),而且还包括总的页数(pageNum)、当前第几页(pageNo) 等等信息,所以我们封装一个查询结果 PageModel 类,代码如下:

package com.bjpowernode.test; 
import java.util.List; 
public class PageModel E  { 
 private List E  list; 
 private int pageNo; 
 private int pageSize; 
 private int totalNum; 
 private int totalPage; 
 public List E  getList() { 
 return list; 
 } 
 public void setList(List E  list) { 
 this.list = list; 
 } 
 public int getPageNo() { 
 return pageNo; 
 } 
 public void setPageNo(int pageNo) { 
 this.pageNo = pageNo; 
 } 
 public int getPageSize() { 
 return pageSize; 
 } 
 public void setPageSize(int pageSize) { 
 this.pageSize = pageSize; 
 } 
 public int getTotalNum() { 
 return totalNum; 
 } 
 public void setTotalNum(int totalNum) { 
 this.totalNum = totalNum; 
 setTotalPage((getTotalNum() % pageSize) == 0 ? (getTotalNum() / pageSize) 
 : (getTotalNum() / pageSize + 1)); 
 } 
 public int getTotalPage() { 
 return totalPage; 
 } 
 public void setTotalPage(int totalPage) { 
 this.totalPage = totalPage; 
 } 
 //  获取第一页  
 public int getFirstPage() { 
 return 1; 
 } 
 //  获取最后页  
 public int getLastPage() { 
 return totalPage; 
 } 
 //  获取前页  
 public int getPrePage() { 
 if (pageNo   1) 
 return pageNo - 1; 
 return 1; 
 } 
 //  获取后页  
 public int getBackPage() { 
 if (pageNo   totalPage) 
 return pageNo + 1; 
 return totalPage; 
 } 
 //  判断 首页 及‘前页 是否可用  
 public String isPreable() { 
 if (pageNo == 1) 
 return  disabled  
 return   
 } 
 //  判断 尾页 及‘下页 是否可用  
 public String isBackable() { 
 if (pageNo == totalPage) 
 return  disabled  
 return   
 } 
}

  其中使用泛型是为了能使的该分页类能进行重用,比如在查询用户时可以封装 User 对象、在查询财务中的流向单时可以封装流向单 FlowCard 类。 

  我们以查询用户为例,用户选择查询条件,首先调用 Servlet 获取查询参数,然后请求业务逻辑层取得分页封装结果类。业务逻辑调用 Dao 层取得结果集、取得中记录数封装成分页类。最后 Servlet 将结果设置到 jsp 页面显示。

  首先来讲解 Servlet,代码如下:

package com.bjpowernode.test; 
import java.io.*; 
import java.util.*; 
import javax.servlet.ServletConfig; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import kane.UserInfo; 
import kane.UserInfoManage; 
import kane.PageModel; 
public class UserBasicSearchServlet extends HttpServlet { 
 private static final long serialVersionUID = 1L; 
 private int pageSize = 0; 
 @Override 
 public void init(ServletConfig config) throws ServletException { 
 pageSize = Integer.parseInt(config.getInitParameter( pageSize)); 
 } 
 @Override 
 protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
 throws ServletException, IOException { 
 doPost(req, resp); 
 } 
 @Override 
 protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
 throws ServletException, IOException { 
 // 1. 取得页面参数并构造参数对象  
 int pageNo = Integer.parseInt(req.getParameter( pageNo)); 
 String sex = req.getParameter( gender  
 String home = req.getParameter( newlocation  
 String colleage = req.getParameter( colleage  
 String comingyear = req.getParameter( ComingYear  
 UserInfo u = new UserInfo(); 
 u.setSex(sex); 
 u.setHome(home); 
 u.setColleage(colleage); 
 u.setCy(comingyear); 
 // 2. 调用业务逻辑取得结果集  
 UserInfoManage userInfoManage = new UserInfoManage(); 
 PageModel UserInfo  pagination = userInfoManage.userBasicSearch(u, 
 pageNo, pageSize); 
 List UserInfo  userList = pagination.getList(); 
 // 3. 封装返回结果  
 StringBuffer resultXML = new StringBuffer(); 
 try { 
 resultXML.append( ?xml version= 1.0  encoding= gb18030 ? /n  
 resultXML.append( root /n  
 for (Iterator UserInfo  iterator = userList.iterator(); iterator 
 .hasNext();) { 
 UserInfo userInfo = iterator.next(); 
 resultXML.append( data /n  
 resultXML.append(/t id  + userInfo.getId() +  /id /n  
 resultXML.append(/t truename  + userInfo.getTruename() 
 +  / truename  /n  
 resultXML.append(/t sex  + userInfo.getSex() +  /sex /n  
 resultXML.append(/t home  + userInfo.getHome() +  /home /n  
 resultXML.append( /data /n  
 } 
 resultXML.append( pagination /n  
 resultXML.append(/t total  + pagination.getTotalPage() 
 +  /total /n  
 resultXML.append(/t start  + pagination.getFirstPage() 
 +  /start /n  
 resultXML.append(/t end  + pagination.getLastPage() +  /end /n  
 resultXML.append(/t pageno  + pagination.getPageNo() 
 +  /pageno /n  
 resultXML.append( /pagination /n  
 resultXML.append( /root /n  
 } catch (Exception e) { 
 e.printStackTrace(); 
 } 
 writeResponse(req, resp, resultXML.toString()); 
 } 
 public void writeResponse(HttpServletRequest request, 
 HttpServletResponse response, String result) throws IOException { 
 response.setContentType( text/xml  
 response.setHeader( Cache-Control ,  no-cache  
 response.setHeader( Content-Type ,  text/xml; charset=gb18030  
 PrintWriter pw = response.getWriter(); 
 pw.write(result); 
 pw.close(); 
 } 
}

其中 User 对象代码如下:

package com.bjpowernode.test; 
import java.util.Date; 
public class UserInfo { 
 private int id; 
 private String username; 
 private String password; 
 private String truename; 
 private String sex; 
 private Date birthday; 
 private String home; 
 private String colleage; 
 private String comingYear; 
 public int getId() { 
 return id; 
 } 
 public void setId(int id) { 
 this.id = id; 
 } 
 public String getUsername() { 
 return username; 
 } 
 public void setUsername(String username) { 
 this.username = username; 
 } 
 public String getPassword() { 
 return password; 
 } 
 public void setPassword(String password) { 
 this.password = password; 
 } 
 public String getTruename() { 
 return truename; 
 } 
 public void setTruename(String truename) { 
 this.truename = truename; 
 } 
 public String getSex() { 
 return sex; 
 } 
 public void setSex(String sex) { 
 this.sex = sex; 
 } 
 public Date getBirthday() { 
 return birthday; 
 } 
 public void setBirthday(Date birthday) { 
 this.birthday = birthday; 
 } 
 public String getHome() { 
 return home; 
 } 
 public void setHome(String home) { 
 this.home = home; 
 } 
 public String getColleage() { 
 return colleage; 
 } 
 public void setColleage(String colleage) { 
 this.colleage = colleage; 
 } 
 public String getCy() { 
 return comingYear; 
 } 
 public void setCy(String cy) { 
 this. comingYear= cy; 
 } 
}

接着是业务逻辑层代码,代码如下:

package com.bjpowernode.test; 
import java.sql.Connection; 
import kane.DBUtility; 
import kane.PageModel; 
public class UserInfoManage { 
 private UserInfoDao userInfoDao = null; 
 public UserInfoManage () { 
 userInfoDao = new UserInfoDao(); 
 } 
 public PageModel UserInfo  userBasicSearch(UserInfo u, int pageNo, 
 int pageSize) throws Exception { 
 Connection connection = null; 
 PageModel UserInfo  pagination = new PageModel UserInfo  
 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 (Exception e) { 
 DBUtility.rollBack(connection); 
 e.printStackTrace(); 
 throw new Exception(); 
 } finally { 
 DBUtility.closeConnection(); 
 } 
 return pagination; 
 } 
}

其中 DBUtility 为数据库的连接封装类。

最后是 Dao 层代码实现,代码如下: 

package com.bjpowernode.test; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.ArrayList; 
import java.util.List; 
import kane.UserInfo; 
import kane.DBUtility; 
public class UserInfoDao { 
 public List UserInfo  getUserList(UserInfo userInfo, int pageNo, 
 int pageSize) throws Exception { 
 PreparedStatement pstmt = null; 
 ResultSet rs = null; 
 List UserInfo  userList = null; 
 try { 
 String sql =  select * from(select rownum num,u.* from(select * from user_info where sex = ? and home like   
 + userInfo.getHome() 
 +  %  
 +   and colleage like   
 + userInfo.getColleage() 
 +  %  
 +   and comingyear like   
 + userInfo.getCy() 
 +  %  
 +   order by id) u where rownum =?) where num =?  
 userList = new ArrayList UserInfo  
 Connection conn = 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()) { 
 UserInfo user = new UserInfo(); 
 user.setId(rs.getInt( id)); 
 user.setTruename(rs.getString( truename)); 
 user.setSex(rs.getString( sex)); 
 user.setHome(rs.getString( home)); 
 userList.add(user); 
 } 
 } catch (SQLException e) { 
 e.printStackTrace(); 
 throw new Exception(e); 
 } finally { 
 DBUtility.closeResultSet(rs); 
 DBUtility.closePreparedStatement(pstmt); 
 } 
 return userList; 
 } 
 public int getTotalNum(UserInfo userInfo) throws Exception { 
 PreparedStatement pstmt = null; 
 ResultSet rs = null; 
 int count = 0; 
 try { 
 String sql =  select count(*) from user_info where sex=? and home like   
 + userInfo.getHome() 
 +  %  
 +   and colleage like   
 + userInfo.getColleage() 
 +  %  
 +   and comingyear like   
 + userInfo.getCy()+  %  +   
 Connection conn = DBUtility.getConnection(); 
 pstmt = conn.prepareStatement(sql); 
 pstmt.setString(1, userInfo.getSex()); 
 rs = pstmt.executeQuery(); 
 if (rs.next()) { 
 count = rs.getInt(1); 
 } 
 } catch (SQLException e) { 
 e.printStackTrace(); 
 throw new Exception(e); 
 } finally { 
 DBUtility.closeResultSet(rs); 
 DBUtility.closePreparedStatement(pstmt); 
 } 
 return count; 
 } 
}

最后就是 servlet 将得到的结果返回给 jsp 页面显示出来。

注:其中 DBUtility 代码是封装数据库连接操作的代码,如下:

1.package com.bjpowernode.test; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
public class DBUtility { 
 private static ThreadLocal Connection  threadLocal = new ThreadLocal Connection  
 public static Connection getConnection() { 
 Connection conn = 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 (ClassNotFoundException e) { 
 e.printStackTrace(); 
 } catch (SQLException e) { 
 e.printStackTrace(); 
 } 
 } 
 return conn; 
 } 
 //  封装设置 Connection 自动提交  
 public static void setAutoCommit(Connection conn, Boolean flag) { 
 try { 
 conn.setAutoCommit(flag); 
 } catch (SQLException e) { 
 e.printStackTrace(); 
 } 
 } 
 //  设置事务提交  
 public static void commit(Connection conn) { 
 try { 
 conn.commit(); 
 } catch (SQLException e) { 
 e.printStackTrace(); 
 } 
 } 
 //  封装设置 Connection 回滚  
 public static void rollBack(Connection conn) { 
 try { 
 conn.rollback(); 
 } catch (SQLException e) { 
 e.printStackTrace(); 
 } 
 } 
 //  封装关闭 Connection、PreparedStatement、ResultSet 的函数  
 public static void closeConnection() { 
 Connection conn = threadLocal.get(); 
 try { 
 if (conn != null) { 
 conn.close(); 
 conn = null; 
 threadLocal.remove(); 
 } 
 } catch (SQLException e) { 
 e.printStackTrace(); 
 } 
 } 
 public static void closePreparedStatement(PreparedStatement pstmt) { 
 try { 
 if (pstmt != null) { 
 pstmt.close(); 
 pstmt = null; 
 } 
 } catch (SQLException e) { 
 e.printStackTrace(); 
 } 
 } 
 public static void closeResultSet(ResultSet rs) { 
 try { 
 if (rs != null) { 
 rs.close(); 
 rs = null; 
 } 
 } catch (SQLException e) { 
 e.printStackTrace(); 
 } 
 } 
}

使用 ThreadLocal 是为了保证事务的一致,使得同一个线程的所有数据库操作使用同一个 Connection。

以上是“Oracle 中 Java 分页功能有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计11004字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)