实现后台高级查询(高级版)

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);
    }
}

其余代码跟前面的一样,只不过缺少一个新加的商品类有关的代码;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值