mybatis常用经典分页方法

来自棱镜学院-在线IT教育www.prismcollege.com

分页方法一:

可以查看如下代码,新建一个数据库分页基础类

package com.ssm.utils.pagination.pagebounds;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
/**
 * 用于数据库分页
 * 使用方法如:public class XXXServiceImpl extends BasePageService implements IXXXService {
 * 然后代码中使用如:this.getPageList(XXXMapper.class,
							"selectObjectListMethod", sqlmapperParams, currentPage,pageSize);
 	其中currentPage由网页客户端保存,每次分页+1
 * @author Administrator
 *
 */
public class BasePageService {
	@Autowired
	private SqlSessionFactoryBean sqlSessionFactoryBean;

	public List<?> getPageList(Class<?> mapperClass, String sqlId,
			Object sqlParameter, int pageIndex, int pageSize) {
		SqlSession session = null;
		try {
			SqlSessionFactory sessionFactory = sqlSessionFactoryBean
					.getObject();
			session = sessionFactory.openSession();
			if (pageIndex <= 0) {
				pageIndex = 1;
			}
			if (pageSize <= 0) {
				pageSize = 10;
			}
			PageBounds pageBounds = new PageBounds(pageIndex, pageSize);
			List<Object> pageList = session.selectList(mapperClass.getName()
					+ "." + sqlId, sqlParameter, pageBounds);
			return pageList;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.close();
		}
		return null;
	}
}

分页方法2:

定义一个page基本类,用于网页与后端之间的页面传输封装

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import com.ssm.util.PageData;

public class Page {
	private int isM1 = 0; // 每页显示记录数
	private int isM2; // 每页显示记录数
	private int showCount = 10; // 每页显示记录数
	private int totalPage; // 总页数
	private int totalResult; // 总记录数
	private int currentPage = 1; // 当前页
	private int currentResult; // 当前记录起始索引
	private boolean entityOrField; // true:需要分页的地方,传入的参数就是Page实体;false:需要分页的地方,传入的参数所代表的实体拥有Page属性
	private String pageStr; // 最终页面显示的底部翻页导航,详细见:getPageStr();
	private PageData pd = new PageData();
	private int begin;
	private int end;
	// 总行数,需要外接传入
	private int rows;

	public int getIsM1() {
		return isM1;
	}

	public void setIsM1(int isM1) {
		this.isM1 = isM1;
	}

	public int getIsM2() {
		return isM2;
	}

	public void setIsM2(int isM2) {
		this.isM2 = isM2;
	}

	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}

	public int getBegin() {
		begin = (currentPage - 1) * showCount;
		return begin;
	}

	public void setBegin(int begin) {
		this.begin = begin;
	}

	public int getEnd() {
		end = currentPage * showCount;
		return end;
	}

	public void setEnd(int end) {
		this.end = end;
	}

	public Page() {
		// 通过page。txt设置每页显示的条数
		// String xmpath =
		// String.valueOf(Thread.currentThread().getContextClassLoader().getResource(""));
		// // System.out.println(xmpath);
		// xmpath = xmpath.substring(6)+"page.txt";
		// // System.out.println(xmpath);
		// this.showCount = Integer.parseInt(readTxtFile(xmpath));
	}

	public int getTotalPage() {
		if (rows % showCount == 0)
			totalPage = rows / showCount;
		else
			totalPage = rows / showCount + 1;
		return totalPage;
	}

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

	public int getTotalResult() {
		return totalResult;
	}

	public void setTotalResult(int totalResult) {
		this.totalResult = totalResult;
	}

	public int getCurrentPage() {
		if (currentPage <= 0)
			currentPage = 1;
		if (currentPage > getTotalPage())
			currentPage = getTotalPage();
		return currentPage;
	}

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

	// 用于显示页码
	public String getPageStr() {
		StringBuffer sb = new StringBuffer();
		if (totalResult > 0) {
			sb.append("	<ul>\n");
			if (currentPage == 1) {
				sb.append("	<li><a>共<font color=red>" + totalResult
						+ "</font>条</a></li>\n");
				sb.append("	<li><input type=\"number\" value=\"\" id=\"toGoPage\" style=\"width:50px;text-align:center;float:left\" placeholder=\"页码\"/></li>\n");
				sb.append("	<li style=\"cursor:pointer;\"><a οnclick=\"toTZ();\"  class=\"btn btn-mini btn-success\">跳转</a></li>\n");
				sb.append("	<li><a>首页</a></li>\n");
				sb.append("	<li><a>上页</a></li>\n");
			} else {
				sb.append("	<li><a>共<font color=red>" + totalResult
						+ "</font>条</a></li>\n");
				sb.append("	<li><input type=\"number\" value=\"\" id=\"toGoPage\" style=\"width:35px;text-align:center;\" placeholder=\"页码\"/></li>\n");
				sb.append("	<li style=\"cursor:pointer;\"><a οnclick=\"toTZ();\"  class=\"btn btn-mini btn-success\">跳转</a></li>\n");
				sb.append("	<li style=\"cursor:pointer;\"><a οnclick=\"nextPage(1)\">首页</a></li>\n");
				sb.append("	<li style=\"cursor:pointer;\"><a οnclick=\"nextPage("
						+ (currentPage - 1) + ")\">上页</a></li>\n");
			}
			int showTag = 3; // 分页标签显示数量
			int startTag = 1;
			if (currentPage > showTag) {
				startTag = currentPage - 1;
			}
			int endTag = startTag + showTag - 1;
			for (int i = startTag; i <= totalPage && i <= endTag; i++) {
				if (currentPage == i)
					sb.append("<li class=\"current\"><a>" + i + "</a></li>\n");
				else
					sb.append("	<li style=\"cursor:pointer;\"><a οnclick=\"nextPage("
							+ i + ")\">" + i + "</a></li>\n");
			}
			if (currentPage == totalPage) {
				sb.append("	<li><a>下页</a></li>\n");
				sb.append("	<li><a>尾页</a></li>\n");
			} else {
				sb.append("	<li style=\"cursor:pointer;\"><a οnclick=\"nextPage("
						+ (currentPage + 1) + ")\">下页</a></li>\n");
				sb.append("	<li style=\"cursor:pointer;\"><a οnclick=\"nextPage("
						+ totalPage + ")\">尾页</a></li>\n");
			}
			sb.append("	<li><a>第" + currentPage + "页</a></li>\n");
			sb.append("	<li><a>共" + totalPage + "页</a></li>\n");
			// sb.append("	<li style=\"cursor:pointer;\"><a οnclick=\"toTZ();\"  class=\"btn btn-mini btn-success\">跳转</a></li>\n");
			sb.append("</ul>\n");
			sb.append("<script type=\"text/javascript\">\n");
			sb.append("function nextPage(page){");
			sb.append("	if(true && document.forms[0]){\n");
			sb.append("		var url = document.forms[0].getAttribute(\"action\");\n");
			sb.append("		if(url.indexOf('?')>-1){url += \"&"
					+ (entityOrField ? "currentPage" : "page.currentPage")
					+ "=\";}\n");
			sb.append("		else{url += \"?"
					+ (entityOrField ? "currentPage" : "page.currentPage")
					+ "=\";}\n");
			sb.append("		document.forms[0].action = url+page;\n");
			sb.append("		document.forms[0].submit();\n");
			sb.append("	}else{\n");
			sb.append("		var url = document.location+'';\n");
			sb.append("		if(url.indexOf('?')>-1){\n");
			sb.append("			if(url.indexOf('currentPage')>-1){\n");
			sb.append("				var reg = /currentPage=\\d*/g;\n");
			sb.append("				url = url.replace(reg,'currentPage=');\n");
			sb.append("			}else{\n");
			sb.append("				url += \"&"
					+ (entityOrField ? "currentPage" : "page.currentPage")
					+ "=\";\n");
			sb.append("			}\n");
			sb.append("		}else{url += \"?"
					+ (entityOrField ? "currentPage" : "page.currentPage")
					+ "=\";}\n");
			sb.append("		document.location = url + page;\n");
			sb.append("	}\n");
			sb.append("}\n");
			sb.append("function toTZ(){");
			sb.append("var toPaggeVlue = document.getElementById(\"toGoPage\").value;");
			sb.append("if(toPaggeVlue == ''){document.getElementById(\"toGoPage\").value=1;return;}");
			sb.append("if(isNaN(Number(toPaggeVlue))){document.getElementById(\"toGoPage\").value=1;return;}");
			sb.append("nextPage(toPaggeVlue);");
			sb.append("}\n");
			sb.append("</script>\n");
		}
		pageStr = sb.toString();
		return pageStr;
	}

	public void setPageStr(String pageStr) {
		this.pageStr = pageStr;
	}

	public int getShowCount() {
		return showCount;
	}

	public void setShowCount(int showCount) {

		this.showCount = showCount;
	}

	public int getCurrentResult() {
		currentResult = (getCurrentPage() - 1) * getShowCount();
		if (currentResult < 0)
			currentResult = 0;
		return currentResult;
	}

	public void setCurrentResult(int currentResult) {
		this.currentResult = currentResult;
	}

	public boolean isEntityOrField() {
		return entityOrField;
	}

	public void setEntityOrField(boolean entityOrField) {
		this.entityOrField = entityOrField;
	}

	public PageData getPd() {
		return pd;
	}

	public void setPd(PageData pd) {
		this.pd = pd;
	}

	// 读取文件
	public String readTxtFile(String filePath) {
		try {
			String encoding = "utf-8";
			File file = new File(filePath);
			if (file.isFile() && file.exists()) { // 判断文件是否存在
				InputStreamReader read = new InputStreamReader(
						new FileInputStream(file), encoding);// 考虑到编码格式
				BufferedReader bufferedReader = new BufferedReader(read);
				String lineTxt = null;
				while ((lineTxt = bufferedReader.readLine()) != null) {
					return lineTxt;
				}
				read.close();
			} else {
				System.out.println("找不到指定的文件");
			}
		} catch (Exception e) {
			System.out.println("读取文件内容出错");
			e.printStackTrace();
		}
		return "";
	}
}


下面这个类PageData为扩展使用,目前暂未使用

package com.ssm.util;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

public class PageData extends HashMap implements Map{
	private static final long serialVersionUID = 1L;
	Map map = null;
	HttpServletRequest request;
	
	//获取请求参数和请求参数值的map
	public PageData(HttpServletRequest request){
		this.request = request;
		Map properties = request.getParameterMap();
		Map returnMap = new HashMap(); 
		Iterator entries = properties.entrySet().iterator(); 
		Map.Entry entry; 
		String name = "";  
		String value = "";  
		while (entries.hasNext()) {
			entry = (Map.Entry) entries.next(); 
			name = (String) entry.getKey(); 
			Object valueObj = entry.getValue(); 
			if(null == valueObj){ 
				value = ""; 
			}else if(valueObj instanceof String[]){ 
				String[] values = (String[])valueObj;
				for(int i=0;i<values.length;i++){ 
					 value = values[i] + ",";
				}
				value = value.substring(0, value.length()-1); 
			}else{
				value = valueObj.toString(); 
			}
			returnMap.put(name, value); 
		}
		map = returnMap;
	}
	
	public PageData() {
		map = new HashMap();
	}
	
	@Override
	public Object get(Object key) {
		Object obj = null;
		if(map.get(key) instanceof Object[]) {
			Object[] arr = (Object[])map.get(key);
			obj = request == null ? arr:(request.getParameter((String)key) == null ? arr:arr[0]);
		} else {
			obj = map.get(key);
		}
		return obj;
	}
	
	public String getString(Object key) {
		return (String)get(key);
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public Object put(Object key, Object value) {
		return map.put(key, value);
	}
	
	@Override
	public Object remove(Object key) {
		return map.remove(key);
	}

	public void clear() {
		map.clear();
	}

	public boolean containsKey(Object key) {
		return map.containsKey(key);
	}

	public boolean containsValue(Object value) {
		return map.containsValue(value);
	}

	public Set entrySet() {
		return map.entrySet();
	}

	public boolean isEmpty() {
		return map.isEmpty();
	}

	public Set keySet() {
		return map.keySet();
	}

	@SuppressWarnings("unchecked")
	public void putAll(Map t) {
		map.putAll(t);
	}

	public int size() {
		return map.size();
	}

	public Collection values() {
		return map.values();
	}
}

接下来可根据page定义一个更加具体的页面和后端传输的页面封装类,如

import java.io.Serializable;
import java.util.List;

public class XXXPage extends Page implements Serializable{
	private String identity_type;
	private String username;
	private String name;
	private String city;
	private List<String> freeTimeList;
	private String[] jobType;
	private List<String> createdTimeList;
	********************************
	public String getIdentity_type() {
		return identity_type;
	}
	public void setIdentity_type(String identity_type) {
		this.identity_type = identity_type;
	}
}

下一步可在controller的action中使用 如

public String listPageData(Model model, XXXPage page,HttpServletRequest request) {

xxxxxxxxx;

}
并在传回客户端时可 model.addAttribute("page", page);


其中 mybatis中操作

List<XXXBean> list = userMapper.findXXXByPage(page);//得到满足条件的招聘用户列表
int rows = xxxMapper.findRows(page);//得到满足条件的行数

page.setRows(rows);

只需要在mapper中sql中 进行sql分页  limit  #{begin,jdbcType=INTEGER},#{showCount,jdbcType=INTEGER} 即可。

分页方法3:

修改mybatis自带的rowbound内存分页为物理分页

新建类Page_duan 

import java.util.List;
import java.util.Map;
import org.codehaus.jackson.map.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

public class Page_duan {
	private static final long serialVersionUID = -399284318168302833L;  
	private static final Logger logger = LoggerFactory
			.getLogger(Page_duan.class);
	private static ObjectMapper mapper = new ObjectMapper();
	public static String DEFAULT_PAGESIZE = "10";
	private int pageNo; // 当前页码
	private int pageSize; // 每页行数
	private int totalRecord; // 总记录数
	private int totalPage; // 总页数
	private Map<String, String> params; // 查询条件
	private Map<String, List<String>> paramLists; // 数组查询条件
	private String searchUrl; // Url地址
	private String pageNoDisp; // 可以显示的页号(分隔符"|",总页数变更时更新)

	private Page_duan() {
		pageNo = 1;
		pageSize = Integer.valueOf(DEFAULT_PAGESIZE);
		totalRecord = 0;
		totalPage = 0;
		params = Maps.newHashMap();
		paramLists = Maps.newHashMap();
		searchUrl = "";
		pageNoDisp = "";
	}

	public int getPageNo() {
		return pageNo;
	}

	public void setPageNo(int pageNo) {
		this.pageNo = pageNo;
	}

	public int getPageSize() {
		return pageSize;
	}

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

	public int getTotalRecord() {
		return totalRecord;
	}

	public void setTotalRecord(int totalRecord) {
		this.totalRecord = totalRecord;
		refreshPage();
	}

	public int getTotalPage() {
		return totalPage;
	}

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

	public Map<String, String> getParams() {
		return params;
	}

	public void setParams(Map<String, String> params) {
		this.params = params;
	}

	public Map<String, List<String>> getParamLists() {
		return paramLists;
	}

	public void setParamLists(Map<String, List<String>> paramLists) {
		this.paramLists = paramLists;
	}

	public String getSearchUrl() {
		return searchUrl;
	}

	public void setSearchUrl(String searchUrl) {
		this.searchUrl = searchUrl;
	}

	public String getPageNoDisp() {
		return pageNoDisp;
	}

	public void setPageNoDisp(String pageNoDisp) {
		this.pageNoDisp = pageNoDisp;
	}

	public static Page_duan newBuilder(int pageNo, int pageSize, String url) {
		Page_duan page = new Page_duan();
		page.setPageNo(pageNo);
		page.setPageSize(pageSize);
		page.setSearchUrl(url);
		return page;
	}

	/**
	 * 查询条件转JSON
	 */
	public String getParaJson() {
		Map<String, Object> map = Maps.newHashMap();
		for (String key : params.keySet()) {
			if (params.get(key) != null) {
				map.put(key, params.get(key));
			}
		}
		String json = "";
		try {
			json = mapper.writeValueAsString(map);
		} catch (Exception e) {
			logger.error("转换JSON失败", params, e);
		}
		return json;
	}

	/**
	 * 数组查询条件转JSON
	 */
	public String getParaListJson() {
		Map<String, Object> map = Maps.newHashMap();
		for (String key : paramLists.keySet()) {
			List<String> lists = paramLists.get(key);
			if (lists != null && lists.size() > 0) {
				map.put(key, lists);
			}
		}
		String json = "";
		try {
			json = mapper.writeValueAsString(map);
		} catch (Exception e) {
			logger.error("转换JSON失败", params, e);
		}
		return json;
	}

	/**
	 * 总件数变化时,更新总页数并计算显示样式
	 */
	private void refreshPage() {
		// 总页数计算
		totalPage = totalRecord % pageSize == 0 ? totalRecord / pageSize
				: (totalRecord / pageSize + 1);
		// 防止超出最末页(浏览途中数据被删除的情况)
		if (pageNo > totalPage && totalPage != 0) {
			pageNo = totalPage;
		}
		pageNoDisp = computeDisplayStyleAndPage();
	}

	/**
	 * 计算页号显示样式 这里实现以下的分页样式("[]"代表当前页号),可根据项目需求调整 [1],2,3,4,5,6,7,8..12,13
	 * 1,2..5,6,[7],8,9..12,13 1,2..6,7,8,9,10,11,12,[13]
	 */
	private String computeDisplayStyleAndPage() {
		List<Integer> pageDisplays = Lists.newArrayList();
		if (totalPage <= 11) {
			for (int i = 1; i <= totalPage; i++) {
				pageDisplays.add(i);
			}
		} else if (pageNo < 7) {
			for (int i = 1; i <= 8; i++) {
				pageDisplays.add(i);
			}
			pageDisplays.add(0);// 0 表示 省略部分(下同)
			pageDisplays.add(totalPage - 1);
			pageDisplays.add(totalPage);
		} else if (pageNo > totalPage - 6) {
			pageDisplays.add(1);
			pageDisplays.add(2);
			pageDisplays.add(0);
			for (int i = totalPage - 7; i <= totalPage; i++) {
				pageDisplays.add(i);
			}
		} else {
			pageDisplays.add(1);
			pageDisplays.add(2);
			pageDisplays.add(0);
			for (int i = pageNo - 2; i <= pageNo + 2; i++) {
				pageDisplays.add(i);
			}
			pageDisplays.add(0);
			pageDisplays.add(totalPage - 1);
			pageDisplays.add(totalPage);
		}
		return Joiner.on("|").join(pageDisplays.toArray());
	}

}

新建如下类

import java.util.Properties;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Invocation;
import java.sql.Connection;  
import java.sql.PreparedStatement;  
import java.sql.ResultSet;  
import java.util.Properties;  
import org.apache.commons.jxpath.JXPathContext;  
import org.apache.commons.jxpath.JXPathNotFoundException;  
import org.apache.ibatis.executor.Executor;  
import org.apache.ibatis.executor.parameter.DefaultParameterHandler;  
import org.apache.ibatis.mapping.BoundSql;  
import org.apache.ibatis.mapping.MappedStatement;  
import org.apache.ibatis.mapping.MappedStatement.Builder;  
import org.apache.ibatis.mapping.ParameterMapping;  
import org.apache.ibatis.mapping.SqlSource;  
import org.apache.ibatis.plugin.Interceptor;  
import org.apache.ibatis.plugin.Intercepts;  
import org.apache.ibatis.plugin.Invocation;  
import org.apache.ibatis.plugin.Plugin;  
import org.apache.ibatis.plugin.Signature;  
import org.apache.ibatis.session.ResultHandler;  
import org.apache.ibatis.session.RowBounds;

@Intercepts({@Signature(type=Executor.class,method="query",
args={ MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class })})  
public class PageHelper_duan implements Interceptor {

	@Override
	public Object intercept(Invocation invocation) throws Throwable {  
	      
	    //当前环境 MappedStatement,BoundSql,及sql取得  
	    MappedStatement mappedStatement=(MappedStatement)invocation.getArgs()[0];      
	    Object parameter = invocation.getArgs()[1];   
	    BoundSql boundSql = mappedStatement.getBoundSql(parameter);   
	    String originalSql = boundSql.getSql().trim();  
	    Object parameterObject = boundSql.getParameterObject();  
	  
	    //Page对象获取,“信使”到达拦截器!  
	    Page_duan page = searchPageWithXpath(boundSql.getParameterObject(),".","page","*/page");  
	  
	    if(page!=null ){  
	      //Page对象存在的场合,开始分页处理  
	      String countSql = getCountSql(originalSql);  
	      Connection connection=mappedStatement.getConfiguration()
	    		  			.getEnvironment().getDataSource().getConnection()  ;            
	      PreparedStatement countStmt = connection.prepareStatement(countSql);    
	      BoundSql countBS = copyFromBoundSql(mappedStatement, boundSql, countSql);  
	      DefaultParameterHandler parameterHandler = new DefaultParameterHandler(mappedStatement, parameterObject, countBS);  
	      parameterHandler.setParameters(countStmt);  
	      ResultSet rs = countStmt.executeQuery();  
	      int totpage=0;  
	      if (rs.next()) {    
	        totpage = rs.getInt(1);    
	      }  
	      rs.close();    
	      countStmt.close();    
	      connection.close();  
	        
	      //分页计算  
	      page.setTotalRecord(totpage);  
	      //对原始Sql追加limit  
	      int offset = (page.getPageNo() - 1) * page.getPageSize();  
	      StringBuffer sb = new StringBuffer();  
	      sb.append(originalSql).append(" limit ").append(offset).append(",").append(page.getPageSize());  
	      BoundSql newBoundSql = copyFromBoundSql(mappedStatement, boundSql, sb.toString());  
	      MappedStatement newMs = copyFromMappedStatement(mappedStatement,new BoundSqlSqlSource(newBoundSql));    
	      invocation.getArgs()[0]= newMs;    
	    }  
	    return invocation.proceed();  
	      
	  }  

	
	
	/** 
	   * 根据给定的xpath查询Page对象 
	   */  
	  private Page_duan searchPageWithXpath(Object o,String... xpaths) {  
	    JXPathContext context = JXPathContext.newContext(o);  
	    Object result;  
	    for(String xpath : xpaths){  
	      try {  
	        result = context.selectSingleNode(xpath);  
	      } catch (JXPathNotFoundException e) {  
	        continue;  
	      }  
	      if ( result instanceof Page_duan ){  
	        return (Page_duan)result;  
	      }  
	    }  
	    return null;  
	  }  
	  
	  /** 
	   * 复制MappedStatement对象 
	   */  
	  private MappedStatement copyFromMappedStatement(MappedStatement ms,SqlSource newSqlSource) {  
	    Builder builder = new Builder(ms.getConfiguration(),ms.getId(),newSqlSource,ms.getSqlCommandType());  
	      
	    builder.resource(ms.getResource());  
	    builder.fetchSize(ms.getFetchSize());  
	    builder.statementType(ms.getStatementType());  
	    builder.keyGenerator(ms.getKeyGenerator()); 
	    for(String pro : ms.getKeyProperties())
	    	builder.keyProperty(pro); 
	    builder.timeout(ms.getTimeout());  
	    builder.parameterMap(ms.getParameterMap());  
	    builder.resultMaps(ms.getResultMaps());  
	    builder.resultSetType(ms.getResultSetType());  
	    builder.cache(ms.getCache());  
	    builder.flushCacheRequired(ms.isFlushCacheRequired());  
	    builder.useCache(ms.isUseCache());  
	    return builder.build();  
	  }  
	  
	  /** 
	   * 复制BoundSql对象 
	   */  
	  private BoundSql copyFromBoundSql(MappedStatement ms, BoundSql boundSql, String sql) {  
	    BoundSql newBoundSql = new BoundSql(ms.getConfiguration(),sql, boundSql.getParameterMappings(), boundSql.getParameterObject());  
	    for (ParameterMapping mapping : boundSql.getParameterMappings()) {  
	        String prop = mapping.getProperty();  
	        if (boundSql.hasAdditionalParameter(prop)) {  
	            newBoundSql.setAdditionalParameter(prop, boundSql.getAdditionalParameter(prop));  
	        }  
	    }  
	    return newBoundSql;  
	  }  
	  
	  /** 
	   * 根据原Sql语句获取对应的查询总记录数的Sql语句 
	   */  
	  private String getCountSql(String sql) {  
	    return "SELECT COUNT(*) FROM (" + sql + ") aliasForPage";  
	  }  
	  
	  public class BoundSqlSqlSource implements SqlSource {    
	      BoundSql boundSql;    
	      public BoundSqlSqlSource(BoundSql boundSql) {    
	        this.boundSql = boundSql;    
	      }    
	      public BoundSql getBoundSql(Object parameterObject) {    
	        return boundSql;    
	      }    
	    }    
	  @Override
	  public Object plugin(Object arg0) {  
	     return Plugin.wrap(arg0, this);  
	  }



	@Override
	public void setProperties(Properties arg0) {
		// TODO Auto-generated method stub
		
	}  

}
java,架构技术学习 欢迎加QQ群交流: 368614849 14

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis-Plus提供了多种分页方法供开发者使用。其中,常用方法是使用Page对象进行分页查询。开发者可以通过创建Page对象,并将需要查询的页码和每页显示的数量设置到Page对象中,然后调用Mybatis-Plus提供的selectPage方法进行分页查询。 另外,Mybatis-Plus还提供了一种更高级的分页方式,即通过自定义拦截器实现分页功能。该拦截器会拦截所有需要分页的查询语句,并在sql语句后面加上limit分页的相关语句,从而实现分页查询。这样可以避免每条sql都写分页语句的冗余,并提高维护性。对于想要使用这种方式的开发者,可以直接使用Mybatis Plus提供的分页插件,无需自己编写拦截器。 要使用Mybatis-Plus进行分页查询,首先需要添加Mybatis-Plus的依赖。可以在项目的pom.xml文件中添加以下依赖配置: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.1.8</version> </dependency> ``` 添加依赖后,就可以在项目中使用Mybatis-Plus的分页功能了。具体的分页方法和用法可以参考Mybatis-Plus的官方文档或示例代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Mybatis Plus 自定义方法实现分页](https://blog.csdn.net/u013452337/article/details/88392824)[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_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值