封裝與職責分離的開發思維
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()); }