zoukankan      html  css  js  c++  java
  • 封装与职责分离的开发思维

    1:封装:参数过多应该封装成一个对象

    2:职责分离:谁拥有该数据,谁就应该包含操作该数据的方法

    ■ 举例:没有封装【多个查询条件作为参数 (String name, Integer minAge, Integer maxAge, Integer dormBuildId)

        @Override
        public List<Teacher> query(String name, Integer minAge, Integer maxAge, Integer dormBuildId) {
            StringBuilder sql = new StringBuilder();
            sql.append("SELECT * FROM t_teacher WHERE 1=1");
            //封装占位符参数
            List<Object> parameters = new ArrayList<>();
    //拼接sql和设置占位符参数值

       //姓名 if (StringUtils.isNotBlank(name)) { sql.append(" AND name LIKE ?"); parameters.add("%" + name + "%"); } //最小年龄 if(minAge != null) { sql.append(" AND age >= ?"); parameters.add(minAge); } //最大年龄 if(maxAge != null) { sql.append(" AND age <= ?"); parameters.add(maxAge); } System.out.println("sql=" + sql); System.out.println("parameters=" + parameters); return JdbcTemplate.query(sql.toString(), new BeanListHandler<>(Teacher.class), parameters.toArray()); }

    ■ 封装:将多个查询条件参数 (String name, Integer minAge, Integer maxAge, Integer dormBuildId) 封装成一个对象:

    @Data
    public class TeacherQueryObject {
        private String name;
        private Integer minAge;
        private Integer maxAge;
        private Integer dormBuildId;
    }

    ■ 没有实现职责分离的情况:

        @Override
        public List<Teacher> query(TeacherQueryObject tqo) {
            StringBuilder sql = new StringBuilder();
            sql.append("SELECT * FROM t_teacher WHERE 1=1");
            //封装占位符参数
            List<Object> parameters = new ArrayList<>();

           // 拼接sql语句和设置占位符参数值
            //姓名
            if (StringUtils.isNotBlank(tqo.getName())) {
                sql.append(" AND name LIKE ?");
                parameters.add("%" + tqo.getName() + "%");
            }

      。。。。。

    }

    ■ 职责分离(谁拥有该数据,谁就应该包含操作该数据的方法):

    ❀ 要拼接的sql语句的数据时在tqo对象里的,且占位符的参数设置数据也是在tqo对象,则tqo对象应该提供对应的方法

    package com.shan.query;
    
    import java.util.ArrayList;
    import java.util.List;
    import org.apache.commons.lang3.StringUtils;
    import lombok.Data;
    
    @Data
    public class TeacherQueryObject {
        private String name;
        private Integer minAge;
        private Integer maxAge;
        private Integer dormBuildId;
    //    // 封装占位符参数
        private List<Object> parameters = new ArrayList<>();
        
        public TeacherQueryObject() {};
        public TeacherQueryObject(String name, Integer minAge, Integer maxAge, Integer dormBuildId) {
            this.name = name;
            this.minAge = minAge;
            this.maxAge = maxAge;
            this.dormBuildId = dormBuildId;
            this.parameters = parameters;
        }
            
        public String getQuery() {
            StringBuilder sql = new StringBuilder();
            sql.append(" WHERE 1=1");
            // 拼接姓名
            if (StringUtils.isNotBlank(name)) {
                sql.append(" AND name LIKE ?");        
                parameters.add("%" + name + "%");
            }
            // 拼接最小年龄
            if (minAge != null) {
                sql.append(" AND age >= ?");    
                parameters.add(minAge);
            }
            // 拼接最大年龄
            if (maxAge != null) {
                sql.append(" AND age <= ?");
                parameters.add(maxAge);
            }
            return sql.toString();
        }
        
        public List<Object> getParameters() {
            return parameters;
        }
    
    }
        // 高级查询
        @Override
        public List<Teacher> query(TeacherQueryObject tqo) {
            //职责分离【要拼接的sql语句的数据时在tqo对象里的,且占位符的参数设置数据也是在tqo对象,则tqo对象应该提供对应的方法】
            String querySql = tqo.getQuery();
            String sql = "select * from t_teacher" + querySql;
            List<Object> parameters = tqo.getParameters();
            System.out.println(querySql);
            System.out.println(parameters);
            return JdbcTemplate.query(sql, new BeanListHandler<>(Teacher.class), parameters.toArray());
        }

    本文来自博客园,作者:一乐乐,转载请注明原文链接:https://www.cnblogs.com/shan333/p/15715406.html

  • 相关阅读:
    串口 规格严格
    SWATCH 规格严格
    两个属性 规格严格
    ChinaUnix转载 规格严格
    Perl学习 规格严格
    3月5日工作日志88250
    使用NetBeans6开发OSGi应用(4)——Servlet与Http服务[88250原创]
    ごじゅうおん
    使用Apache Solr实现企业搜索
    3月6日工作日志88250
  • 原文地址:https://www.cnblogs.com/shan333/p/15715406.html
Copyright © 2011-2022 走看看