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自定义查询 这种查询可以 ...
随机推荐
- 【AGC009E】Eternal Average
[AGC009E]Eternal Average 题面 洛谷 题解 神仙题.jpg 我们把操作看成一棵\(k\)叉树,其中每个节点有权值,所有叶子节点(共\(n+m\)个)就是\(0\)或\(1\). ...
- Unable to resolve service for type 'Microsoft.AspNetCore.ResponseCompression.IResponseCompressionProvider' while attempting to activate 'Microsoft.AspNetCore.ResponseCompression.ResponseCompressionMid
System.InvalidOperationException HResult=0x80131509 Message=Unable to resolve service for type 'Micr ...
- 微服务异步架构---MQ之RocketMQ
“我们大家都知道把一个微服务架构变成一个异步架构只需要加一个MQ,现在市面上有很多MQ的开源框架.到底选择哪一个MQ的开源框架才合适呢?” 一.什么是MQ?MQ的原理是什么? MQ就是消息队列,是Me ...
- 根据jdk1.8源码整理而得,java集合体系(继承、实现关系)图解,超清晰,一看就懂,方便记忆
一.前言 1. 该关系图是本人根据JDK1.8 源码整理所得,只整理了常用的.常见的集合,并非全部. 2. 整理逻辑: Collection接口下有两个子接口:List 和 Set 接口. Map是独 ...
- linux下僵尸进程的发现与处理
一.概述 僵尸进程是怎么产生的 当子进程退出时,父进程没有调用wait函数或者waitpid()函数等待子进程结束,又没有显式忽略SIGCHLD信号,那么它将一直保持在僵尸状态,如果这时父进程结束了, ...
- Java学习:数组的使用和注意事项
数组 数组的概念:是一种容器,可以同时存放多个数据值 数组的特点: 数组是一种引用数据类型 数组当中的多个数据,类型必须统一 数组的长度在程序运行期间不可以改变 数组的初始化:在内存当中创建一个数组, ...
- go ---switch语句
package main import ( "fmt" ) func main() { var ar = [...]string{"A", "B&qu ...
- - 集合 遍历 foreach Iterator 并发修改 ConcurrentModificationException MD
目录 目录 为什么不能在 foreach 循环里进行元素的 remove/add 操作 背景 foreach 循环 问题重现 fail-fast remove/add 做了什么 正确姿势 直接使用普通 ...
- 排序算法Java代码实现(一)—— 选择排序
以下几篇随笔都是记录的我实现八大排序的代码,主要是贴出代码吧,讲解什么的都没有,主要是为了方便我自己复习,哈哈,如果看不明白,也不要说我坑哦! 本片分为两部分代码: 常用方法封装 排序算法里需要频繁使 ...
- opencv常用数据结构
2019/10/29 1.Mat 成员函数:cols.rows.channels.ptr获取任意行的首地址.at处理像素 2.InputArray/OutArray相当于Mat 2019/11/4 1 ...