1 没有优化之前的代码格式
商品类
//商品的高级查询对象,封装了商品高级查询表单的数据。
public class ProductQueryObject extends BaseQueryObject{
private List<String> conditions = new ArrayList<>();
//拼接查询条件的SQL
public String getQuerySql() {
//拼接SQL
StringBuilder sql = new StringBuilder();
this.customizedQuery();
for (int i = 0; i < conditions.size(); i++) {
if (i == 0) {
sql.append(" WHERE ");
} else {
sql.append(" AND ");
}
sql.append(conditions.get(i));
}
return sql.toString();
}
//抽离出的自身的订制查询
public void customizedQuery() {
//若输入了商品名称
if (StringUtil.hasLength(productName)) {//名字占位符
conditions.add(" productName LIKE CONCAT('%',#{productName},'%')");
}
//最低零售价
if (minSalePrice != null) {
conditions.add(" salePrice >= #{minSalePrice}");
}
//最高零售价
if (maxSalePrice != null) {
conditions.add(" salePrice <= #{maxSalePrice}");
}
}
private String productName;//商品名称
private BigDecimal minSalePrice;//最低商品零售价
private BigDecimal maxSalePrice;//最高商品零售价
public String getProductName() {
return productName;
}
public BigDecimal getMinSalePrice() {
return minSalePrice;
}
public BigDecimal getMaxSalePrice() {
return maxSalePrice;
}
public void setProductName(String productName) {
this.productName = productName;
}
public void setMinSalePrice(BigDecimal minSalePrice) {
this.minSalePrice = minSalePrice;
}
public void setMaxSalePrice(BigDecimal maxSalePrice) {
this.maxSalePrice = maxSalePrice;
}
}
另一个商品的dirname类
//模拟商品分类查询
public class ProductDirQueryObject extends BaseQueryObject{
private List<String> conditions = new ArrayList<>();
//拼接查询条件的SQL
public String getQuerySql() {
//拼接SQL
StringBuilder sql = new StringBuilder();
this.customizedQuery();
for (int i = 0; i < conditions.size(); i++) {
if (i == 0) {
sql.append(" WHERE ");
} else {
sql.append(" AND ");
}
sql.append(conditions.get(i));
}
return sql.toString();
}
//抽离出的自身的订制查询
public void customizedQuery() {
//若输入了商品名称
if (StringUtil.hasLength(dirName)) {//名字占位符
conditions.add(" dirName LIKE CONCAT('%',#{dirName},'%')");
}
}
private String dirName;//分类名称
public String getDirName() {
return dirName;
}
public void setDirName(String dirName) {
this.dirName = dirName;
}
}
2 优化之后的代码格式
当父类跟子类中有相同的方法,其实调用的子类中的,简称钩子方法、回调方法
商品类
//商品的高级查询对象,封装了商品高级查询表单的数据。
public class ProductQueryObject extends BaseQueryObject{
//抽离出的自身的订制查询
public void customizedQuery() {
//若输入了商品名称
if (StringUtil.hasLength(productName)) {//名字占位符
super.addQuery(" productName LIKE CONCAT('%',#{productName},'%')");
}
//最低零售价
if (minSalePrice != null) {
super.addQuery(" salePrice >= #{minSalePrice}");
}
//最高零售价
if (maxSalePrice != null) {
super.addQuery(" salePrice <= #{maxSalePrice}");
}
}
private String productName;//商品名称
private BigDecimal minSalePrice;//最低商品零售价
private BigDecimal maxSalePrice;//最高商品零售价
public String getProductName() {
return productName;
}
public BigDecimal getMinSalePrice() {
return minSalePrice;
}
public BigDecimal getMaxSalePrice() {
return maxSalePrice;
}
public void setProductName(String productName) {
this.productName = productName;
}
public void setMinSalePrice(BigDecimal minSalePrice) {
this.minSalePrice = minSalePrice;
}
public void setMaxSalePrice(BigDecimal maxSalePrice) {
this.maxSalePrice = maxSalePrice;
}
}
另一个商品的dirname类
//模拟商品分类查询
public class ProductDirQueryObject extends BaseQueryObject{
//抽离出的自身的订制查询
public void customizedQuery() {
//若输入了商品名称
if (StringUtil.hasLength(dirName)) {//名字占位符
super.addQuery(" dirName LIKE CONCAT('%',#{dirName},'%')");
}
}
private String dirName;//分类名称
public String getDirName() {
return dirName;
}
public void setDirName(String dirName) {
this.dirName = dirName;
}
}
上面两个类的父类
/**
* 查询的基础类:所有查询都应该继承该类
* 因为它拥有所有查询都共同的操作方法
*/
public class BaseQueryObject {
private List<String> conditions = new ArrayList<>();
//拼接查询条件的SQL
public String getQuerySql() {
//拼接SQL
StringBuilder sql = new StringBuilder();
this.customizedQuery();
for (int i = 0; i < conditions.size(); i++) {
if (i == 0) {
sql.append(" WHERE ");
} else {
sql.append(" AND ");
}
sql.append(conditions.get(i));
}
return sql.toString();
}
/**
* 专门暴漏给子类,用于编写自身的查询条件
*/
protected void customizedQuery(){
}
/**
* 专门暴漏给子类一个方法,用于添加查询条件
*/
protected void addQuery(String condition){
conditions.add(condition);
}
}
其余代码跟前面的一样,只不过缺少一个新加的商品类有关的代码;