此文章为个人笔记,考虑之后工作用到,博客方便于查找,
如果可以给他人提供参考价值,那再好不过

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自定义查询策略的更多相关文章

  1. Jpa自定义查询报错(Failed to convert from type [java.lang.Object[]] to type)

    Jpa自定义查询报错 问题背景 今天遇到一个奇怪的报错"Failed to convert from type [java.lang.Object[]] to type",这个报错 ...

  2. Java自定义注解和运行时靠反射获取注解

    转载:http://blog.csdn.net/bao19901210/article/details/17201173/ java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编 ...

  3. 【Kafka】自定义分区策略

    自定义分区策略 思路 Command+Option+shift+N 调出查询页面,找到producer包的Partitioner接口 Partitioner下有一个DefaultPartitioner ...

  4. HttpClient_自定义cookie策略

    实际使用client的过程中,会遇到一种情况,如cookie的Key为空的,此时默认的cookie的策略处理cookie是会报错. 这时咱可以通过重写cookiestore策略来解决如: /** * ...

  5. java自定义注解实现前后台参数校验

    2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...

  6. java自定义注解注解方法、类、属性等等【转】

    http://anole1982.iteye.com/blog/1450421 http://www.open-open.com/doc/view/51fe76de67214563b20b385320 ...

  7. JAVA自定义注释(Target,Retention,Documented,Inherit)

    java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.l ...

  8. java自定义线程池

    如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间.那么有没有一种办法使得线程可以复用,就是执行完一个任 ...

  9. 自定义查询语句SpringData

    虽然官方的API中给我们提供了很多关键字的查询,但是还是不够灵活,因为我们在项目中,会遇见奇葩的业务,我们需要用SpringData中的一个@Query注解. 使用@Query自定义查询 这种查询可以 ...

随机推荐

  1. [ZJJOI2013]K大数查询 整体二分

    [ZJJOI2013]K大数查询 链接 luogu 思路 整体二分. 代码 #include <bits/stdc++.h> #define ll long long using name ...

  2. 【主席树启发式合并】【P3302】[SDOI2013]森林

    Description 给定一个 \(n\) 个节点的森林,有 \(Q\) 次操作,每次要么将森林中某两点联通,保证操作后还是个森林,要么查询两点间权值第 \(k\) 小,保证两点联通.强制在线. L ...

  3. 使用docker部署nginx+tomcat架构

    架构说明: 使用nginx+tomcat实现动态/静态(资源请求)分离和负载均衡. 参考文档: https://www.runoob.com/docker/docker-tutorial.html 配 ...

  4. Salesforce Lightning开发学习(三)Component表单初解

    初步了解了Lightning的组件开发流程后,我们来认识下lightning的表单 点击对象管理器,选择对象:电影(Movie__c),创建字段 标签 API 数据类型  票价  Number__c ...

  5. vue、element-ui开发技巧

    1.vue下input文本框获得光标 html: <el-input size="mini" clearable v-model.trim="addOrEditDa ...

  6. Windows10 下 JAVA JDK版本设置修改操作

    一般情况下,先修改系统环境变量,右键点击桌面上的“此电脑”图标中,选择“属性”,在弹出的属性窗口中选择“高级系统设置”,然后点击“环境变量”     在弹出窗口中的“系统变量”,查到“JAVA_HOM ...

  7. 关于MySQL 通用查询日志和慢查询日志分析(转)

    MySQL中的日志包括:错误日志.二进制日志.通用查询日志.慢查询日志等等.这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志. 1)通用查询日志:记录建立的客户端连接和执行的语句. 2)慢查 ...

  8. C的位运算符

    1.前言 C的位运算符有&(按位与).|(按位或).^(按位异或).~(按位取反),位运算符把运算对象看作是由二进制位组成的位串信息,按位完成指定的运算,得到相应的结果. 2.位运算符 在上面 ...

  9. spring boot 从开发到上线(三)—AOP 异常监控、上报

    在做这个项目的期间,看到一篇很有启发性的文章<程序员你为什么这么累>.对于初级程序员来说,拿到需求,第一反应是用什么技术来尽快的完成任务,这本身并没有问题.但长此以往,不仅被需求的更改搞得 ...

  10. Android开发调试工具ADB的使用

    学习参考博客: https://www.cnblogs.com/meil/archive/2012/05/24/2516055.html ADB(Android Debug Bridge)是Andro ...