分页和多条件查询功能

分页和多条件查询功能

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

/**
 * 辅助拼接HQL声明工具
 * @author G-Xia
 *
 */
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 args
	 */
	public QueryHelper addWhereCondition(String condition, Object... args) {
		// 拼接
		if (whereClause.length() == 0) {
			whereClause = " WHERE " + condition;
		} else {
			whereClause += " AND " + condition;
		}
		// 处理參数
		if (args != null && args.length > 0) {
			for (Object arg : args) {
				parameters.add(arg);
			}
		}
		return this;
	}

	/**
	 * 假设第一个參数的值为true,就拼接Where子句
	 * 
	 * @param append
	 * @param condition
	 * @param args
	 */
	public QueryHelper addWhereCondition(boolean append, String condition, Object... args) {
		if (append) {
			addWhereCondition(condition, args);
		}
		return this;
	}

	/**
	 * 拼接OrderBy子句
	 * 
	 * @param propertyName
	 * @param asc
	 *            true表示升序,false表示降序
	 */
	public QueryHelper addOrderByProperty(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 addOrderByProperty(boolean append, String propertyName, boolean asc) { if (append) { addOrderByProperty(propertyName, asc); } return this; } /** * 获取查询数据列表的HQL语句 * * @return */ public String getQueryListHql() { return fromClause + whereClause + orderByClause; } /** * 获取查询总记录数的HQL语句(没有OrderBy子句) * * @return */ public String getQueryCountHql() { return "SELECT COUNT(*) " + fromClause + whereClause; } /** * 获取參数列表 * * @return */ public List<Object> getParameters() { return parameters; } /** * 准备PageBean对象到Struts2的栈顶 * @param service * @param pageNum */ public void preparePageBean(DaoSupport<?> service, int pageNum){ PageBean pageBean = service.getPageBean(pageNum, this); ActionContext.getContext().getValueStack().push(pageBean); }}

PageBean:分页用的页面信息

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
		pageCount = (recordCount + pageSize - 1) / pageSize;

		// 计算begPageIndex和endPageIndex
		// a, 总页数不超过10页,就所有显示
		if (pageCount <= 10) {
			beginPageIndex = 1;
			endPageIndex = pageCount;
		}
		// b, 总页数超过了10页,就显示当前页附近的共10个页码(前4个 + 当前页 + 后5个)
		else {
			// 显示当前页附近的共10个页码(前4个 + 当前页 + 后5个)
			beginPageIndex = currentPage - 4; // 7 - 4 = 3
			endPageIndex = currentPage + 5; // 7 + 5 = 12
			// 当前面不足4个页码时,就显示前10页
			if (beginPageIndex < 1) {
				beginPageIndex = 1;
				endPageIndex = 10;
			}
			// 当后面不足5个页码时。就显示后10页
			else if (endPageIndex > pageCount) {
				endPageIndex = pageCount;
				beginPageIndex = pageCount - 10 + 1; // 注意在显示的时候是包括两个边界的
			}
		}
	}

	public int getCurrentPage() {
		return currentPage;
	}

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

	public int getPageCount() {
		return pageCount;
	}

	public void setPageCount(int pageCount) {
		this.pageCount = pageCount;
	}

	public int getPageSize() {
		return pageSize;
	}

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

	public int getRecordCount() {
		return recordCount;
	}

	public void setRecordCount(int recordCount) {
		this.recordCount = recordCount;
	}

	public List getRecordList() {
		return recordList;
	}

	public void setRecordList(List recordList) {
		this.recordList = recordList;
	}

	public int getBeginPageIndex() {
		return beginPageIndex;
	}

	public void setBeginPageIndex(int beginPageIndex) {
		this.beginPageIndex = beginPageIndex;
	}

	public int getEndPageIndex() {
		return endPageIndex;
	}

	public void setEndPageIndex(int endPageIndex) {
		this.endPageIndex = endPageIndex;
	}

}

/**
	 * 公共的查询分页信息的方法(终于版)
	 * 
	 * @param pageNum
	 * @param queryHelper
	 *            查询语句 + 參数列表
	 * @return
	 */
	public PageBean getPageBean(int pageNum, QueryHelper queryHelper) {
		System.out.println("------------> DaoSupportImpl.getPageBean( int pageNum, QueryHelper queryHelper )");

		// 获取pageSize等信息
		int pageSize = Configuration.getPageSize();
		List<Object> parameters = queryHelper.getParameters();

		// 查询一页的数据列表
		Query query = getSession().createQuery(queryHelper.getQueryListHql());
		if (parameters != null && parameters.size() > 0) { // 设置參数
			for (int i = 0; i < parameters.size(); i++) {
				query.setParameter(i, parameters.get(i));
			}
		}
		query.setFirstResult((pageNum - 1) * pageSize);
		query.setMaxResults(pageSize);
		List list = query.list(); // 查询

		// 查询总记录数
		query = getSession().createQuery(queryHelper.getQueryCountHql()); // 注意空格。
		if (parameters != null && parameters.size() > 0) { // 设置參数
			for (int i = 0; i < parameters.size(); i++) {
				query.setParameter(i, parameters.get(i));
			}
		}
		Long count = (Long) query.uniqueResult(); // 查询

		return new PageBean(pageNum, pageSize, count.intValue(), list);
	}

// 准备分页的数据 -- 使用QueryHelper
		new QueryHelper(Topic.class, "t")//
				.addWhereCondition("t.forum=?", forum)//
				.addWhereCondition((viewType == 1), "t.type=?", Topic.TYPE_BEST) // 1 表示仅仅看精华帖
				.addOrderByProperty((orderBy == 1), "t.lastUpdateTime", asc) // 1 表示仅仅按最后更新时间排序
				.addOrderByProperty((orderBy == 2), "t.postTime", asc) // 表示仅仅按主题发表时间排序
				.addOrderByProperty((orderBy == 3), "t.replyCount", asc) // 表示仅仅按回复数量排序
				.addOrderByProperty((orderBy == 0), "(CASE t.type WHEN 2 THEN 2 ELSE 0 END)", false)//
				.addOrderByProperty((orderBy == 0), "t.lastUpdateTime", false) // 0 表示默认排序(全部置顶帖在前面。并按最后更新时间降序排列)
				.preparePageBean(topicService, pageNum);

JSP中页面信息

<%@ 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" style="cursor: hand;" onClick="gotoPage(${num});">${num}</span>
			</s:if>
			<s:else><%-- 当前页,没有链接 --%>
				<span class="PageSelectorNum PageSelectorSelected">${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 id="pn" onchange="gotoPage( this.value )">
			<s:iterator begin="1" end="%{pageCount}" var="num">
				<option value="${num}">${num}</option>
			</s:iterator>
		</select>
		
		<%-- 让select默认选中当前页 --%>
		<script type="text/javascript">
			$("#pn").val( "${currentPage}" );
		</script>
		
	</div>
</div>

<script type="text/javascript">
	/**
	 * 转到指定的页码
	 * @param {Object} pageNum
	 */
	function gotoPage( pageNum ){
		// 方式一: 
		// window.location.href = "forum_show.do?

id=${id}&pageNum=" + pageNum; // alert("请实现gotoPage()方法!"); // 方式二: $("#pageForm").append("<input type='hidden' name='pageNum' value='" + pageNum + "'>"); // 加入pageNum表单字段 $("#pageForm").submit(); // 提交表单 }</script>

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117449.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • oracle触发器类型

    http://www.cnblogs.com/roucheng/p/3506033.html触发器是许多关系数据库系统都提供的一项技术。在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异

    2021年12月23日
    54
  • 万能乘法速算法大全_小学数学加减乘除【速算法】都在这里! 寒假让孩子练一练…

    万能乘法速算法大全_小学数学加减乘除【速算法】都在这里! 寒假让孩子练一练…★需要电子版资料可直接拉至文末查看领取方式哈!小果老师说:很多小朋友的寒假生活已经开启啦!寒假的确可以好好玩一玩,但某种程度上该学习还是的学习一些的!因此,今天小果老师要给大家分享的内容是数学速算法,这些内容掌握以后就几乎不用担心那些简便运算没头绪啦!赶紧来看看然后为孩子收藏起来吧!01加法的神奇速算法一、加大减差法口诀前面加数加上后面加数的整数,减去后面加数与整数的差等于和。例题1376+98…

    2022年6月5日
    33
  • android scaleanimation动画,Android 的ScaleAnimation 缩放动画基本运用

    android scaleanimation动画,Android 的ScaleAnimation 缩放动画基本运用因为今天用到了ScaleAnimation缩放动画就写一下,加深一下印象。用ScaleAnimation有几个重载方法,这里就将八个参数的重载方法。ScaleAnimation(floatfromX,floattoX,floatfromY,floattoY,intpivotXType,floatpivotXValue,intpivotYType,floatpivotYV…

    2022年10月16日
    2
  • 【运维篇】resize2fs命令 – 调整文件系统大小

    【运维篇】resize2fs命令 – 调整文件系统大小resize2fs命令是用来增大或者收缩未加载的“ext2/ext3/ext4”文件系统的大小。语法格式:resize2fs[参数][文件]常用参数:-d 打开调试特性 -p 打印已完成的百分比进度条 -f 强制执行调整大小操作,覆盖掉安全检查操作 -F 开始执行调整大小前,刷新文件系统设备的缓冲区 参考实例调整逻辑卷文件系统大小:[root@linuxcool~]#resize2fs/dev/linuxprobe/vo打开调试特性

    2022年10月21日
    2
  • 双绞线的制作方式详解

    双绞线的制作方式详解制作双绞线一 实验目的 1 了解各种传输介质 双绞线 同轴电缆和光纤 2 了解双绞线类型 各项指标以及制作步骤 二 实验任务 1 学习各种传输介质 双绞线 同轴电缆和光纤 2 学习双绞线类型 各项指标并制作双绞线 三 实验内容 1 查阅各种传输介质相关知识 2 查阅双绞线类型 各项指标及制作双绞线的方法 3 制作双绞线的步骤 四 实验步骤 文字和图片 1 准备

    2025年7月21日
    2
  • 博弈论基础mooc答案_博弈论考试题及答案

    博弈论基础mooc答案_博弈论考试题及答案1、“博弈的本意是什么?A、摔跤B、下棋C、赌博D、游戏参考答案:B2、古时“弈”字,就是指A、跳棋B、象棋C、五子棋D、围棋参考答案:D3、按照博弈方是否达成有约束力的协议,可以分为()A、理性博弈和非理性博弈B、完全信息博弈和不完全信息博弈C、动态博弈和静态博弈D、合作博弈与非合作博弈参考答案:D4、囚徒困境的例子属于()的典型A、非合作博弈B、合作博弈C、理性博弈D、动态博弈参考答案:A5、“石头剪刀布游戏,属于()。A、贯序博弈B、动态博弈…

    2022年10月15日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号