作者:一乐乐
欢迎大家来一乐乐的博客园
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());
}
● 文章来源于:一乐乐的博客园
● 转载请注明出处