使用构造器模式动态构建Map作为mybatis的查询条件

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.xxx.xxx.service.snmp.Pair;
import com.xxx.xxx.service.snmp.TimeScope;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.beanutils.BeanMap;
import org.junit.Test;

import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.HashMap;
import java.util.Map;

@Data
@NoArgsConstructor
public class QueryConditionBuilder
{
    LocalDateTime startTime;
    LocalDateTime endTime;
    Long nodeId;
    Long fsId;
    Long memId;
    Long ifCardId;

    private QueryConditionBuilder(QueryConditionBuilder.Builder builder) {
        setStartTime(builder.startTime);
        setEndTime(builder.endTime);
        setNodeId(builder.nodeId);
        setFsId(builder.fsId);
        setMemId(builder.memId);
        setIfCardId(builder.ifCardId);
    }

    public static QueryConditionBuilder.Builder newBuilder() {
        return new QueryConditionBuilder.Builder();
    }


    public Map<String,Object> toFilter()
    {
        ObjectMapper mapper = new ObjectMapper();
        JavaTimeModule module = new JavaTimeModule();
        //https://github.com/networknt/light-4j/issues/82
        mapper.registerModule(module);
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.setSerializationInclusion(
JsonInclude.Include.NON_NULL); //2019-10-11更新代码,忽略值为null
        mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);//2019-10-11更新代码,忽略空字符串属性
        Map<String,Object> filter = mapper.convertValue(this,Map.class);
        System.out.printf("查询条件:%s
", JSON.toJSONString(filter));
        return filter;
    }


    //https://stackoverflow.com/questions/6796187/java-introspection-object-to-map/57057596#57057596
    public Map<String,Object> toFilter2(){
        Map<String, Object> filter = new HashMap<String, Object>();
        Map<Object, Object> introspected = new BeanMap(this);
        for (Map.Entry<Object, Object> entry:introspected.entrySet())
        {
            String key = (String)entry.getKey();
            if("class".equals(key)) continue;
            Object value = entry.getValue();
            filter.put(key,value);
        }
        return filter;
    }

    public static final class Builder {

        private LocalDateTime startTime;
        private LocalDateTime endTime;
        private Long nodeId = null;
        private Long fsId = null;
        private Long memId =null;
        private Long ifCardId = null;

        private Builder() {
        }

        public QueryConditionBuilder.Builder withStartTime(LocalDateTime val) {
            startTime = val;
            return this;
        }

        public QueryConditionBuilder.Builder withEndTime(LocalDateTime val) {
            endTime = val;
            return this;
        }

        public QueryConditionBuilder.Builder withNodeId(Long val) {
            nodeId = val;
            return this;
        }

        public QueryConditionBuilder.Builder withFsId(Long val) {
            fsId = val;
            return this;
        }

        public QueryConditionBuilder.Builder withMemId(Long val) {
            memId = val;
            return this;
        }

        public QueryConditionBuilder.Builder withIfCardId(Long val) {
            ifCardId = val;
            return this;
        }

        public QueryConditionBuilder build() {
            return new QueryConditionBuilder(this);
        }
    }

    @Test
    public void test()
    {
        Pair<Timestamp, Timestamp> scope = TimeScope.computeDate("24h");

        Timestamp startTime = scope.getFirst();
        Timestamp endTime = scope.getSecond();

        LocalDateTime now = LocalDateTime.now(ZoneId.of("+8"));
        LocalDateTime yesterday = now.plusHours(-24);

        Map<String, Object> condition = QueryConditionBuilder.newBuilder()
                .withStartTime(yesterday)
                .withEndTime(now)
                .build().toFilter();



        Map<String, Object> condition2 = QueryConditionBuilder.newBuilder()
                .withStartTime(yesterday)
                .withEndTime(now)
                .build().toFilter2();


        System.out.println(condition);

        System.out.println(condition2);
    }
}

输出结果:

查询条件:{"startTime":"2019-07-17T16:41:40.031","endTime":"2019-07-18T16:41:40.031"}
{startTime=2019-07-17T16:41:40.031, endTime=2019-07-18T16:41:40.031, nodeId=null, fsId=null, memId=null, ifCardId=null}
{fsId=null, startTime=2019-07-17T16:41:40.031, endTime=2019-07-18T16:41:40.031, nodeId=null, ifCardId=null, memId=null}
原文地址:https://www.cnblogs.com/passedbylove/p/11208299.html