电子证照:mongdb分页(spring data)+DBCursor大数据量的分页方法

controller层;

@RequestMapping("/getPageData")
@ResponseBody
public Page<Electronic> getPageData(HttpServletRequest request) {
	//List<Electronic> electronic=new List<Electronic>();
	Map<String, Object> record = HttpUtils.getRequestMap(request);
//	LicenceMaintServiceImpl.getPageDate();
	return  LicenceMaintServiceImpl.getPageDate(request) ;
}

service层:

    public Page<Electronic> getPageDate(HttpServletRequest request) {
/*
     注释的代码为大数据量用的快速分页方法
     List<Map> list = new ArrayList<Map>();
        Map map = new HashMap();
        map.put(WHERE_KEY, "certificate_name");
        map.put(WHERE_VALUE, "证照名称");
        list.add(map);
        BasicDBObject totalCon =new BasicDBObject();
        int i=1;
       totalCon.put("_id", new BasicDBObject(QueryOperators.GT, i));
        BasicDBObject fields =new BasicDBObject();
        fields.put("_id",true);
        fields.put("certificate_name",true);
        fields.put("catalog_id",true);
        List<Electronic> largeList= MongoUtils.toVo(LicenceMaintMapper.largePageList(0,100,"ELECTRONIC_CERTIFICATE",totalCon,fields),Electronic.class);*/
        Query query =new  Query();
        Page<Electronic> page =new Page<Electronic>(request);


        return   LicenceMaintMapper.findPage(page,query,"ELECTRONIC_CERTIFICATE");
    }

mapper 分页查询:

/** /**
  * @description: 分页查询
  * @param query:条件,collectionName:集合名
  * @return ${return_type} 
  * @throws
  * @author lizz
  * @date 2019/7/9 20:41
  */
    public Page<T> findPage(Page<T> page, Query query, String collectionName){
        long count = this.count(query, collectionName);
        page.setTotal(count);
        int pageNumber = page.getPagenumber();
        int pageSize = page.getPageSize();
       // query.skip((pageNumber - 1) * pageSize).limit(pageSize);
        query.skip((pageNumber)).limit(pageSize);
        List<T> rows = this.find(query, collectionName);
        page.setLength(pageSize);
        page.setData(rows);
        page.setRecordsTotal(count); // 设置从多少条记录中检索
       page.setRecordsFiltered(count); // 设置总共多少条
        return page;
    }

封装的实体类:用于前端的datatable交互

package com.sdyy.common.mongodb.page;

import com.sdyy.common.page.Columns;
import com.sdyy.common.page.OrderBy;
import com.sdyy.common.page.Search;
import com.sdyy.common.utils.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
/** /**
  * @description: mongo分页实体类
  * @param ${tags} 
  * @return ${return_type} 
  * @throws
  * @author lizz
  * @date 2019/7/10 15:59
  */
public class Page<T>{
	private int start;
	private int length;
	private String search;
	private long total;
	private List<T> data;
	private long recordsTotal;
	private	long recordsFiltered;
	private int pageSize;
	private int pagenumber;
	private List<Columns> columns = new ArrayList<Columns>();

	public long getRecordsTotal() {
		return recordsTotal;
	}

	public void setRecordsTotal(long recordsTotal) {
		this.recordsTotal = recordsTotal;
	}

	public long getRecordsFiltered() {
		return recordsFiltered;
	}

	public void setRecordsFiltered(long recordsFiltered) {
		this.recordsFiltered = recordsFiltered;
	}

	public int getStart() {
		return start;
	}

	public void setStart(int start) {
		this.start = start;
	}

	public int getLength() {
		return length;
	}

	public void setLength(int length) {
		this.length = length;
	}

	public String getSearch() {
		return search;
	}

	public void setSearch(String search) {
		this.search = search;
	}

	public List<Columns> getColumns() {
		return columns;
	}

	public void setColumns(List<Columns> columns) {
		this.columns = columns;
	}


	public List<T> getData() {
		return data;
	}

	public void setData(List<T> data) {
		this.data = data;
	}

	/**
	 * @return the pageSize
	 */
	public int getPageSize() {
		return pageSize;
	}
	/**
	 * @param pageSize the pageSize to set
	 */
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	/**
	 * @return the pagenumber
	 */
	public int getPagenumber() {
		return pagenumber;
	}
	/**
	 * @param pagenumber the pagenumber to set
	 */
	public void setPagenumber(int pagenumber) {
		this.pagenumber = pagenumber;
	}
	/**
	 * @return the total
	 */
	public long getTotal() {
		return total;
	}
	/**
	 * @param total the total to set
	 */
	public void setTotal(long total) {
		this.total = total;
	}
	public Page(HttpServletRequest request) {
		this.start = StringUtils.getIntValue(request.getParameter("start"));
		this.length = StringUtils.getIntValue(request.getParameter("length"));
this.pagenumber=this.start;
this.pageSize=this.length;
		Search s = new Search();
		s.setValue(request.getParameter("search[value]"));
		s.setRegex(Boolean.getBoolean(request.getParameter("search[regex]")));

		//this.search = s;

		int i = 0;
		while (request.getParameter("columns[" + i + "][data]") != null) {
			Columns c = new Columns();
			c.setData(request.getParameter("columns[" + i + "][data]"));
			c.setName(request.getParameter("columns[" + i + "][name]"));
			c.setSearchable(StringUtils.getBoolean(request.getParameter("columns[" + i + "][searchable]")));
			c.setOrderable(StringUtils.getBoolean(request.getParameter("columns[" + i + "][orderable]")));
			// search暂时用不到
			columns.add(c);
			i++;

		}

		i = 0;

		while (request.getParameter("order[" + i + "][column]") != null) {
			/***
			 * 2018/05/04升级,增加使用对象时,datatable可以进行排序功能
			 */
			String column = null;
			OrderBy o = new OrderBy();
			String orderColumnSNum = request.getParameter("order[" + i + "][column]");
			int orderColumn = StringUtils.getIntValue(orderColumnSNum);
			column = columns.get(orderColumn).getName();
			if(StringUtils.isEmpty(column)) {
				column = columns.get(orderColumn).getData();
			}
			o.setColumn(column);
			o.setDir(request.getParameter("order[" + i + "][dir]"));
			//order.add(o);
			i++;
		}

	}

}

前端jsp:
<%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
<%@ include file="…/…/…/common/form_editor_header.jsp"%>

填报 取回 提交 导入数据 删除
							</div>
							<div class="row jueselb">
								<table class="table table-bordered">
									<tr>
										<td class="active">状态</td>
										<td >全部</td>
										<td >暂存草稿</td>
										<td >审核中</td>
										<td>退回</td>
										<td>等待生成</td>
										<td>生成失败</td>
									</tr>
								</table>
							</div>
						</div>
						<table class="table table-striped table-bordered table-hover datatable" id="licenceListTable">
							<thead>
							<tr role="row" class="heading">
								<th><input type="checkbox" id="checkAlllicence"  class="group-checkable" data-set="#licenceListTable .checkboxes" /></th>
								<th class="bianhao">编号</th>
								<th>持证者</th>
								<th>名称</th>
                                <th>颁发日期</th>
								<th>编码/文号</th>
                                <th>状态</th>
                                <th>操作</th>
							</tr>
							</thead>
						</table>
					</div>

				</div>
			</div>
		</div>
	</section>
</div>

ps:

大数据量分页
采用的是用前一次查询的id作为条件 省去了skip时间
参考:
https://blog.csdn.net/heihu_malice7/article/details/78958916
https://www.cnblogs.com/qingming/p/6419474.html
/** /**
  * @description: 大数据量分页
  * @param ${tags}
  * @return ${return_type}
  * @throws
  * @author lizz
  * @date 2019/7/10 11:25
  */
public DBCursor largePageList(int page, int pageSize, String collectionName, BasicDBObject totalCon, BasicDBObject fields) {
try {

        return mongoTemplate.getCollection(collectionName).find(totalCon,fields).sort(new BasicDBObject("_id", 1)).limit(pageSize);
    } catch (Exception e) {
        logger.error("***大数据量数据分页查询失败,collectionName=" + collectionName+e.getCause().getMessage());
    }
    return null;
}

DBCursor转换实体类工具:

/**
 * @author li
 * @title: MongoUtils
 * @projectName licence
 * @description: TODO
 * @date 2019/7/1011:40
 */
public class MongoUtils {
    /* /**
      * @description: 强转list<T>
      * @param ${tags} 
      * @return ${return_type} 
      * @throws
      * @author lizz
      * @date 2019/7/10 11:40
      */
    public static <T> List<T> toVo(DBCursor dc, Class<T> c) {
        List<T> list = new ArrayList<>();
        while (dc.hasNext()) {
            DBObject dbObj = dc.next();
            T t = (T) dbObj;
            list.add(t);
        }
        return list;
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mongodb分页的java实现可以使用skip和limit方法来实现。首先,你需要获取到DBCollection对象,然后使用find方法来查询需要分页的数据。在查询方法中,你可以使用skip方法来指定跳过的记录数,使用limit方法来指定每页的记录数。以下是一个示例的代码实现: ```java DB myMongo = MongoManager.getDB("myMongo"); DBCollection userCollection = myMongo.getCollection("user"); int page = 1; // 当前页码 int pageSize = 10; // 每页记录数 DBCursor cursor = userCollection.find() .skip((page - 1) * pageSize) .limit(pageSize); List<User> userList = new ArrayList<User>(); while (cursor.hasNext()) { User user = new User(); user.parse(cursor.next()); userList.add(user); } return userList; ``` 上述代码中,我们使用了skip方法来跳过前面的记录,limit方法来限制查询结果的数。在循环中,我们将查询到的数据添加到一个List中,并返回该List作为分页结果。 另外,你还可以使用第三方库mongo-page-helper来简化分页操作。你需要引入该库的依赖,并在配置中添加对应的Bean。具体的使用方法可以参考该库的文档。 总结起来,mongodb分页的java实现可以通过skip和limit方法来实现,或者使用第三方库来简化操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [mongodb系列之三:java分页](https://blog.csdn.net/lkx94/article/details/45013739)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MongoDB分页的Java实现和分页需求的思考](https://blog.csdn.net/qq_39595769/article/details/121670628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值