Jmesa默认的方式是对所有的数据进行排序与过滤,如果数据太多,对性能肯定会造成影响,这是每个分页都必须处理的问题。Jmesa通过Limit来完成从数据库提取部分数据的中转操作。
见下面代码:
private void addItems(TableFacade tableFacade) {
Limit limit = tableFacade.getLimit();
int rowCount = FillListData.getRowCount();
//获取分面数据前必须先设置数据总数与数据集合
tableFacade.setTotalRows(rowCount);
tableFacade.setItems(FillListData.getData());
this.getContext().getRequest().setAttribute("limit", limit);
this.getContext().getRequest().setAttribute("items",
FillListData.getData());
//代表当前页数据的开始行与结束行位置
int rowStart = limit.getRowSelect().getRowStart();
int rowEnd = limit.getRowSelect().getRowEnd();
System.out.println("rowStart=" + rowStart + " rowEnd=" + rowEnd);
//此处提取过滤的条件
FilterSet filterSet = limit.getFilterSet();
Collection<Filter> filters = filterSet.getFilters();
for (Filter filter : filters) {
String property = filter.getProperty();
String value = filter.getValue();
System.out.println("property="+property+" value="+value);
}
//此处提取过滤的排序方式,如asc,desc等
SortSet sortSet = limit.getSortSet();
Collection<Sort> sorts = sortSet.getSorts();
for (Sort sort : sorts) {
String property = sort.getProperty();
String order = sort.getOrder().toParam();
System.out.println("property="+property+" value="+order);
}
}
JSP代码据说要加上这个:
<jmesa:tableFacade items="${items}" ..... limit="${limit}" >
好像不加也行,暂时还不知道有什么影响。
有了上面代码提供的条件,就可以从数据库中提取相应部分的数据记录了。官方提供了一个很好的例子,使用的是Hibernate的Criteria查询方式:
....
protected void setDataAndLimitVariables(TableFacade tableFacade) {
Limit limit = tableFacade.getLimit();
PresidentFilter presidentFilter = getPresidentFilter(limit);
/*
* Because we are using the State feature (via stateAttr) we can do a check to see if we
* have a complete limit already. See the State feature for more details
*/
if (!limit.isComplete()) {
int totalRows = presidentService.getPresidentsCountWithFilter(presidentFilter);
tableFacade.setTotalRows(totalRows); /*
* Very important to set the totalRow
* before trying to get the
* row start and row end variables.
*/
}
PresidentSort presidentSort = getPresidentSort(limit);
int rowStart = limit.getRowSelect().getRowStart();
int rowEnd = limit.getRowSelect().getRowEnd();
Collection<President> items = presidentService.getPresidentsWithFilterAndSort(presidentFilter, presidentSort, rowStart, rowEnd);
tableFacade.setItems(items); // Do not forget to set the items back on the tableFacade.
}
/**
* A very custom way to filter the items. The PresidentFilter acts as a command for the
* Hibernate criteria object. There are probably many ways to do this, but this is the most
* flexible way I have found. The point is you need to somehow take the Limit information and
* filter the rows.
*
* @param limit The Limit to use.
*/
protected PresidentFilter getPresidentFilter(Limit limit) {
PresidentFilter presidentFilter = new PresidentFilter();
FilterSet filterSet = limit.getFilterSet();
Collection<Filter> filters = filterSet.getFilters();
for (Filter filter : filters) {
String property = filter.getProperty();
String value = filter.getValue();
presidentFilter.addFilter(property, value);
}
return presidentFilter;
}
/**
* A very custom way to sort the items. The PresidentSort acts as a command for the Hibernate
* criteria object. There are probably many ways to do this, but this is the most flexible way I
* have found. The point is you need to somehow take the Limit information and sort the rows.
*
* @param limit The Limit to use.
*/
protected PresidentSort getPresidentSort(Limit limit) {
PresidentSort presidentSort = new PresidentSort();
SortSet sortSet = limit.getSortSet();
Collection<Sort> sorts = sortSet.getSorts();
for (Sort sort : sorts) {
String property = sort.getProperty();
String order = sort.getOrder().toParam();
presidentSort.addSort(property, order);
}
return presidentSort;
}
....
PresidentFilter.java
public class PresidentFilter implements CriteriaCommand {
List<Filter> filters = new ArrayList<Filter>();
public void addFilter(String property, Object value) {
filters.add(new Filter(property, value));
}
public Criteria execute(Criteria criteria) {
for (Filter filter : filters) {
buildCriteria(criteria, filter.getProperty(), filter.getValue());
}
return criteria;
}
private void buildCriteria(Criteria criteria, String property, Object value) {
if (value != null) {
criteria.add(Restrictions.like(property, "%" + value + "%").ignoreCase());
}
}
private static class Filter {
private final String property;
private final Object value;
public Filter(String property, Object value) {
this.property = property;
this.value = value;
}
public String getProperty() {
return property;
}
public Object getValue() {
return value;
}
}
}
public class PresidentSort implements CriteriaCommand {
List<Sort> sorts = new ArrayList<Sort>();
public void addSort(String property, String order) {
sorts.add(new Sort(property, order));
}
public Criteria execute(Criteria criteria) {
for (Sort sort : sorts) {
buildCriteria(criteria, sort.getProperty(), sort.getOrder());
}
return criteria;
}
private void buildCriteria(Criteria criteria, String property, String order) {
if (order.equals(Sort.ASC)) {
criteria.addOrder(Order.asc(property));
} else if (order.equals(Sort.DESC)) {
criteria.addOrder(Order.desc(property));
}
}
private static class Sort {
public final static String ASC = "asc";
public final static String DESC = "desc";
private final String property;
private final String order;
public Sort(String property, String order) {
this.property = property;
this.order = order;
}
public String getProperty() {
return property;
}
public String getOrder() {
return order;
}
}
}
public interface CriteriaCommand {
public Criteria execute(Criteria criteria);
}
service部分的代码:
public Collection<President> getPresidentsWithFilterAndSort(PresidentFilter filter, PresidentSort sort, int rowStart, int rowEnd) {
return presidentDao.getPresidentsWithFilterAndSort(filter, sort, rowStart, rowEnd);
}
dao部分的代码:
public List<President> getPresidentsWithFilterAndSort(final PresidentFilter filter, final PresidentSort sort, final int rowStart, final int rowEnd) {
List applications = (List) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria criteria = session.createCriteria(President.class);
criteria = filter.execute(criteria);
criteria = sort.execute(criteria);
criteria.setFirstResult(rowStart);
criteria.setMaxResults(rowEnd - rowStart);
return criteria.list();
}
});
return applications;
}
这个例子的代码实现思路很清晰,值得借鉴,故把它单独提取出来。到此,数据库分页的问题得到彻底的解决。
分享到:
相关推荐
2. **org.jmesa.limit**:提供过滤功能,通过 `Limit` 接口控制数据流,可以保存用户查询时的参数,如过滤条件、排序条件和分页信息。 3. **org.jmesa.view**:定义了数据的展示方式,包括 CSV 和 HTML 两种实现。...
《Jmesa在Struts2环境中的应用实践》 Jmesa是一款强大的Java表格和分页处理库,尤其适用于Web应用程序。在Struts2框架下集成Jmesa,可以为用户提供直观、高效的数据显示和操作功能。然而,由于相关文档较少,使得在...
Jmesa是一个开源的数据分析和展示工具,其源码解读主要涵盖了五个部分,分别是包结构、limit包、core包、core.filter包和view包。在本文中,我们将深入理解Jmesa的核心概念和主要功能。 首先,我们关注的是包结构。...
`Limit`接口是`org.jmesa.limit`包中的重要接口之一,它包括以下组成部分: - **id**:唯一标识符,用于区分不同的表格或数据集。 - **RowSelect**:管理分页算法,可以通过传入页码、每页显示的最大记录数和总记录...
本文档针对mysql分页之limit慢的问题,使用联合索引在大数据量的情况下优化limit分页的性能
### 使用LIMIT传参的方法 在MySQL数据库操作过程中,`LIMIT`子句是非常实用的一个功能,尤其是在需要限制查询结果集大小的情况下。本文将详细介绍如何在MySQL中使用`LIMIT`结合参数化查询来实现灵活且安全的数据...
### Oracle分页(LIMIT方式的运用) 在数据库查询操作中,分页是非常常见的需求之一,尤其是在数据量较大的情况下,为了提高用户体验以及减轻服务器压力,我们需要将数据分成若干个页面进行展示。Oracle数据库作为...
- `Limit.rowSelect.maxRows`: 设置默认的每页显示记录数量。 - `Html.imagesPath`: 设置表格图片路径。 3. **Web.xml配置**: - 需要在`web.xml`文件中添加特定的配置项以支持JMesa的功能。 4. **所需jar包**: ...
`testlimit.exe`是一个专门用于Windows系统下的内存压力测试工具,它可以帮助用户了解系统的内存管理能力,检测系统的稳定性和内存使用极限。这个工具通过模拟高内存占用情况,可以暴露潜在的系统瓶颈和内存泄漏问题...
在SQLite中,`LIMIT`子句是SQL查询语句的一部分,用于限制返回的结果集数量。这个功能对于处理大量数据非常有用,特别是当你只需要查看或处理数据集的一部分时。 `LIMIT`子句的基本语法如下: ```sql SELECT ...
【使用limit,offset分页场景时为什么会慢】 在SQL查询中,使用`LIMIT`和`OFFSET`进行分页操作在大数据量的情况下可能会变得极其缓慢。这是因为`OFFSET`需要跳过指定数量的行,而数据库必须读取并忽略这些行,这在...
**语法:** `limit_conn_zone $variable zone=name:size;` **配置段:** `http` 此指令用于定义存储会话状态的内存区域,其中键值为 `$variable` 变量的非空值。`size` 参数表示分配给所有键的共享内存大小。例如...
p-limit, 运行多个保证并发的&异步函数 限制 运行多个保证并发的&异步函数安装$ npm install p-limit用法const pLimit = require('p-limit');const limit = pLim
在MySQL数据库系统中,`LIMIT`子句是一个非常重要的部分,它用于限制SQL查询返回的结果集数量。在处理大量数据时,`LIMIT`是优化查询性能、避免过度消耗资源的有效手段。下面我们将深入探讨`LIMIT`子句的工作原理,...
### milter-limit安装指南 #### 一、简介 milter-limit 是 Sendmail 项目下的一个扩展功能,主要用于限制通过邮件服务器发送邮件的数量,以避免服务器被滥用为垃圾邮件的发送平台。它支持对指定的客户端 IP 地址、...
标题中的"ebt_limit.rar_limit"暗示我们正在讨论与网络过滤和限制相关的技术,特别是与Linux内核的Ebtables(Egress Blocking Tables)工具有关。Ebtables是Linux中用于控制数据包流向的一种工具,类似于iptables,...
Java笔记--Oracle中SQL不能用Limit的处理 在Java开发中,我们经常需要对数据库进行分页查询,但是Oracle数据库不支持Limit关键字,那么如何在Oracle中实现分页查询呢?下面,我们将详细介绍Oracle中SQL不能用Limit...
这篇博客文章《mybatis代码生成limit分页修复》可能探讨了在MBG生成的代码中,如何处理分页查询时遇到的问题,特别是与`LIMIT` SQL语句相关的错误。 首先,我们先理解一下`LIMIT`在MySQL中的作用。`LIMIT`用于限制...
MySQL中的分页查询是Web应用中常见的操作,但随着数据量的增长,`LIMIT`语句在处理大量数据时性能会显著下降。特别是当`OFFSET`值增大时,MySQL需要扫描更多的行来找到需要的数据,这可能导致查询速度变慢,甚至对...
DAILY_QUERY_OVER_LIMIT(解决方案).md