升级MP依赖3.5.3.2 & 同步新版功能及代码

This commit is contained in:
yulichang 2023-08-13 04:24:06 +08:00
parent a8b91edb6b
commit 9340e5e38f
14 changed files with 151 additions and 26 deletions

View File

@ -46,7 +46,7 @@
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId> <artifactId>mybatis-plus-extension</artifactId>
<version>3.5.3.1</version> <version>3.5.3.2</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@ -58,7 +58,7 @@
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId> <artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version> <version>3.5.3.2</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -67,13 +67,13 @@
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId> <artifactId>mybatis-plus-extension</artifactId>
<version>3.5.3.1</version> <version>3.5.3.2</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<version>1.18.24</version> <version>1.18.28</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
@ -85,7 +85,7 @@
<dependency> <dependency>
<groupId>org.jetbrains.kotlin</groupId> <groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId> <artifactId>kotlin-stdlib-jdk8</artifactId>
<version>1.8.21</version> <version>1.9.0</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@ -1,6 +1,7 @@
package com.github.yulichang.kt; package com.github.yulichang.kt;
import com.baomidou.mybatisplus.core.conditions.SharedString; import com.baomidou.mybatisplus.core.conditions.SharedString;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.core.toolkit.*;
import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.config.ConfigProperties;
@ -11,6 +12,7 @@ import com.github.yulichang.toolkit.KtUtils;
import com.github.yulichang.toolkit.KtWrapperUtils; import com.github.yulichang.toolkit.KtWrapperUtils;
import com.github.yulichang.toolkit.TableList; import com.github.yulichang.toolkit.TableList;
import com.github.yulichang.toolkit.support.ColumnCache; import com.github.yulichang.toolkit.support.ColumnCache;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.github.yulichang.wrapper.interfaces.Chain; import com.github.yulichang.wrapper.interfaces.Chain;
import com.github.yulichang.wrapper.interfaces.SelectWrapper; import com.github.yulichang.wrapper.interfaces.SelectWrapper;
import com.github.yulichang.wrapper.resultmap.Label; import com.github.yulichang.wrapper.resultmap.Label;
@ -58,6 +60,17 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
*/ */
private SharedString unionSql; private SharedString unionSql;
/**
* 自定义wrapper索引
*/
private AtomicInteger wrapperIndex;
/**
* 自定义wrapper
*/
@Getter
private Map<String, Wrapper<?>> wrapperMap;
/** /**
* 推荐使用 class 的构造方法 * 推荐使用 class 的构造方法
@ -192,6 +205,7 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
/** /**
* 子查询 * 子查询
*/ */
@SuppressWarnings("DuplicatedCode")
public KtLambdaWrapper<T> selectSub(Class<?> clazz, String st, Consumer<KtLambdaWrapper<?>> consumer, KProperty<?> alias) { public KtLambdaWrapper<T> selectSub(Class<?> clazz, String st, Consumer<KtLambdaWrapper<?>> consumer, KProperty<?> alias) {
KtLambdaWrapper<?> wrapper = new KtLambdaWrapper(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs, KtLambdaWrapper<?> wrapper = new KtLambdaWrapper(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs,
new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(),
@ -203,6 +217,7 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
wrapper.alias = st; wrapper.alias = st;
wrapper.subTableAlias = st; wrapper.subTableAlias = st;
consumer.accept(wrapper); consumer.accept(wrapper);
addCustomWrapper(wrapper);
String sql = KtWrapperUtils.buildSubSqlByWrapper(clazz, wrapper, alias.getName()); String sql = KtWrapperUtils.buildSubSqlByWrapper(clazz, wrapper, alias.getName());
this.selectColumns.add(new SelectString(sql, hasAlias, this.alias)); this.selectColumns.add(new SelectString(sql, hasAlias, this.alias));
return typedThis; return typedThis;
@ -215,6 +230,7 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
public final KtLambdaWrapper<T> union(KtLambdaWrapper<?>... wrappers) { public final KtLambdaWrapper<T> union(KtLambdaWrapper<?>... wrappers) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (KtLambdaWrapper<?> wrapper : wrappers) { for (KtLambdaWrapper<?> wrapper : wrappers) {
addCustomWrapper(wrapper);
Class<?> entityClass = wrapper.getEntityClass(); Class<?> entityClass = wrapper.getEntityClass();
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法"); Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
sb.append(" UNION ") sb.append(" UNION ")
@ -234,6 +250,7 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
public final <E, F> KtLambdaWrapper<T> unionAll(KtLambdaWrapper<T>... wrappers) { public final <E, F> KtLambdaWrapper<T> unionAll(KtLambdaWrapper<T>... wrappers) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (KtLambdaWrapper<?> wrapper : wrappers) { for (KtLambdaWrapper<?> wrapper : wrappers) {
addCustomWrapper(wrapper);
Class<?> entityClass = wrapper.getEntityClass(); Class<?> entityClass = wrapper.getEntityClass();
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法"); Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
sb.append(" UNION ALL ") sb.append(" UNION ALL ")
@ -246,6 +263,20 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
return typedThis; return typedThis;
} }
@SuppressWarnings("DuplicatedCode")
private void addCustomWrapper(KtLambdaWrapper<?> wrapper) {
if (Objects.isNull(wrapperIndex)) {
wrapperIndex = new AtomicInteger(0);
}
int index = wrapperIndex.incrementAndGet();
if (Objects.isNull(wrapperMap)) {
wrapperMap = new HashMap<>();
}
String key = "ew" + index;
wrapper.setParamAlias(wrapper.getParamAlias() + ".wrapperMap." + key);
wrapperMap.put(key, wrapper);
}
/** /**
* 查询条件 SQL 片段 * 查询条件 SQL 片段
*/ */
@ -329,6 +360,8 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
selectDistinct = false; selectDistinct = false;
sqlSelect.toNull(); sqlSelect.toNull();
selectColumns.clear(); selectColumns.clear();
wrapperIndex = new AtomicInteger(0);
wrapperMap.clear();
resultMapMybatisLabel.clear(); resultMapMybatisLabel.clear();
} }
} }

View File

@ -106,6 +106,16 @@ public class MPJLambdaQueryWrapper<T> extends AbstractLambdaWrapper<T, MPJLambda
return typedThis; return typedThis;
} }
@Override
public MPJLambdaQueryWrapper<T> select(boolean condition, List<SFunction<T, ?>> columns) {
if (condition && CollectionUtils.isNotEmpty(columns)) {
for (SFunction<T, ?> s : columns) {
selectColumns.add(columnToString(s, false));
}
}
return typedThis;
}
/** /**
* 忽略查询字段 * 忽略查询字段
* <p> * <p>

View File

@ -4,14 +4,17 @@ import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
import com.baomidou.mybatisplus.core.conditions.SharedString; import com.baomidou.mybatisplus.core.conditions.SharedString;
import com.baomidou.mybatisplus.core.conditions.query.Query; import com.baomidou.mybatisplus.core.conditions.query.Query;
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.core.toolkit.*;
import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.config.ConfigProperties;
import com.github.yulichang.query.interfaces.StringJoin; import com.github.yulichang.query.interfaces.StringJoin;
import com.github.yulichang.toolkit.Asserts; import com.github.yulichang.toolkit.Asserts;
import com.github.yulichang.toolkit.MPJSqlInjectionUtils;
import com.github.yulichang.toolkit.TableHelper; import com.github.yulichang.toolkit.TableHelper;
import com.github.yulichang.wrapper.interfaces.Chain; import com.github.yulichang.wrapper.interfaces.Chain;
import lombok.Getter;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URLDecoder; import java.net.URLDecoder;
@ -48,6 +51,7 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
/** /**
* 主表别名 * 主表别名
*/ */
@Getter
private String alias = ConfigProperties.tableAlias; private String alias = ConfigProperties.tableAlias;
/** /**
@ -74,6 +78,11 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
*/ */
private Function<String, String> tableNameFunc; private Function<String, String> tableNameFunc;
/**
* 检查 SQL 注入过滤
*/
private boolean checkSqlInjection = false;
public MPJQueryWrapper() { public MPJQueryWrapper() {
super.initNeed(); super.initNeed();
@ -114,6 +123,22 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
this.selectDistinct = selectDistinct; this.selectDistinct = selectDistinct;
} }
/**
* 开启检查 SQL 注入
*/
public MPJQueryWrapper<T> checkSqlInjection() {
this.checkSqlInjection = true;
return this;
}
@Override
protected String columnToString(String column) {
if (checkSqlInjection && MPJSqlInjectionUtils.check(column)) {
throw new MybatisPlusException("Discovering SQL injection column: " + column);
}
return column;
}
/** /**
* sql去重 * sql去重
* select distinct * select distinct
@ -131,6 +156,14 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
return typedThis; return typedThis;
} }
@Override
public MPJQueryWrapper<T> select(boolean condition, List<String> columns) {
if (condition && CollectionUtils.isNotEmpty(columns)) {
selectColumns.addAll(columns);
}
return typedThis;
}
/** /**
* 忽略查询字段 * 忽略查询字段
* <p> * <p>
@ -208,10 +241,6 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
return from.getStringValue(); return from.getStringValue();
} }
public String getAlias() {
return alias;
}
/** /**
* 设置主表别名 * 设置主表别名
* 如果要用请最先调用 * 如果要用请最先调用

View File

@ -69,7 +69,7 @@ public class DeleteJoinWrapper<T> extends MPJAbstractLambdaWrapper<T, DeleteJoin
* 获取删除的表 * 获取删除的表
*/ */
@Override @Override
@SuppressWarnings("UnusedReturnValue") @SuppressWarnings({"UnusedReturnValue", "DuplicatedCode"})
public String getDeleteSql() { public String getDeleteSql() {
if (StringUtils.isNotBlank(this.deleteSql.getStringValue())) { if (StringUtils.isNotBlank(this.deleteSql.getStringValue())) {
return this.deleteSql.getStringValue(); return this.deleteSql.getStringValue();

View File

@ -36,13 +36,14 @@ import static java.util.stream.Collectors.joining;
* *
* @author yulichang * @author yulichang
*/ */
@SuppressWarnings({"DuplicatedCode", "unused"}) @SuppressWarnings({"DuplicatedCode", "unused", "LombokGetterMayBeUsed"})
public abstract class MPJAbstractLambdaWrapper<T, Children extends MPJAbstractLambdaWrapper<T, Children>> public abstract class MPJAbstractLambdaWrapper<T, Children extends MPJAbstractLambdaWrapper<T, Children>>
extends MPJAbstractWrapper<T, Children> implements QueryJoin<Children, T> { extends MPJAbstractWrapper<T, Children> implements QueryJoin<Children, T> {
/** /**
* 主表别名 * 主表别名
*/ */
@Getter
protected String alias = ConfigProperties.tableAlias; protected String alias = ConfigProperties.tableAlias;
/** /**
* 副表别名 * 副表别名
@ -365,10 +366,6 @@ public abstract class MPJAbstractLambdaWrapper<T, Children extends MPJAbstractLa
return from.getStringValue(); return from.getStringValue();
} }
public String getAlias() {
return alias;
}
/** /**
* 内部调用, 不建议使用 * 内部调用, 不建议使用
*/ */
@ -462,6 +459,7 @@ public abstract class MPJAbstractLambdaWrapper<T, Children extends MPJAbstractLa
this.hasAlias = false; this.hasAlias = false;
this.keyWord = null; this.keyWord = null;
this.logicSql = true; this.logicSql = true;
this.checkSqlInjection = false;
this.onWrappers.clear(); this.onWrappers.clear();
} }
} }

View File

@ -1,6 +1,7 @@
package com.github.yulichang.wrapper; package com.github.yulichang.wrapper;
import com.baomidou.mybatisplus.core.conditions.SharedString; import com.baomidou.mybatisplus.core.conditions.SharedString;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.core.toolkit.*;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
@ -57,6 +58,17 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
*/ */
private SharedString unionSql; private SharedString unionSql;
/**
* 自定义wrapper索引
*/
private AtomicInteger wrapperIndex;
/**
* 自定义wrapper
*/
@Getter
private Map<String, Wrapper<?>> wrapperMap;
/** /**
* 推荐使用 class 的构造方法 * 推荐使用 class 的构造方法
*/ */
@ -192,6 +204,7 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
/** /**
* 子查询 * 子查询
*/ */
@SuppressWarnings("DuplicatedCode")
public <E, F> MPJLambdaWrapper<T> selectSub(Class<E> clazz, String st, Consumer<MPJLambdaWrapper<E>> consumer, SFunction<F, ?> alias) { public <E, F> MPJLambdaWrapper<T> selectSub(Class<E> clazz, String st, Consumer<MPJLambdaWrapper<E>> consumer, SFunction<F, ?> alias) {
MPJLambdaWrapper<E> wrapper = new MPJLambdaWrapper<E>(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs, MPJLambdaWrapper<E> wrapper = new MPJLambdaWrapper<E>(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs,
new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(),
@ -203,6 +216,7 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
wrapper.alias = st; wrapper.alias = st;
wrapper.subTableAlias = st; wrapper.subTableAlias = st;
consumer.accept(wrapper); consumer.accept(wrapper);
addCustomWrapper(wrapper);
String sql = WrapperUtils.buildSubSqlByWrapper(clazz, wrapper, LambdaUtils.getName(alias)); String sql = WrapperUtils.buildSubSqlByWrapper(clazz, wrapper, LambdaUtils.getName(alias));
this.selectColumns.add(new SelectString(sql, hasAlias, this.alias)); this.selectColumns.add(new SelectString(sql, hasAlias, this.alias));
return typedThis; return typedThis;
@ -215,6 +229,7 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
public final MPJLambdaWrapper<T> union(MPJLambdaWrapper<?>... wrappers) { public final MPJLambdaWrapper<T> union(MPJLambdaWrapper<?>... wrappers) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (MPJLambdaWrapper<?> wrapper : wrappers) { for (MPJLambdaWrapper<?> wrapper : wrappers) {
addCustomWrapper(wrapper);
Class<?> entityClass = wrapper.getEntityClass(); Class<?> entityClass = wrapper.getEntityClass();
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法"); Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
sb.append(" UNION ") sb.append(" UNION ")
@ -234,6 +249,7 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
public final <E, F> MPJLambdaWrapper<T> unionAll(MPJLambdaWrapper<T>... wrappers) { public final <E, F> MPJLambdaWrapper<T> unionAll(MPJLambdaWrapper<T>... wrappers) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (MPJLambdaWrapper<?> wrapper : wrappers) { for (MPJLambdaWrapper<?> wrapper : wrappers) {
addCustomWrapper(wrapper);
Class<?> entityClass = wrapper.getEntityClass(); Class<?> entityClass = wrapper.getEntityClass();
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法"); Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
sb.append(" UNION ALL ") sb.append(" UNION ALL ")
@ -246,6 +262,20 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
return typedThis; return typedThis;
} }
@SuppressWarnings("DuplicatedCode")
private void addCustomWrapper(MPJLambdaWrapper<?> wrapper) {
if (Objects.isNull(wrapperIndex)) {
wrapperIndex = new AtomicInteger(0);
}
int index = wrapperIndex.incrementAndGet();
if (Objects.isNull(wrapperMap)) {
wrapperMap = new HashMap<>();
}
String key = "ew" + index;
wrapper.setParamAlias(wrapper.getParamAlias() + ".wrapperMap." + key);
wrapperMap.put(key, wrapper);
}
/** /**
* 查询条件 SQL 片段 * 查询条件 SQL 片段
*/ */
@ -329,6 +359,8 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
selectDistinct = false; selectDistinct = false;
sqlSelect.toNull(); sqlSelect.toNull();
selectColumns.clear(); selectColumns.clear();
wrapperIndex = new AtomicInteger(0);
wrapperMap.clear();
resultMapMybatisLabel.clear(); resultMapMybatisLabel.clear();
} }
} }

View File

@ -1,8 +1,10 @@
package com.github.yulichang.wrapper.interfaces; package com.github.yulichang.wrapper.interfaces;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.github.yulichang.wrapper.segments.Select; import com.github.yulichang.wrapper.segments.Select;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* @author yulichang * @author yulichang
@ -21,4 +23,6 @@ public interface SelectWrapper<Entity, Children> {
boolean isResultMap(); boolean isResultMap();
List<?> getResultMapMybatisLabel(); List<?> getResultMapMybatisLabel();
Map<String, Wrapper<?>> getWrapperMap();
} }

View File

@ -51,7 +51,7 @@
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId> <artifactId>mybatis-plus-extension</artifactId>
<version>3.5.3.1</version> <version>3.5.3.2</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -1057,21 +1057,38 @@ class LambdaWrapperTest {
wrapper1.list(); wrapper1.list();
} }
/**
* select 子查询
*/
@Test
void checkOrderBy() {
MPJLambdaWrapper<UserDO> wrapper = JoinWrappers.lambda(UserDO.class)
.selectAll(UserDO.class)
.leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId)
.le(UserDO::getId, 100)
.checkSqlInjection()
.orderByDesc("t.id");
wrapper.list();
}
/** /**
* select 子查询 * select 子查询
*/ */
@Test @Test
void union() { void union() {
ThreadLocalUtils.set();
MPJLambdaWrapper<UserDO> wrapper = JoinWrappers.lambda(UserDO.class) MPJLambdaWrapper<UserDO> wrapper = JoinWrappers.lambda(UserDO.class)
.selectAll(UserDO.class); .selectAll(UserDO.class)
.eq(UserDO::getId, 1);
MPJLambdaWrapper<UserDO> wrapper1 = JoinWrappers.lambda(UserDO.class) MPJLambdaWrapper<UserDO> wrapper1 = JoinWrappers.lambda(UserDO.class)
.selectAll(UserDO.class); .selectAll(UserDO.class)
.eq(UserDO::getName, "张三 2");
MPJLambdaWrapper<UserDO> wrapper2 = JoinWrappers.lambda(UserDO.class) MPJLambdaWrapper<UserDO> wrapper2 = JoinWrappers.lambda(UserDO.class)
.selectAll(UserDO.class); .selectAll(UserDO.class)
.eq(UserDO::getPid, 2);
wrapper.union(wrapper1, wrapper2); wrapper.union(wrapper1, wrapper2);
wrapper.list(); List<UserDO> list = wrapper.list();
System.out.println(1);
assert list.size() == 7;
} }
} }

View File

@ -1128,16 +1128,18 @@ class LambdaWrapperTest {
*/ */
@Test @Test
fun union() { fun union() {
ThreadLocalUtils.set("SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE t.del=false UNION SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE t.del=false UNION SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE t.del=false")
val wrapper: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java) val wrapper: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java)
.selectAll(UserDO::class.java) .selectAll(UserDO::class.java)
.eq(UserDO::id, 1)
val wrapper1: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java) val wrapper1: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java)
.selectAll(UserDO::class.java) .selectAll(UserDO::class.java)
.eq(UserDO::name, "张三 2")
val wrapper2: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java) val wrapper2: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java)
.selectAll(UserDO::class.java) .selectAll(UserDO::class.java)
.eq(UserDO::pid, 2)
wrapper.union(wrapper1, wrapper2) wrapper.union(wrapper1, wrapper2)
wrapper.list() val list = wrapper.list()
println(1) assert(list.size == 7)
} }
} }

View File

@ -47,7 +47,7 @@
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId> <artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version> <version>3.5.3.2</version>
</dependency> </dependency>
<dependency> <dependency>