JAVA自定义查询策略
此文章为个人笔记,考虑之后工作用到,博客方便于查找,
如果可以给他人提供参考价值,那再好不过
1.定义查询接口参数
package com.qy.code.generator.query; import java.util.ArrayList;
import java.util.List; import com.qy.code.generator.constant.OperatorConstants;
import com.qy.code.generator.utils.CodeArrayUtils; /**
* 描述:查询类
* @author 七脉
*/
public class Query {
/**
* 当前页码
*/
private Integer pageNum; /**
* 每页条数
*/
private Integer pageSize; /**
* 查询包含并且 查询条件
*/
private List<Condition> andList; /**
* 查询包含或查询条件
*/
private List<Condition> orList; /**
* 查询包含分组查询条件
*/
private List<String> groupKeys; /**
* 查询包含排序条件项
*/
private List<OrderBy> sorts; /**
* and条件结合 and(a=1 and b=2 or c=1)
*/
private List<MultiCondition> andMultiConditionList; /**
* or条件结合 or(a=1 and b=2 or c=1)
*/
private List<MultiCondition> orMultiConditionList; /**
* map集合里的and和or两个key值,用于区分( a=1 ..or或and.. c=1)
*/
public static final String AND_CONDITIONS_KEY = "ands";
public static final String OR_CONDITIONS_KEY = "ors"; private String[] selectColumns; private String table; private List<Join> joinList; /**
* 查询列 (表连接查询时,必填)
* @param columns
* @return
*/
public Query select(String... selectColumns) {
if(null!=selectColumns && selectColumns.length>0) {
this.selectColumns = selectColumns;
}
return this;
} /**
* 查询表 (表连接查询时,必填)
* @param columns
* @return
*/
public Query from(String table) {
this.table = table;
return this;
} /**
* 查询列
* @param columns
* @return
*/
public Query join(Join join) {
if(null==joinList) {
this.joinList = new ArrayList<>();
}
if(null!=join) {
this.joinList.add(join);
}
return this;
} /**
* 私有化构造器
*/
public Query() {
} /**
* 描述:静态构建对象方便方法连续调用
* @author 七脉
* @return
*/
public static Query create(){
return new Query();
} /**
* 等于操作
* @param value
* @return
*/
public Query eq(String key, Object value){
return and(key, OperatorConstants.TYPE_EQ, value);
} /**
* 不等于操作
* @param value
* @return
*/
public Query neq(String key, Object value){
return and(key, OperatorConstants.TYPE_NEQ, value);
} /**
* 大于操作
* @param value
* @return
*/
public Query gt(String key, Object value){
return and(key, OperatorConstants.TYPE_GT, value);
} /**
* 大于等于操作
* @param value
* @return
*/
public Query ge(String key, Object value){
return and(key, OperatorConstants.TYPE_GE, value);
} /**
* 小于操作
* @param value
* @return
*/
public Query lt(String key, Object value){
return and(key, OperatorConstants.TYPE_LT, value);
} /**
* 小于等于操作
* @param value
* @return
*/
public Query le(String key, Object value){
return and(key, OperatorConstants.TYPE_LE, value);
} /**
* 模糊查询操作
* @param value
* @return
*/
public Query like(String key, Object value){
return and(key, OperatorConstants.TYPE_LIKE, value);
} /**
* 左侧模糊查询操作
* @param value
* @return
*/
public Query leftlike(String key, Object value){
return and(key, OperatorConstants.TYPE_LLIKE, value);
} /**
* 右侧模糊查询操作
* @param value
* @return
*/
public Query rightlike(String key, Object value){
return and(key, OperatorConstants.TYPE_RLIKE, value);
} /**
* in()包含操作(之所以不用list,首先list反射去class泛型名字很慢,其次数组比集合要快)
* @param array 数组
* @return
*/
public Query in(String key, Object[] array){
if(null==array || array.length==0){
return this;
}
return and(key, OperatorConstants.TYPE_IN,array);
} /**
* not in()不包含操作
* @param array 数组
* @return
*/
public Query notIn(String key, Object[] array) {
if(null==array || array.length==0){
return this;
}
return and(key, OperatorConstants.TYPE_NOT_IN,array);
} /**
* 判空操作
* @return
*/
public Query isNull(String key){
return and(key, OperatorConstants.TYPE_IS_NULL, null);
} /**
* 判非空操作
* @return
*/
public Query isNotNull(String key){
return and(key, OperatorConstants.TYPE_IS_NOT_NULL, null);
} /**
* 判空字符串操作
* @return
*/
public Query isBlank(String key){
return and(key, OperatorConstants.TYPE_EQ, "");
} /**
* 判非空字符串操作
* @return
*/
public Query isNotBlank(String key){
return and(key, OperatorConstants.TYPE_NEQ, "");
} /**
* 描述:增加与条件
* @author 七脉
* @param key
* @param operator
* @param value
* @return
*/
public Query and(String key, String operator, Object value){
Condition condition = Condition.create(key, operator, value,true);
return and(condition);
} /**
* 等于操作
* @param value
* @return
*/
public Query orEq(String key, Object value){
return or(key, OperatorConstants.TYPE_EQ, value);
} /**
* 不等于操作
* @param value
* @return
*/
public Query orNeq(String key, Object value){
return or(key, OperatorConstants.TYPE_NEQ, value);
} /**
* 大于操作
* @param value
* @return
*/
public Query orGt(String key, Object value){
return or(key, OperatorConstants.TYPE_GT, value);
} /**
* 大于等于操作
* @param value
* @return
*/
public Query orGe(String key, Object value){
return or(key, OperatorConstants.TYPE_GE, value);
} /**
* 小于操作
* @param value
* @return
*/
public Query orLt(String key, Object value){
return or(key, OperatorConstants.TYPE_LT, value);
} /**
* 小于等于操作
* @param value
* @return
*/
public Query orLe(String key, Object value){
return or(key, OperatorConstants.TYPE_LE, value);
} /**
* 模糊查询操作
* @param value
* @return
*/
public Query orLike(String key, Object value){
return or(key, OperatorConstants.TYPE_LIKE, value);
} /**
* 左侧模糊查询操作
* @param value
* @return
*/
public Query orLeftlike(String key, Object value){
return or(key, OperatorConstants.TYPE_LLIKE, value);
} /**
* 右侧模糊查询操作
* @param value
* @return
*/
public Query orRightlike(String key, Object value){
return or(key, OperatorConstants.TYPE_RLIKE, value);
} /**
* in()包含操作(之所以不用list,首先list反射去class泛型名字很慢,其次数组比集合要快)
* @param array 数组
* @return
*/
public Query orIn(String key, Object[] array){
if(null==array || array.length==0){
return this;
}
return or(key, OperatorConstants.TYPE_IN,array);
} /**
* not in()不包含操作
* @param array 数组
* @return
*/
public Query orNotIn(String key, Object[] array) {
if(null==array || array.length==0){
return this;
}
return or(key, OperatorConstants.TYPE_NOT_IN,array);
} /**
* 判空操作
* @return
*/
public Query orIsNull(String key){
return or(key, OperatorConstants.TYPE_IS_NULL, null);
} /**
* 判非空操作
* @return
*/
public Query orIsNotNull(String key){
return or(key, OperatorConstants.TYPE_IS_NOT_NULL, null);
} /**
* 判空字符串操作
* @return
*/
public Query orIsBlank(String key){
return or(key, OperatorConstants.TYPE_EQ, "");
} /**
* 判非空字符串操作
* @return
*/
public Query orIsNotBlank(String key){
return or(key, OperatorConstants.TYPE_NEQ, "");
} /**
* and(a=1 and b=2 or c=1)形式查询
* @param condition
* @return
*/
public Query and(MultiCondition multiCondition) {
if(null!=multiCondition) {
if(null == this.andMultiConditionList) {
this.andMultiConditionList = new ArrayList<>();
}
this.andMultiConditionList.add(multiCondition);
}
return this;
} /**
* and a=1 和 and(a=1 and b=2 or c=1)形式查询
* @param condition
* @return
*/
public Query and(Condition... condition) {
if(CodeArrayUtils.isNotEmpty(condition)) {
if(condition.length>1){
if(null == this.andMultiConditionList) {
this.andMultiConditionList = new ArrayList<>();
}
MultiCondition multiCondition = MultiCondition.create().add(condition);
this.andMultiConditionList.add(multiCondition);
}else{
if(this.andList == null){
this.andList = new ArrayList<Condition>();
}
this.andList.add(condition[0]);
return this;
}
}
return this;
}
/**
* or(a=1 and b=2 or c=1)形式查询
* @param condition
* @return
*/
public Query or(MultiCondition multiCondition) {
if(null!=multiCondition) {
if(null == this.orMultiConditionList) {
this.orMultiConditionList = new ArrayList<>();
}
this.orMultiConditionList.add(multiCondition);
}
return this;
} /**
* 增加或条件 or a=1 和 or(a=1 and b=2 or c=1)形式查询
* @param conditions
* @return
*/
public Query or(Condition... condition) {
if(CodeArrayUtils.isNotEmpty(condition)) {
if(condition.length>1){
if(null == this.orMultiConditionList) {
this.orMultiConditionList = new ArrayList<>();
}
MultiCondition multiCondition = MultiCondition.create().add(condition);
this.orMultiConditionList.add(multiCondition);
}else{
if(this.orList == null){
this.orList = new ArrayList<Condition>();
}
this.orList.add(condition[0]);
return this;
}
}
return this;
} /**
* 描述:where条件,支持连续调用
* @author 七脉
* @param condition
* @return
*/
public Query where(Condition condition){
if(null != condition){
if(condition.isAnd()){
if(this.andList == null){
this.andList = new ArrayList<Condition>();
}
this.andList.add(condition);
}else{
if(this.orList == null){
this.orList = new ArrayList<Condition>();
}
this.orList.add(condition);
}
}
return this;
} /**
* 描述:增加或条件
* @author 七脉
* @param key
* @param operator
* @param value
* @return
*/
public Query or(String key, String operator, Object value){
Condition condition = Condition.create(key, operator, value, false);
return or(condition);
} /**
* 描述:升序排序
* @param key 字段名称
* @return
*/
public Query asc(String key){
key = getColumn(key);
if(null != key){
if(this.sorts == null){
this.sorts = new ArrayList<OrderBy>();
}
this.sorts.add(OrderBy.asc(key));
}
return this;
} /**
* 描述:降序排序
* @param key 字段名称
* @return
*/
public Query desc(String key){
key = getColumn(key);
if(null != key){
if(this.sorts == null){
this.sorts = new ArrayList<OrderBy>();
}
this.sorts.add(OrderBy.asc(key));
}
return this;
} /**
* 增加分组条件
* @param groups
* @return
*/
public Query group(String... groupKeys){
if(null != groupKeys){
for(String key : groupKeys){
key = getColumn(key);
if(this.groupKeys == null){
this.groupKeys = new ArrayList<>();
}
this.groupKeys.add(key);
}
}
return this;
} public Query limit(Integer pageNum, Integer pageSize) {
if(null==pageNum || 0==pageNum) {
this.pageNum = 1;
}else {
this.pageNum = pageNum;
}
if(null==pageSize || 0==pageSize) {
this.pageSize = 1;
}else {
this.pageSize = pageNum;
}
return this;
} private String getColumn(String key) {
if(!key.contains("_")){
String newKey = "";
for(int i=0; i<key.length(); i++){
char ch = key.charAt(i);
if(Character.isUpperCase(ch)){
newKey += "_"+ch;
}else{
newKey += ch;
}
}
key = newKey;
}
return key;
} public List<Condition> getAndList() {
return andList;
} public List<Condition> getOrList() {
return orList;
} public List<String> getGroupKeys() {
return groupKeys;
} public List<OrderBy> getSorts() {
return sorts;
} public List<MultiCondition> getAndMultiConditionList() {
return andMultiConditionList;
} public List<MultiCondition> getOrMultiConditionList() {
return orMultiConditionList;
} public static String getAndConditionsKey() {
return AND_CONDITIONS_KEY;
} public static String getOrConditionsKey() {
return OR_CONDITIONS_KEY;
} public String[] getSelectColumns() {
return selectColumns;
} public String getTable() {
return table;
} public List<Join> getJoinList() {
return joinList;
} public Integer getPageNum() {
return pageNum;
} public Integer getPageSize() {
return pageSize;
} }
2.查询条件
package com.qy.code.generator.query; import com.qy.code.generator.constant.OperatorConstants; /**
* 描述:查询条件
* @author 七脉
*/
public class Condition { /**
* 查询键(数据库表字段名称)
*/
private String key; /**
* 操作符
*/
private String operator; /**
* 查询条件值
*/
private Object value; /**
* 非 and 即 or
*/
private boolean isAnd; /**
* 构造器私有,使用方法创建
*/
private Condition(){} /**
* 创建查询条件
* @param key 查询键
* @param operator 查询条件值
* @param value 查询值
*/
private Condition(String key, String operator, Object value, boolean isAnd) {
this.key = key;
this.operator = operator;
this.value = value;
this.isAnd = isAnd;
} /**
* 供query类使用
* @param key
* @param operator
* @param value
* @return
*/
public static Condition create(String key, String operator, Object value, boolean isAnd) {
return operate(key, operator, value, isAnd);
} /**
* 等于操作
* @param value
* @return
*/
public static Condition eq(String key, Object value){
return and(key, OperatorConstants.TYPE_EQ, value);
} /**
* 不等于操作
* @param value
* @return
*/
public static Condition neq(String key, Object value){
return and(key, OperatorConstants.TYPE_NEQ, value);
} /**
* 大于操作
* @param value
* @return
*/
public static Condition gt(String key, Object value){
return and(key, OperatorConstants.TYPE_GT, value);
} /**
* 大于等于操作
* @param value
* @return
*/
public static Condition ge(String key, Object value){
return and(key, OperatorConstants.TYPE_GE, value);
} /**
* 小于操作
* @param value
* @return
*/
public static Condition lt(String key, Object value){
return and(key, OperatorConstants.TYPE_LT, value);
} /**
* 小于等于操作
* @param value
* @return
*/
public static Condition le(String key, Object value){
return and(key, OperatorConstants.TYPE_LE, value);
} /**
* 模糊查询操作
* @param value
* @return
*/
public static Condition like(String key, Object value){
return and(key, OperatorConstants.TYPE_LIKE, value);
} /**
* 左侧模糊查询操作
* @param value
* @return
*/
public static Condition leftlike(String key, Object value){
return and(key, OperatorConstants.TYPE_LLIKE, value);
} /**
* 右侧模糊查询操作
* @param value
* @return
*/
public static Condition rightlike(String key, Object value){
return and(key, OperatorConstants.TYPE_RLIKE, value);
} /**
* in()包含操作(之所以不用list,首先list反射去class泛型名字很慢,其次数组比集合要快)
* @param array 数组
* @return
*/
public static Condition in(String key, Object[] array){
if(null==array || array.length==0){
return null;
}
return and(key, OperatorConstants.TYPE_IN,array);
} /**
* not in()不包含操作
* @param array 数组
* @return
*/
public static Condition notIn(String key, Object[] array) {
if(null==array || array.length==0){
return null;
}
return and(key, OperatorConstants.TYPE_NOT_IN,array);
} /**
* 判空操作
* @return
*/
public static Condition isNull(String key){
return and(key, OperatorConstants.TYPE_IS_NULL, null);
} /**
* 判非空操作
* @return
*/
public static Condition isNotNull(String key){
return and(key, OperatorConstants.TYPE_IS_NOT_NULL, null);
} /**
* 判空字符串操作
* @return
*/
public static Condition isBlank(String key){
return and(key, OperatorConstants.TYPE_EQ, "");
} /**
* 判非空字符串操作
* @return
*/
public static Condition isNotBlank(String key){
return and(key, OperatorConstants.TYPE_NEQ, "");
} /**
* 等于操作
* @param value
* @return
*/
public static Condition orEq(String key, Object value){
return or(key, OperatorConstants.TYPE_EQ, value);
} /**
* 不等于操作
* @param value
* @return
*/
public static Condition orNeq(String key, Object value){
return or(key, OperatorConstants.TYPE_NEQ, value);
} /**
* 大于操作
* @param value
* @return
*/
public static Condition orGt(String key, Object value){
return or(key, OperatorConstants.TYPE_GT, value);
} /**
* 大于等于操作
* @param value
* @return
*/
public static Condition orGe(String key, Object value){
return or(key, OperatorConstants.TYPE_GE, value);
} /**
* 小于操作
* @param value
* @return
*/
public static Condition orLt(String key, Object value){
return or(key, OperatorConstants.TYPE_LT, value);
} /**
* 小于等于操作
* @param value
* @return
*/
public static Condition orLe(String key, Object value){
return or(key, OperatorConstants.TYPE_LE, value);
} /**
* 模糊查询操作
* @param value
* @return
*/
public static Condition orLike(String key, Object value){
return or(key, OperatorConstants.TYPE_LIKE, value);
} /**
* 左侧模糊查询操作
* @param value
* @return
*/
public static Condition orLeftlike(String key, Object value){
return or(key, OperatorConstants.TYPE_LLIKE, value);
} /**
* 右侧模糊查询操作
* @param value
* @return
*/
public static Condition orRightlike(String key, Object value){
return or(key, OperatorConstants.TYPE_RLIKE, value);
} /**
* in()包含操作(之所以不用list,首先list反射去class泛型名字很慢,其次数组比集合要快)
* @param array 数组
* @return
*/
public static Condition orIn(String key, Object[] array){
if(null==array || array.length==0){
return null;
}
return or(key, OperatorConstants.TYPE_IN,array);
} /**
* not in()不包含操作
* @param array 数组
* @return
*/
public static Condition orNotIn(String key, Object[] array) {
if(null==array || array.length==0){
return null;
}
return or(key, OperatorConstants.TYPE_NOT_IN,array);
} /**
* 判空操作
* @return
*/
public static Condition orIsNull(String key){
return or(key, OperatorConstants.TYPE_IS_NULL, null);
} /**
* 判非空操作
* @return
*/
public static Condition orIsNotNull(String key){
return or(key, OperatorConstants.TYPE_IS_NOT_NULL, null);
} /**
* 判空字符串操作
* @return
*/
public static Condition orIsBlank(String key){
return or(key, OperatorConstants.TYPE_EQ, "");
} /**
* 判不为空字符串操作
* @return
*/
public static Condition orIsNotBlank(String key){
return or(key, OperatorConstants.TYPE_EQ, "");
} /**
* 描述:and条件
* @author 七脉
* @param key
* @param operator
* @param value
* @return
*/
public static Condition and(String key, String operator, Object value){
return operate(key, operator, value, true);
} /**
* 描述:or条件
* @author 七脉
* @param key
* @param operator
* @param value
* @return
*/
public static Condition or(String key, String operator, Object value){
return operate(key, operator, value, false);
} /**
* 创建连接及查询 条件值
* @param operate 连接符
* @param value 查询条件值
* @return
*/
private static Condition operate(String key, String operator, Object value, boolean isAnd){
if(null==key || null==operator || null==value || ""==key || ""==operator || ""==value){
return null;
}
if(!key.contains("_")){
String newKey = "";
for(int i=0; i<key.length(); i++){
char ch = key.charAt(i);
if(Character.isUpperCase(ch)){
newKey += "_"+ch;
}else{
newKey += ch;
}
}
key = newKey;
}
Condition condition = new Condition(key, operator, value, isAnd);
return condition;
} public String getKey() {
return key;
} public void setKey(String key) {
this.key = key;
} public String getOperator() {
return operator;
} public void setOperator(String operator) {
this.operator = operator;
} public Object getValue() {
return value;
} public void setValue(Object value) {
this.value = value;
} public boolean isAnd() {
return isAnd;
} public void setAnd(boolean isAnd) {
this.isAnd = isAnd;
} }
3.多条件查询
package com.qy.code.generator.query; import java.util.ArrayList;
import java.util.List; import com.qy.code.generator.constant.OperatorConstants; /**
* 描述:查询条件
* @author 七脉
*/
public class MultiCondition { /**
* and条件集合
*/
private List<Condition> andList; /**
* and条件集合
*/
private List<Condition> orList; /**
* 构造器私有,使用方法创建
*/
private MultiCondition(){} /**
* 实例化对象
* @return
*/
public static MultiCondition create(){
return new MultiCondition();
} /**
* 等于操作
* @param value
* @return
*/
public MultiCondition eq(String key, Object value){
return and(key, OperatorConstants.TYPE_EQ, value);
} /**
* 不等于操作
* @param value
* @return
*/
public MultiCondition neq(String key, Object value){
return and(key, OperatorConstants.TYPE_NEQ, value);
} /**
* 大于操作
* @param value
* @return
*/
public MultiCondition gt(String key, Object value){
return and(key, OperatorConstants.TYPE_GT, value);
} /**
* 大于等于操作
* @param value
* @return
*/
public MultiCondition ge(String key, Object value){
return and(key, OperatorConstants.TYPE_GE, value);
} /**
* 小于操作
* @param value
* @return
*/
public MultiCondition lt(String key, Object value){
return and(key, OperatorConstants.TYPE_LT, value);
} /**
* 小于等于操作
* @param value
* @return
*/
public MultiCondition le(String key, Object value){
return and(key, OperatorConstants.TYPE_LE, value);
} /**
* 模糊查询操作
* @param value
* @return
*/
public MultiCondition like(String key, Object value){
return and(key, OperatorConstants.TYPE_LIKE, value);
} /**
* 左侧模糊查询操作
* @param value
* @return
*/
public MultiCondition leftlike(String key, Object value){
return and(key, OperatorConstants.TYPE_LLIKE, value);
} /**
* 右侧模糊查询操作
* @param value
* @return
*/
public MultiCondition rightlike(String key, Object value){
return and(key, OperatorConstants.TYPE_RLIKE, value);
} /**
* in()包含操作(之所以不用list,首先list反射去class泛型名字很慢,其次数组比集合要快)
* @param array 数组
* @return
*/
public MultiCondition in(String key, Object[] array){
if(null==array || array.length==0){
return this;
}
return and(key, OperatorConstants.TYPE_IN,array);
} /**
* not in()不包含操作
* @param array 数组
* @return
*/
public MultiCondition notIn(String key, Object[] array) {
if(null==array || array.length==0){
return this;
}
return and(key, OperatorConstants.TYPE_NOT_IN,array);
} /**
* 判空操作
* @return
*/
public MultiCondition isNull(String key){
return and(key, OperatorConstants.TYPE_IS_NULL, null);
} /**
* 判非空操作
* @return
*/
public MultiCondition isNotNull(String key){
return and(key, OperatorConstants.TYPE_IS_NOT_NULL, null);
} /**
* 判空字符串操作
* @return
*/
public MultiCondition isBlank(String key){
return and(key, OperatorConstants.TYPE_EQ, "");
} /**
* 判非空字符串操作
* @return
*/
public MultiCondition isNotBlank(String key){
return and(key, OperatorConstants.TYPE_NEQ, "");
} /**
* 等于操作
* @param value
* @return
*/
public MultiCondition orEq(String key, Object value){
return or(key, OperatorConstants.TYPE_EQ, value);
} /**
* 不等于操作
* @param value
* @return
*/
public MultiCondition orNeq(String key, Object value){
return or(key, OperatorConstants.TYPE_NEQ, value);
} /**
* 大于操作
* @param value
* @return
*/
public MultiCondition orGt(String key, Object value){
return or(key, OperatorConstants.TYPE_GT, value);
} /**
* 大于等于操作
* @param value
* @return
*/
public MultiCondition orGe(String key, Object value){
return or(key, OperatorConstants.TYPE_GE, value);
} /**
* 小于操作
* @param value
* @return
*/
public MultiCondition orLt(String key, Object value){
return or(key, OperatorConstants.TYPE_LT, value);
} /**
* 小于等于操作
* @param value
* @return
*/
public MultiCondition orLe(String key, Object value){
return or(key, OperatorConstants.TYPE_LE, value);
} /**
* 模糊查询操作
* @param value
* @return
*/
public MultiCondition orLike(String key, Object value){
return or(key, OperatorConstants.TYPE_LIKE, value);
} /**
* 左侧模糊查询操作
* @param value
* @return
*/
public MultiCondition orLeftlike(String key, Object value){
return or(key, OperatorConstants.TYPE_LLIKE, value);
} /**
* 右侧模糊查询操作
* @param value
* @return
*/
public MultiCondition orRightlike(String key, Object value){
return or(key, OperatorConstants.TYPE_RLIKE, value);
} /**
* in()包含操作(之所以不用list,首先list反射去class泛型名字很慢,其次数组比集合要快)
* @param array 数组
* @return
*/
public MultiCondition orIn(String key, Object[] array){
if(null==array || array.length==0){
return this;
}
return or(key, OperatorConstants.TYPE_IN,array);
} /**
* not in()不包含操作
* @param array 数组
* @return
*/
public MultiCondition orNotIn(String key, Object[] array) {
if(null==array || array.length==0){
return this;
}
return or(key, OperatorConstants.TYPE_NOT_IN,array);
} /**
* 判空操作
* @return
*/
public MultiCondition orIsNull(String key){
return or(key, OperatorConstants.TYPE_IS_NULL, null);
} /**
* 判非空操作
* @return
*/
public MultiCondition orIsNotNull(String key){
return or(key, OperatorConstants.TYPE_IS_NOT_NULL, null);
} /**
* 判空字符串操作
* @return
*/
public MultiCondition orIsBlank(String key){
return or(key, OperatorConstants.TYPE_EQ, "");
} /**
* 判非空字符串操作
* @return
*/
public MultiCondition orIsNotBlank(String key){
return or(key, OperatorConstants.TYPE_NEQ, "");
} /**
* 描述:增加与条件
* @author 七脉
* @param key
* @param operator
* @param value
* @return
*/
private MultiCondition and(String key, String operator, Object value){
Condition condition = Condition.create(key, operator, value,true);
return and(condition);
} /**
* 描述:增加或条件
* @author 七脉
* @param key
* @param operator
* @param value
* @return
*/
private MultiCondition or(String key, String operator, Object value){
Condition condition = Condition.create(key, operator, value,false);
return or(condition);
} /**
* 描述:增加与条件
* @author 七脉
* @param key
* @param operator
* @param value
* @return
*/
public MultiCondition and(Condition condition){
return add(condition);
} /**
* 描述:增加或条件
* @author 七脉
* @param key
* @param operator
* @param value
* @return
*/
public MultiCondition or(Condition condition){
return add(condition);
} /**
* 描述:增加与条件
* @author 七脉
* @param condition
* @return
*/
public MultiCondition add(Condition... condition){
for(Condition cdt : condition){
if(null==condition){
continue;
}
if(cdt.isAnd()){
if(this.andList == null){
this.andList = new ArrayList<Condition>();
}
this.andList.add(cdt);
}else{
if(this.orList == null){
this.orList = new ArrayList<Condition>();
}
this.orList.add(cdt);
}
}
return this;
} public List<Condition> getAndList() {
return andList;
} public void setAndList(List<Condition> andList) {
this.andList = andList;
} public List<Condition> getOrList() {
return orList;
} public void setOrList(List<Condition> orList) {
this.orList = orList;
} }
4.连接表
package com.qy.code.generator.query; import java.util.ArrayList;
import java.util.List; import com.qy.code.generator.enums.JoinType;
import com.qy.code.generator.utils.CodeArrayUtils; /**
* 连接类型 父类(不可定义为接口,因为重写方法都一样)
* @author 七脉
*/
public class Join {
/**
* 左连接表 查询列
*/
private String[] selectColumns; /**
* 左连接表
*/
private String table; /**
* on条件 主表列
*/
private String onMasterColumn; /**
* on条件 左连接表列
*/
private String onJoinColumn; /**
* where过滤掉件 and a = 1
*/
List<Condition> whereAndConditionList; /**
* where过滤掉件 or a = 1
*/
List<Condition> whereOrConditionList; /**
* where过滤掉件 and(a = 1 and b=2 or c=1)
*/
List<MultiCondition> whereAndMultiConditionList; /**
* where过滤掉件 or(a = 1 and b=2 or c=1)
*/
List<MultiCondition> whereOrMultiConditionList; /**
* 连接类型
*/
private JoinType joinType; /**
* 私有化构造器
*/
private Join() {
} /**
* 描述:静态构建对象实例
* @author 七脉
* @return
*/
public static Join createInnerJoin(String table){
Join join = new Join();
join.table = table;
join.joinType = JoinType.INNER_JOIN;
return join;
} /**
* 描述:静态构建对象实例
* @author 七脉
* @return
*/
public static Join createLiftJoin(String table){
Join join = new Join();
join.table = table;
join.joinType = JoinType.LEFT_JOIN;
return join;
} /**
* 连接表的查询列
* @param joinColumns
* @return
*/
public Join select(String... selectColumns) {
this.selectColumns = selectColumns;
return this;
} /**
* 左连接 on 条件字段
* @param onMasterColumn
* @param onJoinColumn
* @return
*/
public Join on(String onMasterColumn, String onJoinColumn) {
this.onMasterColumn = onMasterColumn;
this.onJoinColumn = onJoinColumn;
return this;
} /**
* where 后的 and条件
* @param condition
* @return
*/
public Join and(Condition... conditions) {
if(CodeArrayUtils.isNotEmpty(conditions)) {
if(this.whereAndConditionList == null) {
this.whereAndConditionList = new ArrayList<>();
}
for(Condition cdt : conditions) {
this.whereAndConditionList.add(cdt);
}
}
return this;
} /**
* where 后的 or条件
* @param condition
* @return
*/
public Join or(Condition... conditions) {
if(CodeArrayUtils.isNotEmpty(conditions)) {
if(this.whereOrConditionList == null) {
this.whereOrConditionList = new ArrayList<>();
}
for(Condition cdt : conditions) {
this.whereOrConditionList.add(cdt);
}
}
return this;
} /**
* where过滤掉件 and(a = 1 and b=2 or c=1)
* @param conditions
* @return
*/
public Join and(MultiCondition... conditions) {
if(CodeArrayUtils.isNotEmpty(conditions)) {
if(this.whereAndMultiConditionList == null) {
this.whereAndMultiConditionList = new ArrayList<>();
}
for(MultiCondition condition : conditions) {
this.whereAndMultiConditionList.add(condition);
}
}
return this;
} /**
* where过滤掉件 or(a = 1 and b=2 or c=1)
* @param conditions
* @return
*/
public Join or(MultiCondition... conditions) {
if(CodeArrayUtils.isNotEmpty(conditions)) {
if(this.whereOrMultiConditionList == null) {
this.whereOrMultiConditionList = new ArrayList<>();
}
for(MultiCondition condition : conditions) {
this.whereOrMultiConditionList.add(condition);
}
}
return this;
} public String[] getSelectColumns() {
return selectColumns;
} public void setSelectColumns(String[] selectColumns) {
this.selectColumns = selectColumns;
} public String getTable() {
return table;
} public void setTable(String table) {
this.table = table;
} public String getOnMasterColumn() {
return onMasterColumn;
} public void setOnMasterColumn(String onMasterColumn) {
this.onMasterColumn = onMasterColumn;
} public String getOnJoinColumn() {
return onJoinColumn;
} public void setOnJoinColumn(String onJoinColumn) {
this.onJoinColumn = onJoinColumn;
} public List<Condition> getWhereAndConditionList() {
return whereAndConditionList;
} public List<Condition> getWhereOrConditionList() {
return whereOrConditionList;
} public List<MultiCondition> getWhereAndMultiConditionList() {
return whereAndMultiConditionList;
} public List<MultiCondition> getWhereOrMultiConditionList() {
return whereOrMultiConditionList;
} public JoinType getJoinType() {
return joinType;
}
}
4.排序类
package com.qy.code.generator.query; /**
* 描述:查询排序条件
* @author 七脉
*/
public class OrderBy { /** 顺序排序 */
public final static String ASC = "asc"; /** 逆序排序 */
public final static String DESC = "desc"; /**
* 排序字段名称
*/
private String key; /**
* 排序方式
* {@link #ASC}
* {@link #DESC}
*/
private String asc; private OrderBy() {
} /**
* 创建顺序排序条件项
* @param name
* @return
*/
public static OrderBy asc(String key){
OrderBy sort = new OrderBy();
sort.setKey(key);
sort.setAsc(ASC);
return sort;
} /**
* 创建逆序排序条件项
* @param name
* @return
*/
public static OrderBy desc(String key){
OrderBy sort = new OrderBy();
sort.setKey(key);
sort.setAsc(DESC);
return sort;
} public String getKey() {
return key;
} public void setKey(String key) {
this.key = key;
} public String getAsc() {
return asc;
} public void setAsc(String asc) {
this.asc = asc;
} @Override
public String toString() {
return getKey() + " " + getAsc();
}
}
使用场景:通过Query类定义查询条件,根据最终的Query条件,完成查询需求。
如:使用query生成JdbcTemplate所需SQL
或Mybatis Mapper定义好SQL模板,Query直接作为Mapper接口参数。
JAVA自定义查询策略的更多相关文章
- Jpa自定义查询报错(Failed to convert from type [java.lang.Object[]] to type)
Jpa自定义查询报错 问题背景 今天遇到一个奇怪的报错"Failed to convert from type [java.lang.Object[]] to type",这个报错 ...
- Java自定义注解和运行时靠反射获取注解
转载:http://blog.csdn.net/bao19901210/article/details/17201173/ java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编 ...
- 【Kafka】自定义分区策略
自定义分区策略 思路 Command+Option+shift+N 调出查询页面,找到producer包的Partitioner接口 Partitioner下有一个DefaultPartitioner ...
- HttpClient_自定义cookie策略
实际使用client的过程中,会遇到一种情况,如cookie的Key为空的,此时默认的cookie的策略处理cookie是会报错. 这时咱可以通过重写cookiestore策略来解决如: /** * ...
- java自定义注解实现前后台参数校验
2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...
- java自定义注解注解方法、类、属性等等【转】
http://anole1982.iteye.com/blog/1450421 http://www.open-open.com/doc/view/51fe76de67214563b20b385320 ...
- JAVA自定义注释(Target,Retention,Documented,Inherit)
java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.l ...
- java自定义线程池
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间.那么有没有一种办法使得线程可以复用,就是执行完一个任 ...
- 自定义查询语句SpringData
虽然官方的API中给我们提供了很多关键字的查询,但是还是不够灵活,因为我们在项目中,会遇见奇葩的业务,我们需要用SpringData中的一个@Query注解. 使用@Query自定义查询 这种查询可以 ...
随机推荐
- c# json序列化不包括某列
.[Newtonsoft.Json.JsonIgnore]特性:使用Newtonsoft.Json序列化时字段不会被序列化. .[System.Web.Script.Serialization.Scr ...
- stacking method house price in kaggle top10%
整合几部分代码的汇总 隐藏代码片段 导入python数据和可视化包 导入统计相关的工具 导入回归相关的算法 导入数据预处理相关的方法 导入模型调参相关的包 读取数据 特征工程 缺失值 类别特征处理-l ...
- YYCache 的整体架构类图

- nginx mysqlnd驱动引擎提升mysql性能
nginx mysqlnd驱动引擎提升mysql性能 前期要安装 mysql mysqli pdo_mysql libiconv 1 先去PHP官网下个 php-5.6.29.tar.gz wget ...
- laravel门面与服务提供者区别
laravel门面模式与服务提供者区别 以 Laravel 自带的文件系统为例,在 config/app.php 的配置文件的 providers 数组中,注册了一个服务提供者: Illuminate ...
- 在ensp上通过FTP进行文件操作
接下来的实验,我们使PC-1为用户端,需要访问FTP Server,不允许用户端上传到server. 在R1上员工不能上传文件到server,但是可以下载文件.同时R1也需要作为用户端从server下 ...
- vue.js与element-ui实现菜单树形结构
由于业务需要,要求实现树形菜单,且菜单数据由后台返回,在网上找了几篇文章,看下来总算有了解决办法.借鉴文章链接在最底部. 场景:根据业务要求,需要实现活动的树形菜单,菜单数据由后台返回,最后的效果图如 ...
- AntDesign vue学习笔记(九)自定义文件上传
第七节时提到,上传文件时实际可能需要传输一个token. 1.查看vue antdesign文档https://vue.ant.design/components/upload-cn/ 2.使用cus ...
- 开源分布式数据库中间件 DBLE
DBLE 是企业级开源分布式中间件,江湖人送外号 “MyCat Plus”:以其简单稳定,持续维护,良好的社区环境和广大的群众基础得到了社区的大力支持: DBLE官方网站:https://openso ...
- Kafka Consumer Lag Monitoring
Sematext Monitoring 是最全面的Kafka监视解决方案之一,可捕获约200个Kafka指标,包括Kafka Broker,Producer和Consumer指标.尽管其中许多指标很 ...