封装与职责分离的开发思维
时间:2021-12-21 作者:shan333
封装与职责分离的开发思维
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(); 域名nd("SELECT * FROM t_teacher WHERE 1=1"); //封装占位符参数 List<Object> parameters = new ArrayList<>();
//拼接sql和设置占位符参数值
//姓名 if (域名tBlank(name)) { 域名nd(" AND name LIKE ?"); 域名("%" + name + "%"); } //最小年龄 if(minAge != null) { 域名nd(" AND age >= ?"); 域名(minAge); } //最大年龄 if(maxAge != null) { 域名nd(" AND age <= ?"); 域名(maxAge); } 域名tln("sql=" + sql); 域名tln("parameters=" + parameters); return 域名y(域名ring(), new BeanListHandler<>(域名s), 域名ray()); }
■ 封装:将多个查询条件参数 (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();
域名nd("SELECT * FROM t_teacher WHERE 1=1");
//封装占位符参数
List<Object> parameters = new ArrayList<>();
// 拼接sql语句和设置占位符参数值
//姓名
if (域名tBlank(域名ame())) {
域名nd(" AND name LIKE ?");
域名("%" + 域名ame() + "%");
}
。。。。。
}
■ 职责分离(谁拥有该数据,谁就应该包含操作该数据的方法):
❀ 要拼接的sql语句的数据时在tqo对象里的,且占位符的参数设置数据也是在tqo对象,则tqo对象应该提供对应的方法
package 域名y; import 域名yList; import 域名; import 域名域名ngUtils; import 域名; @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) { 域名 = name; 域名ge = minAge; 域名ge = maxAge; 域名BuildId = dormBuildId; 域名meters = parameters; } public String getQuery() { StringBuilder sql = new StringBuilder(); 域名nd(" WHERE 1=1"); // 拼接姓名 if (域名tBlank(name)) { 域名nd(" AND name LIKE ?"); 域名("%" + name + "%"); } // 拼接最小年龄 if (minAge != null) { 域名nd(" AND age >= ?"); 域名(minAge); } // 拼接最大年龄 if (maxAge != null) { 域名nd(" AND age <= ?"); 域名(maxAge); } return 域名ring(); } public List<Object> getParameters() { return parameters; } }
// 高级查询 @Override public List<Teacher> query(TeacherQueryObject tqo) { //职责分离【要拼接的sql语句的数据时在tqo对象里的,且占位符的参数设置数据也是在tqo对象,则tqo对象应该提供对应的方法】 String querySql = 域名uery(); String sql = "select * from t_teacher" + querySql; List<Object> parameters = 域名arameters(); 域名tln(querySql); 域名tln(parameters); return 域名y(sql, new BeanListHandler<>(域名s), 域名ray()); }