分页+条件查询的实现方式大概有两类
- 封装成对象的方式
- 封装成Map的形式
这里采取封装成map传参的实现
具体代码如下
TbBrandMapper.xml
<select id="getPage" resultType="java.util.Map">
select a.* from tb_brand a
where 1 = 1
<if test="params != null and params.name != null">
and a.name = #{params.name}
</if>
</select>
TbBrandMapper
/**
* 分页条件查询
* @param page 分页记录
* @param params 参数map
* @return
*/
List<Map<String, Object>> getPage(Pagination page, @Param("params")Map<String, Object> params);
TbBrandService
public Page<Map<String, Object>> getPage(Map<String, Object> qieryMap);
TbBrandServiceImpl
@Override
public Page<Map<String, Object>> getPage(Map<String, Object> queryParams) {
Page<Map<String, Object>> page = new Page<>();
page = InitPage.intanceFromMap(queryParams, page);
return page.setRecords(this.baseMapper.getPage(page, queryParams));
}
TbBrandController
@RequestMapping("/page")
public Page<Map<String, Object>> page(){
logger.info("provider--->queryMap[ "+this.getParams().toString()+" ]");
return brandService.getPage(this.getParams());
}
此处的getParams方法请查阅https://blog.csdn.net/weiqiang2/article/details/81557900
服务调用
@SuppressWarnings("unchecked")
@RequestMapping("/page")
public Page<Map<String, Object>> page(){
logger.info("queryMap[ "+this.getParams().toString()+" ]");
Map<String, Object> queryMap = new HashMap<>();
return template.getForObject(AppConsts.MANAGE_SERVICE_URL+"/brand/page"+InitPage.mapToQueryString(this.getParams()), Page.class, queryMap);
}
注意:调用服务的时候不能直接传参,因为此处是get方式调用,如果直接传参,在服务处并不能够获取到参数。我们需要将其map类型的参数转为字符串拼接在URL后面。具体的方法请参考InitPage类。
分页工具类
package com.pyg.page;
/**
* @Create on 2018年8月13日 下午8:58:25
* @Author: Wq
* @E-mail: 1432114216@qq.com
*/
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.plugins.pagination.Pagination;
public class InitPage {
/**
* 填充分页参数
* @param map 请求参数map
* @param page
* @return
*/
@Deprecated
public static <T> Page<T> init(Map<String,Object> map,Page<T> page){
if(map.containsKey("current"))
page.setCurrent(Integer.valueOf(map.get("current").toString()));
if(map.containsKey("size"))
page.setSize(Integer.valueOf(map.get("size").toString()));
if(map.containsKey("orderByField"))
page.setOrderByField(map.get("orderByField").toString());
if(map.containsKey("isAsc"))
page.setAsc(Boolean.valueOf(map.get("isAsc").toString()));
return page;
}
/**
* 反射赋值
* @param map 数据源
* @param page page对象
* @return
*/
public static <T> Page<T> intanceFromMap(Map<String,Object> map,Page<T> page){
if(map!=null && page!=null){
for(Map.Entry<String, Object> mp:map.entrySet()){
try{
Field field = Pagination.class.getDeclaredField(mp.getKey());
if(field!=null){
String fieldType = field.getGenericType().getTypeName();
field.setAccessible(true);
switch(fieldType){
case "java.lang.String":
field.set(page, mp.getValue().toString());
break;
case "java.lang.Boolean":
case "boolean":
Boolean val = false;
if(mp.getValue().getClass().getTypeName().equals("java.lang.Integer")){
val = Integer.valueOf(mp.getValue().toString())>0?true:false;
}else{
val = Boolean.valueOf(mp.getValue().toString());
}
field.set(page,val);
break;
case "java.lang.Integer":
case "int":
field.set(page, Integer.valueOf(mp.getValue().toString()));
break;
}
}
}catch(Exception e){}
}
}
return page;
}
/**
* 将Map转换成GET方式的查询条件
* @param queryMap map格式的参数
* @return
*/
public static String mapToQueryString(Map<String, Object> queryMap) {
StringBuilder queryString = new StringBuilder();
queryString.append("?");
for(String param: queryMap.keySet()) {
if(StringUtils.isNotBlank(queryMap.get(param).toString())) {
queryString.append(param+"="+queryMap.get(param)+"&");
}
}
return queryString.toString().substring(0, queryString.toString().length() - 1);
}
public static void main(String[] args) {
Map<String, Object> map = new HashMap<>();
map.put("name", "张三");
map.put("age", "16");
map.put("gender", "nan");
map.put("sa", "sa");
System.out.println(mapToQueryString(map));
}
}
到这里,分页功能的后端已基本完成,前端Vue模块后续更新……..