来因:
实际开发中, 常常需要开发动态的SQL语句, 通常是大量重复的 if 判断和 拼接, 所以有此想法。
虽然已有mybatis和beetsql做了这些事情(mybatis 通过SQL.select,where,or,and等利用对象生成sql, beetlsql 通过md文件管理sql语句)两者都很优秀了, 但实际项目不一定有使用这些工具, 如果仅仅为了生成sql语句就引入,就小题大作了。并且考虑不在项目中新增太多类和接口,此类只做简单功能和抽象并且比较紧凑,方便直接引入。
使用例子和场景:见mian()方法。
import java.util.Objects;
public class DynamicText {
private StringBuilder sb = null;
public DynamicText(String text) {
sb = new StringBuilder(text);
}
public void validateToAppend(Object value,String pattern) {
if (objectValidator.validate(value)) {
String genValue = pattern.replaceAll("#value#", value.toString());
appendAction.action(sb, genValue);
}
};
public void validateToAppend(Object value, String pattern, Validator validator) {
if (validator.validate(value)) {
String genValue = pattern.replaceAll("#value#", value.toString());
appendAction.action(sb, genValue);
}
};
public String toString() {
return sb.toString();
}
public static interface Validator<T> {
boolean validate(T value);
}
public static interface Action {
void action(StringBuilder targer, String value);
}
public static Action appendAction = new Action() {
@Override
public void action(StringBuilder targer, String value) {
targer.append(value);
}
};
public static Validator<String> stringValidator = new Validator<String>() {
@Override
public boolean validate(String value) {
if (Objects.nonNull(value) && !"".equals(value.trim())) {
return true;
}
return false;
}
};
public static Validator<Object> objectValidator = new Validator<Object>() {
@Override
public boolean validate(Object value) {
if (Objects.nonNull(value)) {
return true;
}
return false;
}
};
public static void main(String[] args) {
DynamicText dt = new DynamicText("select * from sys_user where 1 = 1 ");
//succeed
dt.validateToAppend("Lin", "and name = '#value#' ", DynamicText.stringValidator);
dt.validateToAppend(1, "and age = #value# ");
//fail
dt.validateToAppend(null, "and test = '#value#'");
dt.validateToAppend(" ", "and name = '#value#' ", DynamicText.stringValidator);
System.out.println(dt);
}
}
运行结果: