使用jdbc分页取出oracle数据
首先是分页工具类
如下代码:
1 public class PageKit { 2 /** 3 * 当前第几页 4 */ 5 private int page; 6 /** 7 * 每页条数 8 */ 9 private int pageSize; 10 /** 11 * 总页数 12 */ 13 private int totalPage; 14 /** 15 * 总条数 16 */ 17 private int total; 18 /** 19 * 当前启始页 20 */ 21 private int offer; 22 23 /** 24 * oracle 分页 开始页码 25 */ 26 private int startPage; 27 /** 28 * oracle 分页 结束页码 29 */ 30 private int endPage; 31 32 public int getStartPage() { 33 return startPage; 34 } 35 36 public void setStartPage(int startPage) { 37 this.startPage = startPage; 38 } 39 40 public int getEndPage() { 41 return endPage; 42 } 43 44 public void setEndPage(int endPage) { 45 this.endPage = endPage; 46 } 47 48 public int getPage() { 49 return page; 50 } 51 52 public void setPage(int page) { 53 this.page = page; 54 } 55 56 public int getPageSize() { 57 return pageSize; 58 } 59 60 public void setPageSize(int pageSize) { 61 this.pageSize = pageSize; 62 } 63 64 public int getTotalPage() { 65 return totalPage; 66 } 67 68 public void setTotalPage(int totalPage) { 69 this.totalPage = totalPage; 70 } 71 72 public int getTotal() { 73 return total; 74 } 75 76 public void setTotal(int total) { 77 this.total = total; 78 } 79 80 public int getOffer() { 81 return offer; 82 } 83 84 public void setOffer(int offer) { 85 this.offer = offer; 86 } 87 88 public PageKit(int page, int pageSize) { 89 this.page = page; 90 this.pageSize = pageSize; 91 resetOffer(); 92 } 93 94 public PageKit(int page, int pageSize, int total) { 95 this.page = page; 96 this.pageSize = pageSize; 97 this.total = total; 98 resetOffer(); 99 } 100 101 public void exec(PageHandler handler){ 102 do { 103 String str = " curr page : %s ,total page : %s, curr page num: %s,page size: %s" ; 104 log.info(String.format(str, page,totalPage,offer,pageSize)); 105 handler.exec(this); 106 page++; 107 resetOffer(); 108 } while (totalPage > page); 109 } 110 111 public void execOracle(PageOracleHandler handler){ 112 boolean exec; 113 do { 114 String str = " curr page : %s ,total page : %s, start page: %s,end page: %s" ; 115 log.info(String.format(str, page,totalPage,startPage,endPage)); 116 // list条数小于每页个数说明已到最后一页,返回false 117 exec = handler.exec(this); 118 page++; 119 resetOffer(); 120 } while (exec); 121 } 122 123 private void resetOffer() { 124 int i = page * pageSize; 125 this.offer = page == 0 ? 0 : i; 126 //mysql 使用的分类参数 127 if (pageSize == 0) { 128 totalPage = 0; 129 } else { 130 totalPage = total % pageSize == 0 ? total / pageSize : total / pageSize + 1; 131 } 132 133 //oracle 使用的分类参数 分页从1开始, 134 this.startPage = offer + 1; 135 this.endPage = pageSize + offer; 136 } 137 @FunctionalInterface 138 public interface PageOracleHandler{ 139 /** 140 * oracle 分页处理器 141 * @param pageKit 分页 142 */ 143 boolean exec(PageKit pageKit); 144 } 145 146 @FunctionalInterface 147 public interface PageHandler{ 148 /** 149 * mysql 150 * @param pageKit 分页 151 */ 152 void exec(PageKit pageKit); 153 } 154 }
2. 下面是直接分页逻辑代码
1 void jdbc() { 2 ResultSet rs = null; 3 PreparedStatement stmt = null; 4 Connection conn = null; 5 try { 6 Class.forName("oracle.jdbc.driver.OracleDriver"); 7 String dbURL = "jdbc:oracle:thin:@localhost:1521:system"; 8 conn = DriverManager.getConnection(dbURL, "wang01", "wang01"); 9 System.out.println("连接成功"); 10 11 PageKit kit = new PageKit(0,3); 12 Connection finalConn = conn; 13 kit.execOracle(pageKit -> { 14 PreparedStatement preparedStatement = null; 15 ResultSet resultSet = null; 16 List<String> list = new ArrayList<>(); 17 try { 18 String sql = "select \"ju.phone\" as phone from (select rownum as rn,a.* from my_view_phone a ) where rn >= ? and rn <=? "; 19 preparedStatement = finalConn.prepareStatement(sql); 20 preparedStatement.setInt(1,pageKit.getStartPage()); 21 preparedStatement.setInt(2,pageKit.getEndPage()); 22 resultSet = preparedStatement.executeQuery(); 23 while (resultSet.next()) { 24 String name = resultSet.getString("phone"); 25 list.add(name); 26 } 27 System.out.println(list); 28 return list.size() >= pageKit.getPageSize(); 29 } catch (SQLException throwables) { 30 throwables.printStackTrace(); 31 }finally { 32 try { 33 if (resultSet != null) { 34 resultSet.close(); 35 resultSet = null; 36 } 37 if (preparedStatement != null) { 38 preparedStatement.close(); 39 preparedStatement = null; 40 } 41 } catch (SQLException e) { 42 e.printStackTrace(); 43 } 44 } 45 return false; 46 }); 47 } catch (SQLException | ClassNotFoundException e) { 48 e.printStackTrace(); 49 } finally { 50 try { 51 if (rs != null) { 52 rs.close(); 53 rs = null; 54 } 55 if (stmt != null) { 56 stmt.close(); 57 stmt = null; 58 } 59 if (conn != null) { 60 conn.close(); 61 conn = null; 62 } 63 } catch (SQLException e) { 64 e.printStackTrace(); 65 } 66 } 67 }
3,总共8条数据,每页3条。
15:49:53.237 [main] INFO PageKit - curr page : 0 ,total page : 0, start page: 1,end page: 3
[13811125522, 13811125523, 13811125524]
15:49:53.370 [main] INFO PageKit - curr page : 1 ,total page : 0, start page: 4,end page: 6
[13811125525, 13811125526, 13811125527]
15:49:53.428 [main] INFO PageKit - curr page : 2 ,total page : 0, start page: 7,end page: 9
[13811125528, 222]
山外青山楼外楼
青山与小楼已不冉有
紧闭的窗前你别等候
大雁飞过菊花香满楼、
听一听看一看想一想
时光呀流水匆匆过
哭一哭笑一笑不用说
人生能有几回合

浙公网安备 33010602011771号