zoukankan      html  css  js  c++  java
  • 使用构造器模式动态构建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}
  • 相关阅读:
    select移动选项
    jFinal+AngularJs未来javaEE开发的趋势——程序员的福音 .
    MVC框架PK:Angular、Backbone、CanJS与Ember
    错误 1093 You can't specify target table 'table name' for update in FROM clause
    Angularjs开发一些经验总结
    需求调研的步骤、方法
    MyEclipse如何跟踪调试
    需求入门: 软件需求的三个层次
    JAVA的Random类(转)
    Java中从[1,36]随机生成7个不重复的数字,放入一个数组中
  • 原文地址:https://www.cnblogs.com/passedbylove/p/11208299.html
Copyright © 2011-2022 走看看