[重大更新] 增加mybatis-plus扩展工具 大幅简化整体业务代码写法 优雅舒适

This commit is contained in:
疯狂的狮子Li
2026-05-15 11:39:20 +08:00
parent fdf9e4ae39
commit 7a5d6b4723
44 changed files with 1535 additions and 483 deletions
@@ -7,7 +7,9 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.reflect.GenericTypeUtils;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.toolkit.ChainWrappers;
import com.baomidou.mybatisplus.extension.toolkit.Db;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;
@@ -60,6 +62,24 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
return this.selectList(new QueryWrapper<>());
}
/**
* 创建当前 Mapper 绑定的 Lambda CRUD 链式操作。
*
* @return Lambda CRUD 链式包装器
*/
default LambdaCrudChainWrapper<T, V> lambda() {
return new LambdaCrudChainWrapper<>(this);
}
/**
* 创建当前 Mapper 绑定的 Lambda 链式更新。
*
* @return Lambda 链式更新包装器
*/
default LambdaUpdateChainWrapper<T> lambdaUpdate() {
return ChainWrappers.lambdaUpdateChain(this);
}
/**
* 批量插入实体对象集合
*
@@ -0,0 +1,399 @@
package org.dromara.common.mybatis.core.mapper;
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.conditions.update.Update;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.Constants;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import org.dromara.common.mybatis.core.query.LambdaQueryCondition;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.function.Predicate;
/**
* Mapper 级 Lambda CRUD 链式包装器。
*
* @param <T> table 泛型
* @param <V> vo 泛型
* @author Lion Li
*/
public class LambdaCrudChainWrapper<T, V> extends AbstractLambdaWrapper<T, LambdaCrudChainWrapper<T, V>>
implements Query<LambdaCrudChainWrapper<T, V>, T, SFunction<T, ?>>,
Update<LambdaCrudChainWrapper<T, V>, SFunction<T, ?>>,
LambdaQueryCondition<T, LambdaCrudChainWrapper<T, V>> {
private final BaseMapperPlus<T, V> baseMapper;
private final List<String> sqlSet;
private SharedString sqlSelect = new SharedString();
public LambdaCrudChainWrapper(BaseMapperPlus<T, V> baseMapper) {
this.baseMapper = baseMapper;
super.setEntityClass(baseMapper.currentModelClass());
super.initNeed();
this.sqlSet = new ArrayList<>();
}
LambdaCrudChainWrapper(BaseMapperPlus<T, V> baseMapper, T entity, Class<T> entityClass, SharedString sqlSelect,
List<String> sqlSet, AtomicInteger paramNameSeq, Map<String, Object> paramNameValuePairs,
MergeSegments mergeSegments, SharedString paramAlias, SharedString lastSql,
SharedString sqlComment, SharedString sqlFirst) {
this.baseMapper = baseMapper;
super.setEntity(entity);
super.setEntityClass(entityClass);
this.sqlSelect = sqlSelect == null ? new SharedString() : sqlSelect;
this.sqlSet = sqlSet == null ? new ArrayList<>() : sqlSet;
this.paramNameSeq = paramNameSeq;
this.paramNameValuePairs = paramNameValuePairs;
this.expression = mergeSegments;
this.paramAlias = paramAlias;
this.lastSql = lastSql;
this.sqlComment = sqlComment;
this.sqlFirst = sqlFirst;
}
@Override
public LambdaCrudChainWrapper<T, V> select(boolean condition, List<SFunction<T, ?>> columns) {
if (condition && CollectionUtils.isNotEmpty(columns)) {
this.sqlSelect.setStringValue(columnsToString(false, columns));
}
return typedThis;
}
@SafeVarargs
public final LambdaCrudChainWrapper<T, V> select(SFunction<T, ?>... columns) {
return select(true, CollectionUtils.toList(columns));
}
@SafeVarargs
public final LambdaCrudChainWrapper<T, V> select(boolean condition, SFunction<T, ?>... columns) {
return select(condition, CollectionUtils.toList(columns));
}
@Override
public LambdaCrudChainWrapper<T, V> select(Class<T> entityClass, Predicate<TableFieldInfo> 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
public LambdaCrudChainWrapper<T, V> set(boolean condition, SFunction<T, ?> column, Object val, String mapping) {
return maybeDo(condition, () -> {
String sql = formatParam(mapping, val);
sqlSet.add(columnToString(column) + Constants.EQUALS + sql);
});
}
/**
* 值不为 null 时设置更新字段。
*
* @param column 字段
* @param value 值
* @return this
*/
public LambdaCrudChainWrapper<T, V> setIfPresent(SFunction<T, ?> column, Object value) {
return set(value != null, column, value);
}
/**
* 文本不为空时设置更新字段。
*
* @param column 字段
* @param value 值
* @return this
*/
public LambdaCrudChainWrapper<T, V> setIfText(SFunction<T, ?> column, String value) {
return set(org.dromara.common.core.utils.StringUtils.isNotBlank(value), column, value);
}
@Override
public LambdaCrudChainWrapper<T, V> setSql(boolean condition, String setSql, Object... params) {
return maybeDo(condition && StringUtils.isNotBlank(setSql), () -> sqlSet.add(formatSqlMaybeWithParam(setSql, params)));
}
@Override
public LambdaCrudChainWrapper<T, V> setIncrBy(boolean condition, SFunction<T, ?> column, Number val) {
return maybeDo(condition, () -> {
String realColumn = columnToString(column);
String realVal = val instanceof BigDecimal ? ((BigDecimal) val).toPlainString() : String.valueOf(val);
sqlSet.add(String.format("%s=%s + %s", realColumn, realColumn, realVal));
});
}
@Override
public LambdaCrudChainWrapper<T, V> setDecrBy(boolean condition, SFunction<T, ?> column, Number val) {
return maybeDo(condition, () -> {
String realColumn = columnToString(column);
String realVal = val instanceof BigDecimal ? ((BigDecimal) val).toPlainString() : String.valueOf(val);
sqlSet.add(String.format("%s=%s - %s", realColumn, realColumn, realVal));
});
}
@Override
public String getSqlSet() {
if (CollectionUtils.isEmpty(sqlSet)) {
return null;
}
return String.join(Constants.COMMA, sqlSet);
}
/**
* 获取查询条件 Wrapper。
*
* @return this
*/
public LambdaCrudChainWrapper<T, V> getWrapper() {
return typedThis;
}
public LambdaCrudChainWrapper<T, V> findInSet(Object value, SFunction<T, ?> column) {
return findInSet(true, value, column);
}
public LambdaCrudChainWrapper<T, V> findInSet(boolean condition, Object value, SFunction<T, ?> column) {
return findInSet(condition, value, columnToString(column));
}
public LambdaCrudChainWrapper<T, V> findInSetIfPresent(Object value, SFunction<T, ?> column) {
return findInSet(value != null, value, column);
}
/**
* 获取当前 Wrapper。
*
* @return this
*/
public LambdaCrudChainWrapper<T, V> build() {
return typedThis;
}
/**
* 查询实体列表。
*
* @return 实体列表
*/
public List<T> list() {
return baseMapper.selectList(typedThis);
}
/**
* 查询实体分页记录。
*
* @param page 分页条件
* @return 实体分页记录
*/
public List<T> list(IPage<T> page) {
return baseMapper.selectList(page, typedThis);
}
/**
* 查询 VO 列表。
*
* @return VO 列表
*/
public List<V> voList() {
return baseMapper.selectVoList(typedThis);
}
/**
* 查询单列对象列表。
*
* @return 单列对象列表
*/
public List<Object> objs() {
return baseMapper.selectObjs(typedThis);
}
/**
* 查询单列对象列表并转换类型。
*
* @param mapper 转换函数
* @param <C> 转换后的类型
* @return 单列对象列表
*/
public <C> List<C> objs(Function<? super Object, C> mapper) {
return baseMapper.selectObjs(typedThis, mapper);
}
/**
* 查询单个实体。
*
* @return 实体
*/
public T one() {
return baseMapper.selectOne(typedThis);
}
/**
* 查询单个实体。
*
* @param throwEx 查询到多条时是否抛异常
* @return 实体
*/
public T one(boolean throwEx) {
return baseMapper.selectOne(typedThis, throwEx);
}
/**
* 查询单个实体 Optional。
*
* @return Optional 实体
*/
public Optional<T> oneOpt() {
return Optional.ofNullable(one());
}
/**
* 查询单个 VO。
*
* @return VO
*/
public V voOne() {
return baseMapper.selectVoOne(typedThis);
}
/**
* 查询单个 VO。
*
* @param throwEx 查询到多条时是否抛异常
* @return VO
*/
public V voOne(boolean throwEx) {
return baseMapper.selectVoOne(typedThis, throwEx);
}
/**
* 查询数量。
*
* @return 数量
*/
public Long count() {
return baseMapper.selectCount(typedThis);
}
/**
* 判断是否存在。
*
* @return 是否存在
*/
public boolean exists() {
return baseMapper.exists(typedThis);
}
/**
* 查询实体分页。
*
* @param page 分页条件
* @param <P> 分页类型
* @return 实体分页
*/
public <P extends IPage<T>> P page(P page) {
return baseMapper.selectPage(page, typedThis);
}
/**
* 查询 VO 分页。
*
* @param page 分页条件
* @param <P> 分页类型
* @return VO 分页
*/
public <P extends IPage<V>> P voPage(IPage<T> page) {
return baseMapper.selectVoPage(page, typedThis);
}
/**
* 删除数据。
*
* @return 是否删除成功
*/
public boolean delete() {
return deleteCount() > 0;
}
/**
* 删除数据。
*
* @return 影响行数
*/
public int deleteCount() {
return baseMapper.delete(typedThis);
}
/**
* 使用 set 片段更新数据。
*
* @return 是否更新成功
*/
public boolean update() {
return updateCount() > 0;
}
/**
* 使用实体和查询条件更新数据。
*
* @param entity 实体
* @return 是否更新成功
*/
public boolean update(T entity) {
return updateCount(entity) > 0;
}
/**
* 使用 set 片段更新数据。
*
* @return 影响行数
*/
public int updateCount() {
return baseMapper.update(typedThis);
}
/**
* 使用实体和查询条件更新数据。
*
* @param entity 实体
* @return 影响行数
*/
public int updateCount(T entity) {
return baseMapper.update(entity, typedThis);
}
@Override
protected LambdaCrudChainWrapper<T, V> instance() {
return new LambdaCrudChainWrapper<>(baseMapper, getEntity(), getEntityClass(), null, null, paramNameSeq,
paramNameValuePairs, new MergeSegments(), paramAlias, SharedString.emptyString(), SharedString.emptyString(),
SharedString.emptyString());
}
@Override
public void clear() {
super.clear();
sqlSelect.toNull();
sqlSet.clear();
}
}
@@ -0,0 +1,422 @@
package org.dromara.common.mybatis.core.query;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
/**
* LambdaQueryWrapper 条件构造辅助类。
*
* @param <T> 实体类型
* @author Lion Li
*/
public final class LambdaQueryBuilder<T> implements LambdaQueryCondition<T, LambdaQueryBuilder<T>> {
private final LambdaQueryWrapper<T> wrapper;
LambdaQueryBuilder(LambdaQueryWrapper<T> wrapper) {
this.wrapper = wrapper;
}
@SafeVarargs
public final LambdaQueryBuilder<T> select(SFunction<T, ?>... columns) {
wrapper.select(columns);
return this;
}
public LambdaQueryBuilder<T> eq(SFunction<T, ?> column, Object value) {
wrapper.eq(column, value);
return this;
}
public LambdaQueryBuilder<T> eq(boolean condition, SFunction<T, ?> column, Object value) {
wrapper.eq(condition, column, value);
return this;
}
public LambdaQueryBuilder<T> ne(SFunction<T, ?> column, Object value) {
wrapper.ne(column, value);
return this;
}
public LambdaQueryBuilder<T> ne(boolean condition, SFunction<T, ?> column, Object value) {
wrapper.ne(condition, column, value);
return this;
}
public LambdaQueryBuilder<T> gt(SFunction<T, ?> column, Object value) {
wrapper.gt(column, value);
return this;
}
public LambdaQueryBuilder<T> gt(boolean condition, SFunction<T, ?> column, Object value) {
wrapper.gt(condition, column, value);
return this;
}
public LambdaQueryBuilder<T> ge(SFunction<T, ?> column, Object value) {
wrapper.ge(column, value);
return this;
}
public LambdaQueryBuilder<T> ge(boolean condition, SFunction<T, ?> column, Object value) {
wrapper.ge(condition, column, value);
return this;
}
public LambdaQueryBuilder<T> lt(SFunction<T, ?> column, Object value) {
wrapper.lt(column, value);
return this;
}
public LambdaQueryBuilder<T> lt(boolean condition, SFunction<T, ?> column, Object value) {
wrapper.lt(condition, column, value);
return this;
}
public LambdaQueryBuilder<T> le(SFunction<T, ?> column, Object value) {
wrapper.le(column, value);
return this;
}
public LambdaQueryBuilder<T> le(boolean condition, SFunction<T, ?> column, Object value) {
wrapper.le(condition, column, value);
return this;
}
public LambdaQueryBuilder<T> like(SFunction<T, ?> column, Object value) {
wrapper.like(column, value);
return this;
}
public LambdaQueryBuilder<T> like(boolean condition, SFunction<T, ?> column, Object value) {
wrapper.like(condition, column, value);
return this;
}
public LambdaQueryBuilder<T> notLike(SFunction<T, ?> column, Object value) {
wrapper.notLike(column, value);
return this;
}
public LambdaQueryBuilder<T> notLike(boolean condition, SFunction<T, ?> column, Object value) {
wrapper.notLike(condition, column, value);
return this;
}
public LambdaQueryBuilder<T> likeLeft(SFunction<T, ?> column, Object value) {
wrapper.likeLeft(column, value);
return this;
}
public LambdaQueryBuilder<T> likeLeft(boolean condition, SFunction<T, ?> column, Object value) {
wrapper.likeLeft(condition, column, value);
return this;
}
public LambdaQueryBuilder<T> likeRight(SFunction<T, ?> column, Object value) {
wrapper.likeRight(column, value);
return this;
}
public LambdaQueryBuilder<T> likeRight(boolean condition, SFunction<T, ?> column, Object value) {
wrapper.likeRight(condition, column, value);
return this;
}
public LambdaQueryBuilder<T> between(SFunction<T, ?> column, Object begin, Object end) {
wrapper.between(column, begin, end);
return this;
}
public LambdaQueryBuilder<T> between(boolean condition, SFunction<T, ?> column, Object begin, Object end) {
wrapper.between(condition, column, begin, end);
return this;
}
public LambdaQueryBuilder<T> notBetween(SFunction<T, ?> column, Object begin, Object end) {
wrapper.notBetween(column, begin, end);
return this;
}
public LambdaQueryBuilder<T> notBetween(boolean condition, SFunction<T, ?> column, Object begin, Object end) {
wrapper.notBetween(condition, column, begin, end);
return this;
}
public LambdaQueryBuilder<T> allEq(Map<?, ?> params, boolean null2IsNull) {
wrapper.allEq(true, (Map) params, null2IsNull);
return this;
}
public LambdaQueryBuilder<T> allEq(boolean condition, Map<?, ?> params, boolean null2IsNull) {
wrapper.allEq(condition, (Map) params, null2IsNull);
return this;
}
public LambdaQueryBuilder<T> allEq(BiPredicate<SFunction<T, ?>, Object> filter, Map<?, ?> params, boolean null2IsNull) {
wrapper.allEq(true, (BiPredicate) filter, (Map) params, null2IsNull);
return this;
}
public LambdaQueryBuilder<T> allEq(boolean condition, BiPredicate<SFunction<T, ?>, Object> filter, Map<?, ?> params, boolean null2IsNull) {
wrapper.allEq(condition, (BiPredicate) filter, (Map) params, null2IsNull);
return this;
}
public LambdaQueryBuilder<T> isNull(SFunction<T, ?> column) {
wrapper.isNull(column);
return this;
}
public LambdaQueryBuilder<T> isNull(boolean condition, SFunction<T, ?> column) {
wrapper.isNull(condition, column);
return this;
}
public LambdaQueryBuilder<T> isNotNull(SFunction<T, ?> column) {
wrapper.isNotNull(column);
return this;
}
public LambdaQueryBuilder<T> isNotNull(boolean condition, SFunction<T, ?> column) {
wrapper.isNotNull(condition, column);
return this;
}
public LambdaQueryBuilder<T> in(SFunction<T, ?> column, Collection<?> values) {
wrapper.in(column, values);
return this;
}
public LambdaQueryBuilder<T> in(boolean condition, SFunction<T, ?> column, Collection<?> values) {
wrapper.in(condition, column, values);
return this;
}
public LambdaQueryBuilder<T> in(SFunction<T, ?> column, Object... values) {
wrapper.in(column, values);
return this;
}
public LambdaQueryBuilder<T> in(boolean condition, SFunction<T, ?> column, Object... values) {
wrapper.in(condition, column, values);
return this;
}
public LambdaQueryBuilder<T> notIn(SFunction<T, ?> column, Collection<?> values) {
wrapper.notIn(column, values);
return this;
}
public LambdaQueryBuilder<T> notIn(boolean condition, SFunction<T, ?> column, Collection<?> values) {
wrapper.notIn(condition, column, values);
return this;
}
public LambdaQueryBuilder<T> notIn(SFunction<T, ?> column, Object... values) {
wrapper.notIn(column, values);
return this;
}
public LambdaQueryBuilder<T> notIn(boolean condition, SFunction<T, ?> column, Object... values) {
wrapper.notIn(condition, column, values);
return this;
}
@SafeVarargs
public final LambdaQueryBuilder<T> groupBy(SFunction<T, ?>... columns) {
wrapper.groupBy(Arrays.asList(columns));
return this;
}
@SafeVarargs
public final LambdaQueryBuilder<T> groupBy(boolean condition, SFunction<T, ?>... columns) {
wrapper.groupBy(condition, Arrays.asList(columns));
return this;
}
public LambdaQueryBuilder<T> orderBy(boolean condition, boolean isAsc, SFunction<T, ?> column) {
wrapper.orderBy(condition, isAsc, column);
return this;
}
@SafeVarargs
public final LambdaQueryBuilder<T> orderByAsc(SFunction<T, ?>... columns) {
wrapper.orderByAsc(Arrays.asList(columns));
return this;
}
@SafeVarargs
public final LambdaQueryBuilder<T> orderByAsc(boolean condition, SFunction<T, ?>... columns) {
wrapper.orderByAsc(condition, Arrays.asList(columns));
return this;
}
@SafeVarargs
public final LambdaQueryBuilder<T> orderByDesc(SFunction<T, ?>... columns) {
wrapper.orderByDesc(Arrays.asList(columns));
return this;
}
@SafeVarargs
public final LambdaQueryBuilder<T> orderByDesc(boolean condition, SFunction<T, ?>... columns) {
wrapper.orderByDesc(condition, Arrays.asList(columns));
return this;
}
public LambdaQueryBuilder<T> having(String sqlHaving, Object... params) {
wrapper.having(sqlHaving, params);
return this;
}
public LambdaQueryBuilder<T> having(boolean condition, String sqlHaving, Object... params) {
wrapper.having(condition, sqlHaving, params);
return this;
}
public LambdaQueryBuilder<T> and(Consumer<LambdaQueryWrapper<T>> consumer) {
wrapper.and(consumer);
return this;
}
public LambdaQueryBuilder<T> and(boolean condition, Consumer<LambdaQueryWrapper<T>> consumer) {
wrapper.and(condition, consumer);
return this;
}
public LambdaQueryBuilder<T> or() {
wrapper.or();
return this;
}
public LambdaQueryBuilder<T> or(Consumer<LambdaQueryWrapper<T>> consumer) {
wrapper.or(consumer);
return this;
}
public LambdaQueryBuilder<T> or(boolean condition, Consumer<LambdaQueryWrapper<T>> consumer) {
wrapper.or(condition, consumer);
return this;
}
public LambdaQueryBuilder<T> nested(Consumer<LambdaQueryWrapper<T>> consumer) {
wrapper.nested(consumer);
return this;
}
public LambdaQueryBuilder<T> nested(boolean condition, Consumer<LambdaQueryWrapper<T>> consumer) {
wrapper.nested(condition, consumer);
return this;
}
public LambdaQueryBuilder<T> exists(String existsSql, Object... values) {
wrapper.exists(existsSql, values);
return this;
}
public LambdaQueryBuilder<T> exists(boolean condition, String existsSql, Object... values) {
wrapper.exists(condition, existsSql, values);
return this;
}
public LambdaQueryBuilder<T> eqSql(SFunction<T, ?> column, String inValue) {
wrapper.eqSql(true, column, inValue);
return this;
}
public LambdaQueryBuilder<T> eqSql(boolean condition, SFunction<T, ?> column, String inValue) {
wrapper.eqSql(condition, column, inValue);
return this;
}
public LambdaQueryBuilder<T> inSql(SFunction<T, ?> column, String inValue) {
wrapper.inSql(true, column, inValue);
return this;
}
public LambdaQueryBuilder<T> inSql(boolean condition, SFunction<T, ?> column, String inValue) {
wrapper.inSql(condition, column, inValue);
return this;
}
public LambdaQueryBuilder<T> notInSql(SFunction<T, ?> column, String inValue) {
wrapper.notInSql(true, column, inValue);
return this;
}
public LambdaQueryBuilder<T> notInSql(boolean condition, SFunction<T, ?> column, String inValue) {
wrapper.notInSql(condition, column, inValue);
return this;
}
public LambdaQueryBuilder<T> notExists(String existsSql, Object... values) {
wrapper.notExists(existsSql, values);
return this;
}
public LambdaQueryBuilder<T> notExists(boolean condition, String existsSql, Object... values) {
wrapper.notExists(condition, existsSql, values);
return this;
}
public LambdaQueryBuilder<T> apply(String applySql, Object... values) {
wrapper.apply(applySql, values);
return this;
}
public LambdaQueryBuilder<T> apply(boolean condition, String applySql, Object... values) {
wrapper.apply(condition, applySql, values);
return this;
}
public LambdaQueryBuilder<T> apply(Consumer<LambdaQueryWrapper<T>> consumer) {
consumer.accept(wrapper);
return this;
}
public LambdaQueryBuilder<T> func(Consumer<LambdaQueryWrapper<T>> consumer) {
wrapper.func(true, consumer);
return this;
}
public LambdaQueryBuilder<T> func(boolean condition, Consumer<LambdaQueryWrapper<T>> consumer) {
wrapper.func(condition, consumer);
return this;
}
public LambdaQueryBuilder<T> not(Consumer<LambdaQueryWrapper<T>> consumer) {
wrapper.not(true, consumer);
return this;
}
public LambdaQueryBuilder<T> not(boolean condition, Consumer<LambdaQueryWrapper<T>> consumer) {
wrapper.not(condition, consumer);
return this;
}
public LambdaQueryBuilder<T> comment(String comment) {
wrapper.comment(true, comment);
return this;
}
public LambdaQueryBuilder<T> comment(boolean condition, String comment) {
wrapper.comment(condition, comment);
return this;
}
public LambdaQueryBuilder<T> last(String lastSql) {
wrapper.last(lastSql);
return this;
}
public LambdaQueryWrapper<T> build() {
return wrapper;
}
}
@@ -0,0 +1,146 @@
package org.dromara.common.mybatis.core.query;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.helper.DataBaseHelper;
import java.util.Collection;
import java.util.Map;
/**
* Lambda 查询常用条件扩展。
*
* @param <T> 实体类型
* @param <Children> 链式返回类型
* @author Lion Li
*/
public interface LambdaQueryCondition<T, Children> {
Children eq(boolean condition, SFunction<T, ?> column, Object value);
Children ne(boolean condition, SFunction<T, ?> column, Object value);
Children gt(boolean condition, SFunction<T, ?> column, Object value);
Children ge(boolean condition, SFunction<T, ?> column, Object value);
Children lt(boolean condition, SFunction<T, ?> column, Object value);
Children le(boolean condition, SFunction<T, ?> column, Object value);
Children like(boolean condition, SFunction<T, ?> column, Object value);
Children notLike(boolean condition, SFunction<T, ?> column, Object value);
Children likeLeft(boolean condition, SFunction<T, ?> column, Object value);
Children likeRight(boolean condition, SFunction<T, ?> column, Object value);
Children between(boolean condition, SFunction<T, ?> column, Object begin, Object end);
Children notBetween(boolean condition, SFunction<T, ?> column, Object begin, Object end);
Children in(boolean condition, SFunction<T, ?> column, Collection<?> values);
Children in(boolean condition, SFunction<T, ?> column, Object... values);
Children notIn(boolean condition, SFunction<T, ?> column, Collection<?> values);
Children notIn(boolean condition, SFunction<T, ?> column, Object... values);
Children apply(boolean condition, String applySql, Object... values);
default Children eqIfPresent(SFunction<T, ?> column, Object value) {
return eq(value != null, column, value);
}
default Children eqIfText(SFunction<T, ?> column, String value) {
return eq(StringUtils.isNotBlank(value), column, value);
}
default Children neIfPresent(SFunction<T, ?> column, Object value) {
return ne(value != null, column, value);
}
default Children neIfText(SFunction<T, ?> column, String value) {
return ne(StringUtils.isNotBlank(value), column, value);
}
default Children gtIfPresent(SFunction<T, ?> column, Object value) {
return gt(value != null, column, value);
}
default Children geIfPresent(SFunction<T, ?> column, Object value) {
return ge(value != null, column, value);
}
default Children ltIfPresent(SFunction<T, ?> column, Object value) {
return lt(value != null, column, value);
}
default Children leIfPresent(SFunction<T, ?> column, Object value) {
return le(value != null, column, value);
}
default Children likeIfText(SFunction<T, ?> column, String value) {
return like(StringUtils.isNotBlank(value), column, value);
}
default Children notLikeIfText(SFunction<T, ?> column, String value) {
return notLike(StringUtils.isNotBlank(value), column, value);
}
default Children likeLeftIfText(SFunction<T, ?> column, String value) {
return likeLeft(StringUtils.isNotBlank(value), column, value);
}
default Children likeRightIfText(SFunction<T, ?> column, String value) {
return likeRight(StringUtils.isNotBlank(value), column, value);
}
default Children betweenIfPresent(SFunction<T, ?> column, Object begin, Object end) {
return between(begin != null && end != null, column, begin, end);
}
default Children betweenParams(SFunction<T, ?> column, Map<String, Object> params, String beginKey, String endKey) {
if (params == null) {
return between(false, column, null, null);
}
Object begin = params.get(beginKey);
Object end = params.get(endKey);
return between(begin != null && end != null, column, begin, end);
}
default Children notBetweenIfPresent(SFunction<T, ?> column, Object begin, Object end) {
return notBetween(begin != null && end != null, column, begin, end);
}
default Children inIfNotEmpty(SFunction<T, ?> column, Collection<?> values) {
return in(values != null && !values.isEmpty(), column, values);
}
default Children inIfNotEmpty(SFunction<T, ?> column, Object... values) {
return in(values != null && values.length > 0, column, values);
}
default Children notInIfNotEmpty(SFunction<T, ?> column, Collection<?> values) {
return notIn(values != null && !values.isEmpty(), column, values);
}
default Children notInIfNotEmpty(SFunction<T, ?> column, Object... values) {
return notIn(values != null && values.length > 0, column, values);
}
default Children findInSet(Object value, String column) {
return findInSet(true, value, column);
}
default Children findInSet(boolean condition, Object value, String column) {
return apply(condition, DataBaseHelper.findInSet(value, column));
}
default Children findInSetIfPresent(Object value, String column) {
return findInSet(value != null, value, column);
}
}
@@ -0,0 +1,19 @@
package org.dromara.common.mybatis.core.query;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
/**
* MyBatis-Plus 查询构造器入口。
*
* @author Lion Li
*/
public final class QueryBuilder {
private QueryBuilder() {
}
public static <T> LambdaQueryBuilder<T> lambda(Class<T> entityClass) {
return new LambdaQueryBuilder<>(Wrappers.lambdaQuery(entityClass));
}
}