分享
 
 
 

用Spring的JdbcTemplate实现分页功能

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

最近使用了spring中的JdbcTemplate实现数据库的查询和插入操作,发现spring的JdbcTemplate 不象HibernateTemplate那么好,已经实现了分页功能。所以要自己实现,使用getJdbcTemplate().queryForList(string sql)得到的结果集是所有的。

假如你的查询有10000条记录,或者更多,速度肯定慢了,当然你可以通过resultset中的游标控制查询的起始和结束。我这里用的是Oracle数据库,使用伪列ROWNUM来实现分页。我的分页代码如下:

package com.deity.ranking.util;import Java.util.List;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

/** * 分页函数 ** @author allenpan */public class Pagination extends JdbcDaoSupport{

public static final int NUMBERS_PER_PAGE = 10;

//一页显示的记录数

private int numPerPage;

//记录总数

private int totalRows;

//总页数

private int totalPages;

//当前页码

private int currentPage;

//起始行数

private int startIndex;

//结束行数

private int lastIndex;

//结果集存放List

private List resultList;

//JdbcTemplate jTemplate

private JdbcTemplate jTemplate;

/**

* 每页显示10条记录的构造函数,使用该函数必须先给Pagination设置currentPage,jTemplate初值

* @param sql oracle语句

*/

public Pagination(String sql){

if(jTemplate == null){

throw new IllegalArgumentException("com.deity.ranking.util.Pagination.jTemplate is null,please initial it first. ");

}else if(sql.equals("")){

throw new IllegalArgumentException("com.deity.ranking.util.Pagination.sql is empty,please initial it first. ");

}

new Pagination(sql,currentPage,NUMBERS_PER_PAGE,jTemplate);

}

/**分页构造函数

* @param sql 根据传入的sql语句得到一些基本分页信息

* @param currentPage 当前页

* @param numPerPage 每页记录数

* @param jTemplate JdbcTemplate实例

*/

public Pagination(String sql,int currentPage,int numPerPage,JdbcTemplate jTemplate){

if(jTemplate == null){

throw new IllegalArgumentException("com.deity.ranking.util.Pagination.jTemplate is null,please initial it first. ");

}else if(sql == null sql.equals("")){

throw new IllegalArgumentException("com.deity.ranking.util.Pagination.sql is empty,please initial it first. ");

}

//设置每页显示记录数

setNumPerPage(numPerPage);

//设置要显示的页数

setCurrentPage(currentPage);

//计算总记录数

StringBuffer totalSQL = new StringBuffer(" SELECT count(*) FROM ( ");

totalSQL.append(sql);

totalSQL.append(" ) totalTable ");

//给JdbcTemplate赋值

setJdbcTemplate(jTemplate);

//总记录数

setTotalRows(getJdbcTemplate().queryForInt(totalSQL.toString()));

//计算总页数

setTotalPages();

//计算起始行数

setStartIndex();

//计算结束行数

setLastIndex();

System.out.println("lastIndex="+lastIndex);//////////////////

//构造oracle数据库的分页语句

StringBuffer paginationSQL = new StringBuffer(" SELECT * FROM ( ");

paginationSQL.append(" SELECT temp.* ,ROWNUM num FROM ( ");

paginationSQL.append(sql);

paginationSQL.append(") temp where ROWNUM <= " + lastIndex);

paginationSQL.append(" ) WHEREnum " + startIndex);

//装入结果集

setResultList(getJdbcTemplate().queryForList(paginationSQL.toString()));

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub}

public int getCurrentPage() {

return currentPage;

}

public void setCurrentPage(int currentPage) {

this.currentPage = currentPage;

}

public int getNumPerPage() {

return numPerPage;

}

public void setNumPerPage(int numPerPage) {

this.numPerPage = numPerPage;

}

public List getResultList() {

return resultList;}

public void setResultList(List resultList) {

this.resultList = resultList;

}

public int getTotalPages() {

return totalPages;

}

//计算总页数

public void setTotalPages() {

if(totalRows % numPerPage == 0){

this.totalPages = totalRows / numPerPage;

}else{

this.totalPages= (totalRows / numPerPage) + 1;

}

}

public int getTotalRows() {

return totalRows;

}

public void setTotalRows(int totalRows) {

this.totalRows = totalRows;

}

public int getStartIndex() {

return startIndex;

}

public void setStartIndex() {

this.startIndex = (currentPage - 1) * numPerPage;

}

public int getLastIndex() {

return lastIndex;

}

public JdbcTemplate getJTemplate() {

return jTemplate;

}

public void setJTemplate(JdbcTemplate template) {

jTemplate = template;

}

//计算结束时候的索引

public void setLastIndex() {

System.out.println("totalRows="+totalRows);///////////

System.out.println("numPerPage="+numPerPage);///////////

if( totalRows < numPerPage){

this.lastIndex = totalRows;

}else if((totalRows % numPerPage == 0) (totalRows % numPerPage != 0 && currentPage < totalPages)){

this.lastIndex = currentPage * numPerPage;

}else if(totalRows % numPerPage != 0 && currentPage == totalPages){//最后一页

this.lastIndex = totalRows ;

}

}}在我的业务逻辑代码中:

/**

* find season ranking list from DC

* @param areaId 选手区域id

* @param rankDate 赛季

* @param category 类别

* @param characterName 角色名

* @return List

*/

public List findSeasonRankingList(Long areaId, int rankYear,int rankMonth,

Long categoryId,String characterName) {

//SQL语句

StringBuffer sql = new StringBuffer(" SELECT C.USERID userid,D.POSNAME posname,C.GAMEID gameid,C.AMOUNT amount,C.RANK rank FROM ");

//表sql.append(" (SELECT B.USERID USERID,");

sql.append(" B.POSID POSID,");

sql.append(" A.DISTRICT_CODE DISTRICTCODE,");

sql.append(" A.GAMEID GAMEID,");

sql.append(" AMOUNT AMOUNT,");

sql.append(" RANK RANK ");

sql.append(" FROM TB_FS_RANK A ");

sql.append(" LEFT JOIN TB_CHARACTER_INFO B ");

sql.append(" ON A.DISTRICT_CODE = B.DISTRICT_CODE ");

sql.append(" AND A.GAMEID = B.GAMEID ");

//附加条件

if(areaId != null && areaId.intValue() != 0){

sql.append(" and A.DISTRICT_CODE = " + areaId.intValue());

}

if( rankYear 1970 && rankMonth 0){

//hql.append(" and sas.id.dt = to_date('" + rankYear + "-" + rankMonth + "-01 00:00:00'," + "YYYY-MM-DD HH24:MI:SS");

//hql.append(" and sas.id.dt <= to_date('" + rankYear + "-" + rankMonth + "-" + TimeTool.findMaxDateInMonth(rankYear,rankMonth) + " 23:59:59'," + "YYYY-MM-DD HH24:MI:SS");

sql.append(" and A.DT = fn_time_convert(to_date('" + rankYear + "-" + rankMonth + "'," + "'YYYY-MM')) ");

}

if(categoryId != null && categoryId.intValue() != 0){

sql.append(" and A.CID = " + categoryId.intValue());

}

if(characterName != null && !characterName.trim().equals("")){

sql.append(" and A.GAMEID = '" + characterName.trim()+"' ");

}

sql.append(" ORDER BY RANK ASC) C ");

sql.append(" LEFT JOIN TB_FS_POSITION D ");

sql.append(" ON C.POSID = D.POSID ");

sql.append(" ORDER BY C.RANK ");

System.out.println("hql="+sql.toString());////////////////

//使用自己的分页程序控制结果集

Pagination pageInfo = new Pagination(sql.toString(),1,10,getJdbcTemplate());

return pageInfo.getResultList();

//return getJdbcTemplate().queryForList(sql.toString());

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有