精华内容
下载资源
问答
  • 分页查询抽象出的对象

    这里写图片描述
    分页查询抽象出的对象

    展开全文
  • OA-分页查询抽象最终版)一

    热门讨论 2015-09-27 16:45:55
    OA视频和SSH网上商城最大的区别是什么,不是项目的不同,是面向的对象的体现不同,最近在做一个关于OA分页抽象功能,我下面只来进行最终版的编写。 分页,这项功能在每个页面可能都会体现到,如果每个页面都有,...

           OA视频和SSH网上商城最大的区别是什么,不是项目的不同,是面向的对象的体现不同,最近在做一个关于OA分页的抽象功能,我下面只来进行最终版的编写。

    分页,这项功能在每个页面可能都会体现到,如果每个页面都有,那好我们就把分页这部分抽象,看下面代码

    页面:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    
    <div id=PageSelectorBar>
    	<div id=PageSelectorMemo>
    		页次:${currentPage}/${pageCount }页  
    		每页显示:${pageSize }条  
    		总记录数:${recordCount }条
    	</div>
    	<div id=PageSelectorSelectorArea>
    	
    		<a href="javascript: gotoPage(1)" title="首页" style="cursor: hand;">
    			<img src="${pageContext.request.contextPath}/style/blue/images/pageSelector/firstPage.png"/>
    		</a>
    		
    		<s:iterator begin="%{beginPageIndex}" end="%{endPageIndex}" var="num">
    			<s:if test="#num == currentPage"> <%-- 当前页 --%>
    				<span class="PageSelectorNum PageSelectorSelected">${num}</span>
    			</s:if>
    			<s:else> <%-- 非当前页 --%>
    				<span class="PageSelectorNum" style="cursor: hand;" onClick="gotoPage(${num});">${num}</span>
    			</s:else>
    			
    		</s:iterator>
    		
    		<a href="javascript: gotoPage(${pageCount})" title="尾页" style="cursor: hand;">
    			<img src="${pageContext.request.contextPath}/style/blue/images/pageSelector/lastPage.png"/>
    		</a>
    		
    		转到:
    		<select οnchange="gotoPage(this.value)" id="_pn">
    			<s:iterator begin="1" end="%{pageCount}" var="num">
    				<option value="${num}">${num}</option>
    			</s:iterator>
    		</select>
    		<script type="text/javascript">
    			$("#_pn").val("${currentPage}");
    		</script>
    		
    	</div>
    </div>
    
    
    <script type="text/javascript">
    	function gotoPage( pageNum ){
    		// window.location.href = "forum_show.action?id=${id}&pageNum=" + pageNum;
    		
    		$(document.forms[0]).append("<input type='hidden' name='pageNum' value='" + pageNum +"'>");
    		document.forms[0].submit();
    	}
    </script>
    

    这样我们在有分页的页面中只需写这样的一段代码就搞定了。

    <!--分页信息-->
    <%@ include file="/WEB-INF/jsp/public/pageView.jspf" %>
    

    我们来思考这么一个问题,当看SSH网上商城的时候,是不是每一个页面都会进行到计算,因为计算你数据库中数据有多少,每页显示多少条,从第几页开始显示等等,网上商城每条线都要计算一次,出现大量重复性的代码,那好,我们继续抽象,看下面代码:

    PageBean代码:

    package cn.itcast.oa.domain;
    
    import java.util.List;
    
    /**
     * 分页功能中的一页的信息
     * 
     * @author 志鹏
     * 
     */
    public class PageBean {
    
    	// 指定的或是页面参数
    	private int currentPage; // 当前页
    	private int pageSize; // 每页显示多少条
    
    	// 查询数据库
    	private int recordCount; // 总记录数
    	private List recordList; // 本页的数据列表
    
    	// 计算
    	private int pageCount; // 总页数
    	private int beginPageIndex; // 页码列表的开始索引(包含)
    	private int endPageIndex; // 页码列表的结束索引(包含)
    
    	/**
    	 * 只接受前4个必要的属性,会自动的计算出其他3个属生的值
    	 * 
    	 * @param currentPage
    	 * @param pageSize
    	 * @param recordCount
    	 * @param recordList
    	 */
    	public PageBean(int currentPage, int pageSize, int recordCount, List recordList) {
    		this.currentPage = currentPage;
    		this.pageSize = pageSize;
    		this.recordCount = recordCount;
    		this.recordList = recordList;
    
    		// 计算总页码
    		pageCount = (recordCount + pageSize - 1) / pageSize;
    
    		// 计算 beginPageIndex 和 endPageIndex
    		// >> 总页数不多于10页,则全部显示
    		if (pageCount <= 10) {
    			beginPageIndex = 1;
    			endPageIndex = pageCount;
    		}
    		// >> 总页数多于10页,则显示当前页附近的共10个页码
    		else {
    			// 当前页附近的共10个页码(前4个 + 当前页 + 后5个)
    			beginPageIndex = currentPage - 4;
    			endPageIndex = currentPage + 5;
    			// 当前面的页码不足4个时,则显示前10个页码
    			if (beginPageIndex < 1) {
    				beginPageIndex = 1;
    				endPageIndex = 10;
    			}
    			// 当后面的页码不足5个时,则显示后10个页码
    			if (endPageIndex > pageCount) {
    				endPageIndex = pageCount;
    				beginPageIndex = pageCount - 10 + 1;
    			}
    		}
    	}
    }
    
    上面代码中的一些get set方法我删除了,看到上面这个类中的方法和业务逻辑其实并不难,但是如果重复性的工作多了,这些东西也是够折磨你的。

    由于篇幅过长 小编在下篇文章中 继续为您抽象!



    展开全文
  • OA-分页查询抽象最终版)二

    热门讨论 2015-09-27 17:10:50
    上篇文章我们已经把前台和工具类PageBean抽象出来了,下面我们继续抽象:  比如我们要查询板块的信息时,我们要将板块的信息,以及是否要排序和按照什么排序都要在hql语句中声明,但是我换了一个主题信息查询呢,...

     上篇文章我们已经把前台和工具类PageBean抽象出来了,下面我们继续抽象:

          比如我们要查询板块的信息时,我们要将板块的信息,以及是否要排序和按照什么排序都要在hql语句中声明,但是我换了一个主题信息查询呢,上面那些东西我们还要继续赋值,传值,再次做了一些重复性的事情。

    还有一个问题,我们在拼接hql语句时,以及order by的时候,总是会出现语句错误,如果字段再多的话,相信大家就已经疯了,那好,我们继续来抽象,看下面代码:

    QueryHelper工具类:

    <span style="font-size:18px;">package cn.itcast.oa.util;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import cn.itcast.oa.base.DaoSupport;
    import cn.itcast.oa.domain.PageBean;
    
    import com.opensymphony.xwork2.ActionContext;
    
    /**
     * 用于辅助拼接HQL语句
     * 
     * @author 志鹏
     * 
     */
    public class QueryHelper {
    
    	private String fromClause; // FROM子句
    	private String whereClause = ""; // Where子句
    	private String orderByClause = ""; // OrderBy子句
    
    	private List<Object> parameters = new ArrayList<Object>(); // 参数列表
    
    	/**
    	 * 生成From子句
    	 * 
    	 * @param clazz
    	 * @param alias
    	 *            别名
    	 */
    	public QueryHelper(Class clazz, String alias) {
    		fromClause = "FROM " + clazz.getSimpleName() + " " + alias;
    	}
    
    	/**
    	 * 拼接Where子句
    	 * 
    	 * @param condition
    	 * @param params
    	 */
    	public QueryHelper addCondition(String condition, Object... params) {
    		// 拼接
    		if (whereClause.length() == 0) {
    			whereClause = " WHERE " + condition;
    		} else {
    			whereClause += " AND " + condition;
    		}
    
    		// 参数
    		if (params != null) {
    			for (Object p : params) {
    				parameters.add(p);
    			}
    		}
    
    		return this;
    	}
    
    	/**
    	 * 如果第一个参数为true,则拼接Where子句
    	 * 
    	 * @param append
    	 * @param condition
    	 * @param params
    	 */
    	public QueryHelper addCondition(boolean append, String condition, Object... params) {
    		if (append) {
    			addCondition(condition, params);
    		}
    		return this;
    	}
    
    	/**
    	 * 拼接OrderBy子句
    	 * 
    	 * @param propertyName
    	 *            参与排序的属性名
    	 * @param asc
    	 *            true表示升序,false表示降序
    	 */
    	public QueryHelper addOrderProperty(String propertyName, boolean asc) {
    		if (orderByClause.length() == 0) {
    			orderByClause = " ORDER BY " + propertyName + (asc ? " ASC" : " DESC");
    		} else {
    			orderByClause += ", " + propertyName + (asc ? " ASC" : " DESC");
    		}
    		return this;
    	}
    
    	/**
    	 * 如果第一个参数为true,则拼接OrderBy子句
    	 * 
    	 * @param append
    	 * @param propertyName
    	 * @param asc
    	 */
    	public QueryHelper addOrderProperty(boolean append, String propertyName, boolean asc) {
    		if (append) {
    			addOrderProperty(propertyName, asc);
    		}
    		return this;
    	}
    
    	/**
    	 * 获取生成的用于查询数据列表的HQL语句
    	 * 
    	 * @return
    	 */
    	public String getListQueryHql() {
    		return fromClause + whereClause + orderByClause;
    	}
    
    	/**
    	 * 获取生成的用于查询总记录数的HQL语句
    	 * 
    	 * @return
    	 */
    	public String getCountQueryHql() {
    		return "SELECT COUNT(*) " + fromClause + whereClause;
    	}
    
    	/**
    	 * 获取HQL中的参数值列表
    	 * 
    	 * @return
    	 */
    	public List<Object> getParameters() {
    		return parameters;
    	}
    
    	/**
    	 * 查询分页信息,并放到值栈栈顶
    	 * 
    	 * @param service
    	 * @param pageNum
    	 * @param pageSize
    	 */
    	public void preparePageBean(DaoSupport<?> service, int pageNum, int pageSize) {
    		PageBean pageBean = service.getPageBean(pageNum, pageSize, this);
    		ActionContext.getContext().getValueStack().push(pageBean);
    	}
    
    }
    </span>

    简单介绍,如果我们的参数过多,我们可以根据循环来进行赋值,这样都避免了赋值繁杂,和一些空格的错误了。

    OA系统的抽象不仅仅这些,比如一些公共的GetById(),FindAll()等等这样公共的底层方法,我们都抽象到了一个叫做DaoSupportImpl这样的实现类中,那么我们的分页功能也有这样的公共方法我们依旧抽象出来放在DaoSupportImpl实现类中,看下面代码:

    PageBean方法:

    <span style="font-size:18px;">// 公共的查询分页信息的方法(最终版)
    		public PageBean getPageBean(int pageNum, int pageSize, QueryHelper queryHelper) {
    			
    			// 参数列表
    			List<Object> parameters = queryHelper.getParameters();
    
    			// 查询本页的数据列表
    			Query listQuery = getSession().createQuery(queryHelper.getListQueryHql()); // 创建查询对象
    			if (parameters != null) { // 设置参数
    				for (int i = 0; i < parameters.size(); i++) {
    					listQuery.setParameter(i, parameters.get(i));
    				}
    			}
    			listQuery.setFirstResult((pageNum - 1) * pageSize);
    			listQuery.setMaxResults(pageSize);
    			List list = listQuery.list(); // 执行查询
    
    			// 查询总记录数量
    			Query countQuery = getSession().createQuery(queryHelper.getCountQueryHql());
    			if (parameters != null) { // 设置参数
    				for (int i = 0; i < parameters.size(); i++) {
    					countQuery.setParameter(i, parameters.get(i));
    				}
    			}
    			Long count = (Long) countQuery.uniqueResult(); // 执行查询
    
    			return new PageBean(pageNum, pageSize, count.intValue(), list);
    		}
    	
    	</span>

    大家也许会奇怪,那怎么进行具体的查询呢,比如我是板块查询,没有看到真正的hql语句和表的查询呀,当然我们一些特殊的我们会进行重写呀,比如下面这段代码,就是重写的过程:

    <span style="font-size:18px;">public PageBean getPageBeanByForum(int pageNum, int pageSize, Forum forum) {
    
    		// 查询本页的数据列表
    		List list = getSession().createQuery(//
    				"FROM Topic t WHERE t.forum=? ORDER BY (CASE t.type WHEN 2 THEN 2 ELSE 0 END) DESC, t.lastUpdateTime DESC")//
    				.setParameter(0, forum)//
    				.setFirstResult((pageNum - 1) * pageSize)//
    				.setMaxResults(pageSize)//
    				.list();
    
    		// 查询总记录数量
    		Long count = (Long) getSession().createQuery(//
    				"SELECT COUNT(*) FROM Topic t WHERE t.forum=?")//
    				.setParameter(0, forum)//
    				.uniqueResult();
    
    		return new PageBean(pageNum, pageSize, count.intValue(), list);
    	}</span>

    关于这段内容都这些了,让我很疑惑的是,在action中的hql语句,是不是会让我们的架构设计不够明确呢,hql语句应该放在底层,而不是Action呀,看下面代码:

    Action代码:

    <span style="font-size:18px;">// 准备分页信息 ,最终版
    		new QueryHelper(Topic.class, "t")//
    				// 过滤条件
    				.addCondition("t.forum=?", forum)//
    				.addCondition((viewType == 1), "t.type=?", Topic.TYPE_BEST) // 1 表示只看精华帖
    				// 排序条件
    				.addOrderProperty((orderBy == 1), "t.lastUpdateTime", asc) // 1 表示只按最后更新时间排序
    				.addOrderProperty((orderBy == 2), "t.postTime", asc) // 2 表示只按主题发表时间排序
    				.addOrderProperty((orderBy == 3), "t.replyCount", asc) // 3 表示只按回复数量排序
    				.addOrderProperty((orderBy == 0), "(CASE t.type WHEN 2 THEN 2 ELSE 0 END)", false)//
    				.addOrderProperty((orderBy == 0), "t.lastUpdateTime", false) // 0 表示默认排序(所有置顶帖在前面,并按最后更新时间降序排列)
    				.preparePageBean(topicService, pageNum, pageSize);
    </span>


    展开全文
  • * 分页查询封装 * */ public class Page<T> { private int pageNumber;//当前页数 private int pageSize;//每页显示数量 private int total;//总记录数 private int totalPage;//总页数 priv...

    首先我们要对page进行抽象封装

    /**
     * 分页查询封装
     *
     */
    
    public class Page<T> {
    	private int pageNumber;//当前页数
    	
    	private int pageSize;//每页显示数量
    	
    	private int total;//总记录数
    	
    	private int totalPage;//总页数
    	
    	private int offset;//对应数据库里的游标
    	
    	private List<T> content = new ArrayList<T>();//结果集
    	
    	private List<SearchProperty> searchProporties = new ArrayList<SearchProperty>();
    	
    	public Page(int pageNumber,int pageSize){
    		this.pageNumber = pageNumber;
    		this.pageSize = pageSize;
    		this.offset = (this.pageNumber - 1) * this.pageSize;
    	}
    
    	public int getPageNumber() {
    		return pageNumber;
    	}
    
    	public void setPageNumber(int pageNumber) {
    		this.pageNumber = pageNumber;
    	}
    
    	public int getPageSize() {
    		return pageSize;
    	}
    
    	public void setPageSize(int pageSize) {
    		this.pageSize = pageSize;
    	}
    
    	public int getOffset() {
    		return offset;
    	}
    
    	public void setOffset(int offset) {
    		this.offset = offset;
    	}
    
    	public List<T> getContent() {
    		return content;
    	}
    
    	public void setContent(List<T> content) {
    		this.content = content;
    	}
    
    	public List<SearchProperty> getSearchProporties() {
    		return searchProporties;
    	}
    
    	public void setSearchProporties(List<SearchProperty> searchProporties) {
    		this.searchProporties = searchProporties;
    	}
    
    	public int getTotal() {
    		return total;
    	}
    
    	public void setTotal(int total) {
    		this.total = total;
    	}
    
    	public int getTotalPage() {
    		return totalPage;
    	}
    
    	public void setTotalPage(int totalPage) {
    		this.totalPage = totalPage;
    	}
    	
    }
    

    然后拼接多条件查询sql语句:

    /**
    	 * 构造多条件查询的条件sql语句
    	 * @param page
    	 * @return
    	 */
    	private String buildSearchSql(Page<T> page) {
    		// TODO Auto-generated method stub
    		String searchSql = "";
    		List<SearchProperty> searchProporties = page.getSearchProporties();
    		for(SearchProperty searchProperty:searchProporties){
    			switch (searchProperty.getOperator()) {
    				case GT:{//大于
    					searchSql += " and " + searchProperty.getKey() + " > ?";
    					break;
    				}
    				case GTE:{//大于等于
    					searchSql += " and " + searchProperty.getKey() + " >= ?";
    					break;
    				}
    				case EQ:{//等于
    					searchSql += " and " + searchProperty.getKey() + " = ?";
    					break;
    				}
    				case LT:{//小于
    					searchSql += " and " + searchProperty.getKey() + " < ?";
    					break;
    				}
    				case LTE:{//小于等于
    					searchSql += " and " + searchProperty.getKey() + " <= ?";
    					break;
    				}
    				case NEQ:{//不等于
    					searchSql += " and " + searchProperty.getKey() + " <> ?";
    					break;
    				}
    				case LIKE:{//模糊匹配
    					searchSql += " and " + searchProperty.getKey() + " like ?";
    					break;
    				}
    				case IN:{//在范围内
    					searchSql += " and " + searchProperty.getKey() + " in(" + searchProperty.getValue() + ")";
    					break;
    				}
    			}
    		}
    		if(!"".equals(searchSql)){
    			searchSql = searchSql.replaceFirst("and", "where");
    		}
    		System.out.println(searchSql);
    		return searchSql;
    	}
    

    查询总的页数:

    
    	/**
    	 * 返回总的记录数
    	 * @param sql
    	 * @return
    	 */
    	private int getTotal(String sql,Page<T> page){
    		PreparedStatement prepareStatement;
    		try {
    			prepareStatement = dbUtil.getConnection().prepareStatement(sql);
    			prepareStatement = setSearchPrepareStatement(prepareStatement,page);
    			ResultSet executeQuery = prepareStatement.executeQuery();
    			if(executeQuery.next()){
    				int total = executeQuery.getInt("total");
    				dbUtil.releaseConnection();
    				return total;
    			}
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return 0;
    	}

     

    最后进行查询操作:

    
    	/**
    	 * 抽象分装多条件分页查询列表操作
    	 * @param page
    	 * @return
    	 */
    	public Page<T> findList(Page<T> page){
    		String sql = buildSql(CURD_SELECT);
    		sql += buildSearchSql(page);
    		sql += " limit " + page.getOffset() + "," + page.getPageSize();
    		try {
    			PreparedStatement prepareStatement = dbUtil.getConnection().prepareStatement(sql);
    			prepareStatement = setSearchPrepareStatement(prepareStatement,page);
    			ResultSet executeQuery = prepareStatement.executeQuery();
    			while(executeQuery.next()){
    				T newInstance = (T) t.newInstance();
    				newInstance = setParams(newInstance,executeQuery);
    				page.getContent().add(newInstance);
    			}
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		page.setTotal(getTotal(buildSql(CURD_COUNT) + buildSearchSql(page), page));
    		int totalPage = 0;
    		if(page.getTotal() % page.getPageSize() == 0){
    			totalPage = page.getTotal() / page.getPageSize();
    		}else{
    			totalPage = page.getTotal() / page.getPageSize() + 1;
    		}
    		page.setTotalPage(totalPage);
    		dbUtil.releaseConnection();
    		return page;
    	}

     

    展开全文
  • Author : Spring Date :09-03-09 22:44我们在做项目的时候可以用一个查询类来解决一每个查询功能的反复的代码,下面的这个查询类只要你写一个类来继承它实现其中的ininSql()方法就行,在这上方法中写上你在执行的...
  • 分页查询算法实践

    2017-11-02 15:51:00
    马上要毕业了,心里很迷茫,感觉真的时间飞逝,软件真的博大精深,特别.NET平台在Microsoft下...考虑了一下觉得先该从分页查询入手,便简单的设计了下,现目前版本实现了单表的基本分页查询。我知道博客园了已经有...
  • Mybatis的分页查询 作用:在查询大量数据时,使用分页进行查询,也可以说是变成处理小部分的数据,把对数据库的压力把控在可控范围 步骤: 1、添加接口抽象类 /** * 分页查询,这需要使用引用类 * @return */ ...
  • Spring Data 查询分页 -- 分页请求参数

    千次阅读 2018-11-04 12:02:45
    针对查询的分页请求和分页结果的返回,Spring 提供了相应的建模...Pageable – 分页查询参数的接口抽象建模 Pageable接口是对分页查询参数的接口抽象建模,他主要包含以下三个基础信息: pageNumber – 当前页码,0...
  • 项目代码设计规范总结之分页查询 如今的项目,不管是cms,crm等等诸如这类的关系管理或是内容管理系统的项目,分页是一个刚需,那有没有一个比较标准的分页功能的设计规范呢,今天在一个开源项目中...
  • 应用Hibernate3的DetachedCriteria实现分页查询2006年12月11日 10:14:00阅读数:378Hibernate3提供了DetachedCriteria,使得我们可以在Web层构造detachedCriteria,然后调用业务层Bean,进行动态条件查询,根据这一...
  • SpringBoot项目中,使用MyBatis实现多条件组合分页查询 就拿淘宝来举例,当我们想要买一个手机时,会根据手机的品牌、价格、颜色等多个条件来查询,然后再分页显示数据,此时就用到了多条件组合分页查询 1、把条件封装到...
  • Spring Data 查询分页 -- 分页结果返回

    千次阅读 2018-11-05 12:14:16
    针对数据查询中的分页请求参数和分页结果返回,Spring 做了建模抽象并提供了相应的工具实现,这部分模型和工具包含在包spring-data-commons中,本文对其中分页结果返回部分做一下梳理,方便在开发中使用 。...
  • 对象 :对象的抽象是类,类的实例(具体化)是对象,总的来说类是虚构的所以说他抽象,而对象是实实在在的所以说他是对象,换种说法 因为类是抽象的,是不存在的,所以在计算机里类是没有内存的而实例化的过程就是给...
  • Hibernate3的DetachedCriteria实现分页查询

    千次阅读 2007-08-06 09:47:00
    Hibernate3提供了DetachedCriteria,使得我们可以在Web层构造detachedCriteria,然后调用业务层Bean,进行动态条件查询,根据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来自于Quake Wang的javaeye-...
  • Hibernate3提供了DetachedCriteria,使得我们可以在Web层构造detachedCriteria,然后调用业务层Bean,进行动态条件查询,根据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来自于Quake Wang的javaeye-...
  • 比如根据id查询,删除,查询分页查询全部信息,保存···这些可变性不大的方法,全部抽象成一个公共的父类方法,新增类只需要继承这个方法就可以了,不用再每次单独的去实现这些方法,如果有源码可以参考那就太...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 160
精华内容 64
关键字:

分页查询抽象