封裝與職責分離的開發思維


 

 

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM