为了简化mybatis-plus对IPage和Page的使用,这里简单封装了一个class
package com.github.xyhshen.boot.utils;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.ObjectUtils;
import java.util.*;
/**
* PageUtils
* mybatis plus分页支持
*
* @author xie_yh
* @date 2019/7/2 14:44
*/
public final class PageUtils {
private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
public static void setTotalCount(Long count) {
threadLocal.set(count);
}
public static long getTotalCount() {
return ObjectUtils.defaultIfNull(threadLocal.get(),-1L);
}
public static Page pageParam(Object ...params){
int length = ArrayUtils.getLength(params);
if(length < 2){
return page();
}
Map<String,Object> paramMap = new HashMap<>();
for(int i = 0;i < params.length / 2;i++){
paramMap.put(Objects.toString(params[i * 2]),params[i * 2 + 1]);
}
return page(paramMap);
}
public static Page pageMap(Map<?,?> map){
Map<String,Object> newMap = new HashMap<>();
for(Map.Entry<?,?> entry:map.entrySet()){
newMap.put(Objects.toString(entry.getKey()),entry.getValue());
}
return page(newMap);
}
public static Page page(Map<String,Object> map){
Long start = MapUtils.getLong(map,"start");
Integer limit = MapUtils.getInteger(map,"limit");
if(start == null || start < 0){
start = 0L;
}
if(limit == null || limit <= 0){
limit = Integer.MAX_VALUE;
}
return new InternalPage((start / limit) + 1,limit,ObjectUtils.defaultIfNull(map,Collections.emptyMap()));
}
public static Page page(){
return page(Collections.emptyMap());
}
public static <T> List<T> parse(IPage<T> result){
if(result == null){
setTotalCount(0L);
return Collections.emptyList();
}
setTotalCount(result.getTotal());
return result.getRecords();
}
}
class InternalPage extends Page implements Map<String,Object>{
private Map<String,Object> condition;
public InternalPage(long current, long size, Map<String,Object> condition){
super(current,size,true);
this.condition = condition;
}
/**
* @return Object>
* @see InternalPage#condition
**/
@Override
public Map<String, Object> condition() {
return condition;
}
@Override
public int size() {
return condition.size();
}
@Override
public boolean isEmpty() {
return condition.isEmpty();
}
@Override
public boolean containsKey(Object key) {
return condition.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return condition.containsValue(value);
}
@Override
public Object get(Object key) {
return condition.get(key);
}
@Override
public Object put(String key, Object value) {
return null;
}
@Override
public Object remove(Object key) {
return null;
}
@Override
public void putAll(Map<? extends String, ?> m) {
}
@Override
public void clear() {
}
@Override
public Set<String> keySet() {
return condition.keySet();
}
@Override
public Collection<Object> values() {
return condition.values();
}
@Override
public Set<Entry<String, Object>> entrySet() {
return condition.entrySet();
}
}
使用方法也很简单
如果需要创建Page对象,直接直接这么写就行
Page page = PageUtils.pageParam("start",10,"limit",50);
这个pageParam可以扩展增加其他参数,也可以缓存pageMap,支持map操作
Page page = PageUtils.pageParam("start",10,"limit",50,"userId",userId);
Map<String,Object> map = new HashMap<>();
map.put("start",10);
map.put("limit",50);
map.put("userId",userId);
Page page = PageUtils.pageMap(map);
然后解析返回的IPage<>内容
IPage<User> pages = userMapper.listUser(page);
List<User> users = PageUtils.parse(pages);
可以直接返回为list
最后这个util开启了count操作
若想返回总数可以直接,当然了仅在当前线程
long count = PageUtils.getTotalCount();