ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

抽取思维(重构设计)

2021-12-30 20:06:22  阅读:186  来源: 互联网

标签:重构 抽取 parameters 思维 private add sql conditions StringUtils


在这里插入图片描述

在这里插入图片描述

1、✿ class TeacherQueryObject中的代码:

@Data
public class TeacherQueryObject {
	private String name;
	private Integer minAge;
	private Integer maxAge;
	private Integer dormBuildId = -1;
	
	// 封装占位符参数
	private List<Object> parameters = new ArrayList<>();
	//解决where 1=1 索引问题【定义一个容器,当容器放进了条件,取出容器的条件(第一个条件前拼接上where,其他拼接and)】
	//封装查询条件
	private List<String> conditions = new ArrayList<>();
		
	public String getQuery() {
		StringBuilder sql = new StringBuilder();
		// 拼接姓名
		if (StringUtils.isNotBlank(name)) {
			conditions.add("name LIKE ?");		
			parameters.add("%" + name + "%");
		}
		// 拼接最小年龄
		if (minAge != null) {
			conditions.add("age >= ?");	
			parameters.add(minAge);
		}
		// 拼接最大年龄
		if (maxAge != null) {
			conditions.add("age <= ?");
			parameters.add(maxAge);
		}
		// 拼接宿舍编号
		if (dormBuildId != -1) {
			conditions.add("dormBuildId = ?");
			parameters.add(dormBuildId);
		}
		if(conditions.size() == 0) {
			return "";
		}

		sql.append(" WHERE ");
		//利用Apached 的组件 Apache commons-lang 组件:StringUtils的join方法:把集合中每个元素使用特定的字符串连接起来
		sql.append(StringUtils.join(conditions, " AND "));
		return sql.toString();
	}
	
	public List<Object> getParameters() {
		return parameters;
	}
	

2、✿ class DormBuildQueryObject的代码:

@Data
public class DormBuildQueryObject {
	private Integer dormBuildId = -1;
	private String dormBuildName;
	private String dormBuildDetail;
	
	//封装占位符参数
	private List<Object> parameters = new ArrayList<>();
	//解决where 1=1 索引问题【定义一个容器,当容器放进了条件,取出容器的条件(第一个条件前拼接上where,其他拼接and)】
	//封装查询条件
	private List<String> conditions = new ArrayList<>();
	
	public String getQuery() {
		StringBuilder sql = new StringBuilder();
		// 拼接宿舍id
		if (dormBuildId != -1) {
			conditions.add("name LIKE ?");		
			parameters.add(dormBuildId);
		}
		// 拼接宿舍楼名
		if (StringUtils.isNotBlank(dormBuildName)) {
			conditions.add("dormBuildName = ?");	
			parameters.add(dormBuildName);
		}
		// 拼接宿舍详情
		if (StringUtils.isNotBlank(dormBuildDetail)) {
			conditions.add("dormBuildDetail = ?");
			parameters.add(dormBuildDetail);
		}

		if(conditions.size() == 0) {
			return "";
		}
		sql.append(" WHERE ");
		//利用Apached 的组件 Apache commons-lang 组件:StringUtils的join方法:把集合中每个元素使用特定的字符串连接起来
		sql.append(StringUtils.join(conditions, " AND "));
		return sql.toString();
	}
	
	public List<Object> getParameters() {
		return parameters;
	}

抽取:

共同属性、方法(结构内容都相同)、方法(结构相同、内容不同)【处理为结构相同、内容也相同:抽取不同的内容封装成一个方法】

在这里插入图片描述

3、共性----①抽取到单独一个类中去 ②抽取到父类中(因为两个类的作用都是查询----抽到父类中)

● 细节:抽取到父类中的属性(尽量不改写成protected—破坏封装)、方法可以改写成protected给子类重写

● 子类中的方法customizedQuery 中 conditions、parameters报错

● 原因:conditions、parameters集合在父类是封装成私有(不改成protected),报错可以封装分法提供接口给外界访问(重点是要知道子类需要conditions 和 parameters的目的是什么?)

目的:将传递到子类中的条件、参数值添加到父类的conditions集合、parameters集合中去

✿ class QueryObject 父类中的代码:

package com.shan.query;

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
//高级查询对象的基类,包含所有查询对象的共性
public class QueryObject {
	// 封装占位符参数
	private List<Object> parameters = new ArrayList<>();
	// 封装查询条件
	private List<String> conditions = new ArrayList<>();
	public String getQuery() {
		StringBuilder sql = new StringBuilder();

		customizedQuery();
		
		if (conditions.size() == 0) {
			return "";
		}
		sql.append(" WHERE ");
		// 利用Apached 的组件 Apache commons-lang 组件:StringUtils的join方法:把集合中每个元素使用特定的字符串连接起来
		sql.append(StringUtils.join(conditions, " AND "));
		return sql.toString();
	}
	

	public List<Object> getParameters() {
		return parameters;
	}
	
	//暴露给子类:让子类覆盖并编写自个的查询条件和参数 
	protected void customizedQuery() {
	
	}
	
	//暴露给子类:让子类在customizedQuery中调用,添加字节的查询条件和参数
	protected void addQuery(String condition, Object param) {
		this.conditions.add(condition);
		this.parameters.add(param);
	}
}

✿ class DormBuildQueryObject 继承父类中的代码:

@Data
public class DormBuildQueryObject extends QueryObject{
	private Integer dormBuildId = -1;
	private String dormBuildName;
	private String dormBuildDetail;

	// 自身的定制查询
	public void customizedQuery() {
		// 拼接宿舍id
		if (dormBuildId != -1) {
//			conditions.add("name LIKE ?");
//			parameters.add(dormBuildId);
			super.addQuery("name LIKE ?", dormBuildId);
		}
		// 拼接宿舍楼名
		if (StringUtils.isNotBlank(dormBuildName)) {
			super.addQuery("dormBuildName = ?", dormBuildName);
		}
		// 拼接宿舍详情
		if (StringUtils.isNotBlank(dormBuildDetail)) {	
			super.addQuery("dormBuildDetail = ?", dormBuildDetail);
		}
	}

标签:重构,抽取,parameters,思维,private,add,sql,conditions,StringUtils
来源: https://blog.csdn.net/weixin_45630258/article/details/122224420

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有