封装与职责分离的开发思维

目录 1:封装:参数过多应该封装成一个对象 2:职责分离:谁拥有该数据,谁就应该包含操作该数据的方法 1:封装:参数过多应该封装成一个对象 2:职责分离

目录

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

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


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

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

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

@Overridepublic List query(String name, Integer minAge, Integer maxAge, Integer dormBuildId) {StringBuilder sql = new StringBuilder();sql.append("SELECT * FROM t_teacher WHERE 1=1");//封装占位符参数List 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 query(TeacherQueryObject tqo) {
        StringBuilder sql = new StringBuilder();
        sql.append("SELECT * FROM t_teacher WHERE 1=1");
        //封装占位符参数
        List 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 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 getParameters() {return parameters;}} 
    // 高级查询@Overridepublic List query(TeacherQueryObject tqo) {//职责分离【要拼接的sql语句的数据时在tqo对象里的,且占位符的参数设置数据也是在tqo对象,则tqo对象应该提供对应的方法】String querySql = tqo.getQuery();String sql = "select * from t_teacher" + querySql;List parameters = tqo.getParameters();System.out.println(querySql);System.out.println(parameters);return JdbcTemplate.query(sql, new BeanListHandler<>(Teacher.class), parameters.toArray());}