Spring3 JDBC 通用DAO封装2 分页实现使用策略模式兼容不同数据库 后续不断更新...

package com.dahua.core.page;

public final class DataDialect {
public final static String ORACLE = "oracle";
public final static String MYSQL = "mysql";
public final static String DB2 = "db2";
public final static String SQLSERVER = "sqlserver";
public final static String MONGODB = "mongodb";
}


package com.dahua.core.page;

/**
* 分页器接口
*
* @author Administrator
*
*/

public interface LimitPage {
String getPageList(String sql, Pager pager);
}


package com.dahua.core.page;
/*
* 使用策略模式构造分页类
* */
public class LimitPageContext {


//持有一个具体策略的对象
private LimitPage limitpage;
/**
* 构造函数,传入一个具体策略对象
* @param strategy 具体策略对象
*/
public LimitPageContext( LimitPage limitPage){
this.limitpage = limitPage;
}
/**
* 策略方法
*/
public String LimitPage(String sql,Pager pager){
return limitpage.getPageList(sql, pager);
}
}
package com.dahua.core.page;

import java.util.ResourceBundle;
/*
* 根据数据库类型不同调用不能策略
*/


public class LimitPageHepler {
public static String getLimitPage(String sql,Pager pager) {
LimitPageContext limitpageContext;
ResourceBundle res = ResourceBundle.getBundle("jdbc");
String db = res.getString("system.dbtype");
if(db.equals(DataDialect.ORACLE)){
limitpageContext = new LimitPageContext(new OracleLpageImpl());
}else if(db.equals(DataDialect.MYSQL)){
limitpageContext = new LimitPageContext(new MysqlLPageImpl());
}else{
limitpageContext = new LimitPageContext(new OracleLpageImpl());
}
String pagesql=limitpageContext.LimitPage(sql, pager);
return pagesql;
}

}


package com.dahua.core.page;


public class MysqlLPageImpl implements LimitPage {

public String getPageList(String sql,Pager pager) {
String result = "";
Integer startIndex = (pager.getCurrentPage()-1)*pager.getPageSize();
Integer pageSize=pager.getPageSize();
if (null != startIndex && null != pageSize) {
result = sql + " limit " + startIndex + "," + pageSize;
} else if (null != startIndex && null == pageSize) {
result = sql + " limit " + startIndex;
} else {
result = sql;
}
return result;
}

}


package com.dahua.core.page;

import org.apache.commons.lang.StringUtils;


public class OracleLpageImpl implements LimitPage {


@Override
public String getPageList(String sql, Pager pager) {
if (StringUtils.isEmpty(sql)) {
return null;
}
int startIndex = (pager.getCurrentPage()-1)*pager.getPageSize();
int endIndex = startIndex + pager.getPageSize();
String endSql = "select * from (select rOraclePageSQL.*,ROWNUM as currentRow from ("
+ sql
+ ") rOraclePageSQL where rownum <"
+ endIndex
+ ") where currentRow>" + startIndex;
return endSql;
}

}


/**
* *********************** 版权声明 *********************************
*
* 版权所有:浙江大华技术股份有限公司
* ©CopyRight DahuaTech 2012
*
* Pager.java
* com.dahua.om.pojo
*
* 描述 :从OSS2.6 Copy过来
*
* ver date author
* ──────────────────────────────────
* Ver 1.1 2012-3-26 15599
* *******************************************************************
*/
package com.dahua.core.page;

import java.util.ArrayList;
import java.util.List;


/**
* 基于Spring3 JDBC
* User: szj
* Date: 2012-04-01
* Time: 14:09:44
* 分页bean
*/

public class Pager {

private int totalPage;
private int currentPage=1;
private int previousPage;
private int nextPage;
private String url;
private int pageSize=20;
private int total;
private int pageListSize = 8;
private String countHsql; //查询总数sql

/**排序字段*/
private String sortName;

/**排序 asc/desc*/
private String sortOrder;

/**
* add by 17351 当前页的起始索引数
*/
private int startIndex;

/**
* initStartIndex:(设置当前页的起始索引数)
*
* @since Ver 1.1
* @author 17351(Jiang_Wei)
*/
private void initStartIndex(){
startIndex = (currentPage - 1)*pageSize;
}
public int getStartIndex(){
return startIndex;
}

public void setCurrentPage(int currentPage){
this.currentPage = currentPage;

}

public int getPreviousPage() {
return previousPage;
}

public void setPreviousPage(int previousPage) {
this.previousPage = previousPage;
}

public int getNextPage() {
return nextPage;
}

public void setNextPage(int nextPage) {
this.nextPage = nextPage;
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

public int getPageSize() {
return pageSize;
}

public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}

public int getPageListSize() {
return pageListSize;
}

public void setPageListSize(int pageListSize) {
this.pageListSize = pageListSize;
}

public int getCurrentPage() {
return currentPage;
}

public void setTotal(int total){
this.total= total;
}

public int getTotal() {
return total;
}
/*
* 计算有关分页参数
*/
public void init() {
if (currentPage <= 0)
this.currentPage = 1;
if (total <= 0)
this.total = 0;
this.totalPage = (int) Math.ceil((double) total / (double) pageSize);
this.totalPage = this.totalPage==0?1:this.totalPage;
if (this.currentPage > this.totalPage)
this.currentPage = this.totalPage;
if(currentPage==total){
this.nextPage = currentPage;
}else{
this.nextPage = currentPage+1;
}
if(currentPage==1){
this.previousPage = 1;
}else{
this.previousPage = currentPage-1;
}

initStartIndex();
}
public List<Integer> getPageList(){
List<Integer> pageList = new ArrayList<Integer>();
int startPage = currentPage-pageListSize/2;
if(startPage<1)startPage = 1;
int endPage = startPage+pageListSize-1;
if(endPage>totalPage)endPage = totalPage;
for(int i=startPage; i<=endPage; i++)pageList.add(i);
return pageList;
}

public int getTotalPage() {
return totalPage;
}

public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}

public String getCountHsql() {
return countHsql;
}

public void setCountHsql(String countHsql) {
this.countHsql = countHsql;
}
public String getSortName() {
return sortName;
}
public void setSortName(String sortName) {
this.sortName = sortName;
}
public String getSortOrder() {
return sortOrder;
}
public void setSortOrder(String sortOrder) {
this.sortOrder = sortOrder;
}

}
1)该分页组件不依赖任何底层数据库实现,可以根据需要扩展子类进行动态替换;2)同时也不提供页面如何显示上页,下页等;内部提供了源代码实现,以及DEMO应用,实现分页非常简单;<br/>需要做的工作有三个地方<br/>1.继承实现分页的抽象类AbstractPage 的两个抽象方法;<br/>2.调用WebPageUtils.doAction方法传入参数即可<br/>3.直接获取需要满足条件的记录<br/><br/><br/>下面举了一个例子来说明使用方法:<br/><br/>package org.hgg.hq.test;<br/><br/>import java.util.ArrayList;<br/>import java.util.List;<br/><br/>import javax.servlet.http.HttpServletRequest;<br/>import javax.servlet.http.HttpServletRequestWrapper;<br/><br/><br/>import org.hqq.hq.impl.AbstractPage;<br/>import org.hqq.hq.impl.ActionTypes;<br/>import org.hqq.hq.impl.WebPageUtils;<br/><br/><br/>public class DemoPage extends AbstractPage {<br/>//根据要求返回从startRow开始的rowCount条记录,可以使用其他组件来实现或者 JDBC实现都可以<br/>protected List acPageData(int startRow, int rowCount) {<br/>List data=new ArrayList();<br/>//4*2四行二列<br/>String[][] rows={{"1","A"},{"2","B"},{"3","C"},{"4","D"}};<br/>for(int i=1;i<=rowCount&&i<=acTotalRows();i++){<br/>data.add(rows[startRow++]);<br/>}<br/>return data;<br/>}<br/>//返回满足条件的总记录条数<br/>protected int acTotalRows() {<br/><br/>return 4;<br/>}<br/><br/>public static void main(String[] args) {<br/><br/>//1.0得到一个实现的实例<br/>DemoPage page=new DemoPage();<br/>//2.0如果有必要,设置每页显示大小,这里设置每页显示3条记录<br/>page.setPageSize(3);<br/>//3.0 根据需要进行必要设置,这里是显示第2页数据<br/>//根据情况,该方法后面两个参数可以从request中获取<br/>WebPageUtils.doAction(page, ActionTypes.GO_SPECIAL_PAGE,2);<br/>//4.0获取当前页数据<br/>List data=page.getCurrentPageData();<br/><br/>for(Object t:data){<br/>System.out.println(((String[])t)[0]+" : "+((String[])t)[1]);<br/>}<br/><br/>}<br/><br/>}<br/><br/>如果是WEB页面上的分页可以直接使用<br/>List data=WebPageUtils.acPageData(request,DemoPage.class);<br/>就可以得到数据了,其中request中存放了ActionTypes中定义的各个动作;<br/>例如<br/><\% String first= request.getContextPath()+"/fwgl/fycx.do?"+WebPageUtils.ACTION_TYPE+"="+ActionTypes.GO_FIRST_PAGE;<br/>String next= request.getContextPath()+"/fwgl/fycx.do?"+WebPageUtils.ACTION_TYPE+"="+ActionTypes.GO_NEXT_PAGE;<br/><br/>%\><br/>\< \a href="javascript:window.location.href='<\%=first%\>'" class="List_operatelink"\>首页\<br/>\<\a href="javascript:window.location.href='<\%=next%\>'" class="List_operatelink"\>下页\<br/><br/><br/>页面上的显示实现不用做任何分页逻辑,只需简单定义 首页 上页 下页 到 页 即可,他们都在ActionTypes中定义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值