diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/mapper/IMapper.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/mapper/IMapper.java index fd108e32..a4f35734 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/mapper/IMapper.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/mapper/IMapper.java @@ -34,7 +34,7 @@ public interface IMapper extends BaseMapper { * @return 获取 wrapper */ default LambdaQueryWrapper lambda() { - return new LambdaQueryWrapper<>(); + return Conditions.lambda(); } /** diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/Conditions.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/Conditions.java index d00c9251..33c86851 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/Conditions.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/Conditions.java @@ -19,6 +19,16 @@ public class Conditions { private Conditions() { } + /** + * 获取 LambdaQueryWrapper + * + * @param T + * @return wrapper + */ + public static LambdaQueryWrapper lambda() { + return new LambdaQueryWrapper<>(); + } + /** * 条件有效性验证 wrapper * @@ -67,4 +77,28 @@ public class Conditions { return new LambdaQueryWrapper().in(mapping, es); } + /** + * 有效性验证 + * + * @param objects objects + * @return isValidate + */ + public static boolean isIllegal(Object... objects) { + for (Object object : objects) { + // 非 null 检查 + if (object == null) { + return true; + } + // 字符串 非空校验 + if (object instanceof String) { + return ((String) object).isEmpty(); + } + // 集合 非空校验 + if (object instanceof Collection) { + return ((Collection) object).isEmpty(); + } + } + return false; + } + } diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/DataQuery.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/DataQuery.java index c93474fb..f8fed2d6 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/DataQuery.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/DataQuery.java @@ -1,12 +1,15 @@ package com.orion.ops.framework.mybatis.core.query; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.interfaces.Join; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.orion.lang.define.wrapper.DataGrid; import com.orion.lang.define.wrapper.IPageRequest; +import com.orion.lang.define.wrapper.PageRequest; import com.orion.lang.define.wrapper.Pager; +import com.orion.lang.utils.Exceptions; import com.orion.lang.utils.Objects1; import com.orion.lang.utils.Valid; import com.orion.lang.utils.collect.Lists; @@ -35,13 +38,13 @@ public class DataQuery { private IPageRequest page; - private LambdaQueryWrapper wrapper; + private Wrapper wrapper; private DataQuery(BaseMapper dao) { this.dao = dao; } - private DataQuery(BaseMapper dao, LambdaQueryWrapper wrapper) { + private DataQuery(BaseMapper dao, Wrapper wrapper) { this.dao = dao; this.wrapper = wrapper; } @@ -65,7 +68,7 @@ public class DataQuery { return new DataQuery<>(dao); } - public static DataQuery of(BaseMapper dao, LambdaQueryWrapper wrapper) { + public static DataQuery of(BaseMapper dao, Wrapper wrapper) { Valid.notNull(dao, "dao is null"); return new DataQuery<>(dao, wrapper); } @@ -75,14 +78,45 @@ public class DataQuery { return this; } - public DataQuery wrapper(LambdaQueryWrapper wrapper) { + public DataQuery page(int page, int limit) { + this.page = new PageRequest(page, limit); + return this; + } + + public DataQuery wrapper(Wrapper wrapper) { this.wrapper = Valid.notNull(wrapper, "wrapper is null"); return this; } + // -------------------- condition -------------------- + + public ThenLambdaWrapper createWrapper() { + return this.createWrapper(false); + } + + public ThenLambdaWrapper createValidateWrapper() { + return this.createWrapper(true); + } + + public ThenLambdaWrapper createWrapper(boolean validate) { + ThenLambdaWrapper then = validate + ? new ThenValidateLambdaWrapper<>(this) + : new ThenLambdaWrapper<>(this); + this.wrapper = then; + return then; + } + public DataQuery only() { - wrapper.last(Const.LIMIT_1); - return this; + return this.last(Const.LIMIT_1); + } + + public DataQuery last(String lastSql) { + if (wrapper instanceof Join) { + ((Join) wrapper).last(lastSql); + return this; + } else { + throw Exceptions.argument("wrapper not implements Join"); + } } // -------------------- id -------------------- @@ -176,8 +210,9 @@ public class DataQuery { pager.setTotal(count.intValue()); boolean next = pager.hasMoreData(); if (next) { - wrapper.last(pager.getSql()); - List rows = dao.selectList(wrapper).stream() + this.last(pager.getSql()); + List rows = dao.selectList(wrapper) + .stream() .map(mapper) .collect(Collectors.toList()); pager.setRows(rows); diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/Then.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/Then.java new file mode 100644 index 00000000..438e4ad7 --- /dev/null +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/Then.java @@ -0,0 +1,19 @@ +package com.orion.ops.framework.mybatis.core.query; + +/** + * 链式操作 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/10/7 14:57 + */ +public interface Then { + + /** + * 获取 + * + * @return T + */ + T then(); + +} diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/ThenLambdaWrapper.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/ThenLambdaWrapper.java new file mode 100644 index 00000000..4dea7362 --- /dev/null +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/ThenLambdaWrapper.java @@ -0,0 +1,111 @@ +package com.orion.ops.framework.mybatis.core.query; + +import com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper; +import com.baomidou.mybatisplus.core.conditions.SharedString; +import com.baomidou.mybatisplus.core.conditions.query.Query; +import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; +import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Predicate; + +/** + * 复制 LambdaQueryWrapper + * 实现 Then + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/10/8 15:13 + */ +public class ThenLambdaWrapper extends AbstractLambdaWrapper> + implements Query, T, SFunction>, Then> { + + private final DataQuery dataQuery; + + /** + * 查询字段 + */ + private SharedString sqlSelect = new SharedString(); + + public ThenLambdaWrapper(DataQuery dataQuery) { + this((T) null, dataQuery); + } + + public ThenLambdaWrapper(T entity, DataQuery dataQuery) { + super.setEntity(entity); + super.initNeed(); + this.dataQuery = dataQuery; + } + + ThenLambdaWrapper(T entity, Class entityClass, SharedString sqlSelect, AtomicInteger paramNameSeq, + Map paramNameValuePairs, MergeSegments mergeSegments, SharedString paramAlias, + SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, DataQuery dataQuery) { + super.setEntity(entity); + super.setEntityClass(entityClass); + this.paramNameSeq = paramNameSeq; + this.paramNameValuePairs = paramNameValuePairs; + this.expression = mergeSegments; + this.sqlSelect = sqlSelect; + this.paramAlias = paramAlias; + this.lastSql = lastSql; + this.sqlComment = sqlComment; + this.sqlFirst = sqlFirst; + this.dataQuery = dataQuery; + } + + @SafeVarargs + @Override + public final ThenLambdaWrapper select(SFunction... columns) { + return select(Arrays.asList(columns)); + } + + public ThenLambdaWrapper select(List> columns) { + if (CollectionUtils.isNotEmpty(columns)) { + this.sqlSelect.setStringValue(columnsToString(false, columns)); + } + return typedThis; + } + + @Override + public ThenLambdaWrapper select(Class entityClass, Predicate predicate) { + if (entityClass == null) { + entityClass = getEntityClass(); + } else { + setEntityClass(entityClass); + } + Assert.notNull(entityClass, "entityClass can not be null"); + this.sqlSelect.setStringValue(TableInfoHelper.getTableInfo(entityClass).chooseSelect(predicate)); + return typedThis; + } + + @Override + public String getSqlSelect() { + return sqlSelect.getStringValue(); + } + + @Override + protected ThenLambdaWrapper instance() { + return new ThenLambdaWrapper<>(getEntity(), getEntityClass(), null, paramNameSeq, paramNameValuePairs, + new MergeSegments(), paramAlias, SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), + dataQuery); + } + + @Override + public void clear() { + super.clear(); + sqlSelect.toNull(); + } + + @Override + public DataQuery then() { + return dataQuery; + } + +} diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/ThenValidateLambdaWrapper.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/ThenValidateLambdaWrapper.java new file mode 100644 index 00000000..3acddef5 --- /dev/null +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/ThenValidateLambdaWrapper.java @@ -0,0 +1,167 @@ +package com.orion.ops.framework.mybatis.core.query; + +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; + +import java.util.Collection; + +import static com.orion.ops.framework.mybatis.core.query.Conditions.isIllegal; + +/** + * 复制 ValidateLambdaWrapper + * 继承 ThenLambdaWrapper + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/10/7 15:26 + */ +public class ThenValidateLambdaWrapper extends ThenLambdaWrapper { + + public ThenValidateLambdaWrapper(DataQuery dataQuery) { + super(dataQuery); + } + + @Override + public ThenLambdaWrapper eq(SFunction column, Object val) { + if (isIllegal(val)) { + return this; + } + return super.eq(column, val); + } + + @Override + public ThenLambdaWrapper ne(SFunction column, Object val) { + if (isIllegal(val)) { + return this; + } + return super.ne(column, val); + } + + @Override + public ThenLambdaWrapper gt(SFunction column, Object val) { + if (isIllegal(val)) { + return this; + } + return super.gt(column, val); + } + + @Override + public ThenLambdaWrapper ge(SFunction column, Object val) { + if (isIllegal(val)) { + return this; + } + return super.ge(column, val); + } + + @Override + public ThenLambdaWrapper lt(SFunction column, Object val) { + if (isIllegal(val)) { + return this; + } + return super.lt(column, val); + } + + @Override + public ThenLambdaWrapper le(SFunction column, Object val) { + if (isIllegal(val)) { + return this; + } + return super.le(column, val); + } + + @Override + public ThenLambdaWrapper between(SFunction column, Object val1, Object val2) { + if (isIllegal(val1, val2)) { + return this; + } + return super.between(column, val1, val2); + } + + @Override + public ThenLambdaWrapper notBetween(SFunction column, Object val1, Object val2) { + if (isIllegal(val1, val2)) { + return this; + } + return super.notBetween(column, val1, val2); + } + + @Override + public ThenLambdaWrapper like(SFunction column, Object val) { + if (isIllegal(val)) { + return this; + } + return super.like(column, val); + } + + @Override + public ThenLambdaWrapper notLike(SFunction column, Object val) { + if (isIllegal(val)) { + return this; + } + return super.notLike(column, val); + } + + @Override + public ThenLambdaWrapper notLikeLeft(SFunction column, Object val) { + if (isIllegal(val)) { + return this; + } + return super.notLikeLeft(column, val); + } + + @Override + public ThenLambdaWrapper notLikeRight(SFunction column, Object val) { + if (isIllegal(val)) { + return this; + } + return super.notLikeRight(column, val); + } + + @Override + public ThenLambdaWrapper likeLeft(SFunction column, Object val) { + if (isIllegal(val)) { + return this; + } + return super.likeLeft(column, val); + } + + @Override + public ThenLambdaWrapper likeRight(SFunction column, Object val) { + if (isIllegal(val)) { + return this; + } + return super.likeRight(column, val); + } + + @Override + public ThenLambdaWrapper in(SFunction column, Collection coll) { + if (isIllegal(coll)) { + return this; + } + return super.in(column, coll); + } + + @Override + public ThenLambdaWrapper in(SFunction column, Object... values) { + if (isIllegal(values)) { + return this; + } + return super.in(column, values); + } + + @Override + public ThenLambdaWrapper notIn(SFunction column, Collection coll) { + if (isIllegal(coll)) { + return this; + } + return super.notIn(column, coll); + } + + @Override + public ThenLambdaWrapper notIn(SFunction column, Object... value) { + if (isIllegal(value)) { + return this; + } + return super.notIn(column, value); + } + +} diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/ValidateLambdaWrapper.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/ValidateLambdaWrapper.java index 460a5cf1..094c9d6b 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/ValidateLambdaWrapper.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/ValidateLambdaWrapper.java @@ -2,10 +2,11 @@ package com.orion.ops.framework.mybatis.core.query; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; -import com.orion.lang.utils.Strings; import java.util.Collection; +import static com.orion.ops.framework.mybatis.core.query.Conditions.isIllegal; + /** * 有效性验证 wrapper * @@ -26,33 +27,9 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { super(entityClass); } - /** - * 有效性验证 - * - * @param objects objects - * @return isValidate - */ - private boolean isIllegal(Object... objects) { - for (Object object : objects) { - // 非 null 检查 - if (object == null) { - return true; - } - // 字符串 非空校验 - if (object instanceof String) { - return Strings.isEmpty((String) object); - } - // 集合 非空校验 - if (object instanceof Collection) { - return ((Collection) object).isEmpty(); - } - } - return false; - } - @Override public LambdaQueryWrapper eq(SFunction column, Object val) { - if (this.isIllegal(val)) { + if (isIllegal(val)) { return this; } return super.eq(column, val); @@ -60,7 +37,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper ne(SFunction column, Object val) { - if (this.isIllegal(val)) { + if (isIllegal(val)) { return this; } return super.ne(column, val); @@ -68,7 +45,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper gt(SFunction column, Object val) { - if (this.isIllegal(val)) { + if (isIllegal(val)) { return this; } return super.gt(column, val); @@ -76,7 +53,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper ge(SFunction column, Object val) { - if (this.isIllegal(val)) { + if (isIllegal(val)) { return this; } return super.ge(column, val); @@ -84,7 +61,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper lt(SFunction column, Object val) { - if (this.isIllegal(val)) { + if (isIllegal(val)) { return this; } return super.lt(column, val); @@ -92,7 +69,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper le(SFunction column, Object val) { - if (this.isIllegal(val)) { + if (isIllegal(val)) { return this; } return super.le(column, val); @@ -100,7 +77,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper between(SFunction column, Object val1, Object val2) { - if (this.isIllegal(val1, val2)) { + if (isIllegal(val1, val2)) { return this; } return super.between(column, val1, val2); @@ -108,7 +85,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper notBetween(SFunction column, Object val1, Object val2) { - if (this.isIllegal(val1, val2)) { + if (isIllegal(val1, val2)) { return this; } return super.notBetween(column, val1, val2); @@ -116,7 +93,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper like(SFunction column, Object val) { - if (this.isIllegal(val)) { + if (isIllegal(val)) { return this; } return super.like(column, val); @@ -124,7 +101,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper notLike(SFunction column, Object val) { - if (this.isIllegal(val)) { + if (isIllegal(val)) { return this; } return super.notLike(column, val); @@ -132,7 +109,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper notLikeLeft(SFunction column, Object val) { - if (this.isIllegal(val)) { + if (isIllegal(val)) { return this; } return super.notLikeLeft(column, val); @@ -140,7 +117,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper notLikeRight(SFunction column, Object val) { - if (this.isIllegal(val)) { + if (isIllegal(val)) { return this; } return super.notLikeRight(column, val); @@ -148,7 +125,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper likeLeft(SFunction column, Object val) { - if (this.isIllegal(val)) { + if (isIllegal(val)) { return this; } return super.likeLeft(column, val); @@ -156,7 +133,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper likeRight(SFunction column, Object val) { - if (this.isIllegal(val)) { + if (isIllegal(val)) { return this; } return super.likeRight(column, val); @@ -164,7 +141,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper in(SFunction column, Collection coll) { - if (this.isIllegal(coll)) { + if (isIllegal(coll)) { return this; } return super.in(column, coll); @@ -172,7 +149,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper in(SFunction column, Object... values) { - if (this.isIllegal(values)) { + if (isIllegal(values)) { return this; } return super.in(column, values); @@ -180,7 +157,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper notIn(SFunction column, Collection coll) { - if (this.isIllegal(coll)) { + if (isIllegal(coll)) { return this; } return super.notIn(column, coll); @@ -188,7 +165,7 @@ public class ValidateLambdaWrapper extends LambdaQueryWrapper { @Override public LambdaQueryWrapper notIn(SFunction column, Object... value) { - if (this.isIllegal(value)) { + if (isIllegal(value)) { return this; } return super.notIn(column, value);