springCloud+Vue改造品优购第二章--------品牌管理分页功能后端完成

本文介绍了一种使用Map作为参数的分页查询实现方法,并详细展示了从Mapper到Controller各层的具体实现代码,包括如何通过反射机制自动填充分页参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分页+条件查询的实现方式大概有两类
- 封装成对象的方式
- 封装成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.youkuaiyun.com/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模块后续更新……..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值