升级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>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.5.3.1</version>
<version>3.5.3.2</version>
<scope>provided</scope>
</dependency>
</dependencies>

View File

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

View File

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

View File

@ -1,6 +1,7 @@
package com.github.yulichang.kt;
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.toolkit.*;
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.TableList;
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.SelectWrapper;
import com.github.yulichang.wrapper.resultmap.Label;
@ -58,6 +60,17 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
*/
private SharedString unionSql;
/**
* 自定义wrapper索引
*/
private AtomicInteger wrapperIndex;
/**
* 自定义wrapper
*/
@Getter
private Map<String, Wrapper<?>> wrapperMap;
/**
* 推荐使用 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) {
KtLambdaWrapper<?> wrapper = new KtLambdaWrapper(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs,
new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(),
@ -203,6 +217,7 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
wrapper.alias = st;
wrapper.subTableAlias = st;
consumer.accept(wrapper);
addCustomWrapper(wrapper);
String sql = KtWrapperUtils.buildSubSqlByWrapper(clazz, wrapper, alias.getName());
this.selectColumns.add(new SelectString(sql, hasAlias, this.alias));
return typedThis;
@ -215,6 +230,7 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
public final KtLambdaWrapper<T> union(KtLambdaWrapper<?>... wrappers) {
StringBuilder sb = new StringBuilder();
for (KtLambdaWrapper<?> wrapper : wrappers) {
addCustomWrapper(wrapper);
Class<?> entityClass = wrapper.getEntityClass();
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
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) {
StringBuilder sb = new StringBuilder();
for (KtLambdaWrapper<?> wrapper : wrappers) {
addCustomWrapper(wrapper);
Class<?> entityClass = wrapper.getEntityClass();
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
sb.append(" UNION ALL ")
@ -246,6 +263,20 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
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 片段
*/
@ -329,6 +360,8 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
selectDistinct = false;
sqlSelect.toNull();
selectColumns.clear();
wrapperIndex = new AtomicInteger(0);
wrapperMap.clear();
resultMapMybatisLabel.clear();
}
}

View File

@ -106,6 +106,16 @@ public class MPJLambdaQueryWrapper<T> extends AbstractLambdaWrapper<T, MPJLambda
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>

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

View File

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

View File

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

View File

@ -1,6 +1,7 @@
package com.github.yulichang.wrapper;
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.toolkit.*;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
@ -57,6 +58,17 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
*/
private SharedString unionSql;
/**
* 自定义wrapper索引
*/
private AtomicInteger wrapperIndex;
/**
* 自定义wrapper
*/
@Getter
private Map<String, Wrapper<?>> wrapperMap;
/**
* 推荐使用 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) {
MPJLambdaWrapper<E> wrapper = new MPJLambdaWrapper<E>(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs,
new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(),
@ -203,6 +216,7 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
wrapper.alias = st;
wrapper.subTableAlias = st;
consumer.accept(wrapper);
addCustomWrapper(wrapper);
String sql = WrapperUtils.buildSubSqlByWrapper(clazz, wrapper, LambdaUtils.getName(alias));
this.selectColumns.add(new SelectString(sql, hasAlias, this.alias));
return typedThis;
@ -215,6 +229,7 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
public final MPJLambdaWrapper<T> union(MPJLambdaWrapper<?>... wrappers) {
StringBuilder sb = new StringBuilder();
for (MPJLambdaWrapper<?> wrapper : wrappers) {
addCustomWrapper(wrapper);
Class<?> entityClass = wrapper.getEntityClass();
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
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) {
StringBuilder sb = new StringBuilder();
for (MPJLambdaWrapper<?> wrapper : wrappers) {
addCustomWrapper(wrapper);
Class<?> entityClass = wrapper.getEntityClass();
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
sb.append(" UNION ALL ")
@ -246,6 +262,20 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
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 片段
*/
@ -329,6 +359,8 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
selectDistinct = false;
sqlSelect.toNull();
selectColumns.clear();
wrapperIndex = new AtomicInteger(0);
wrapperMap.clear();
resultMapMybatisLabel.clear();
}
}

View File

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

View File

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

View File

@ -1057,21 +1057,38 @@ class LambdaWrapperTest {
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 子查询
*/
@Test
void union() {
ThreadLocalUtils.set();
MPJLambdaWrapper<UserDO> wrapper = JoinWrappers.lambda(UserDO.class)
.selectAll(UserDO.class);
.selectAll(UserDO.class)
.eq(UserDO::getId, 1);
MPJLambdaWrapper<UserDO> wrapper1 = JoinWrappers.lambda(UserDO.class)
.selectAll(UserDO.class);
.selectAll(UserDO.class)
.eq(UserDO::getName, "张三 2");
MPJLambdaWrapper<UserDO> wrapper2 = JoinWrappers.lambda(UserDO.class)
.selectAll(UserDO.class);
.selectAll(UserDO.class)
.eq(UserDO::getPid, 2);
wrapper.union(wrapper1, wrapper2);
wrapper.list();
System.out.println(1);
List<UserDO> list = wrapper.list();
assert list.size() == 7;
}
}

View File

@ -1128,16 +1128,18 @@ class LambdaWrapperTest {
*/
@Test
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)
.selectAll(UserDO::class.java)
.eq(UserDO::id, 1)
val wrapper1: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java)
.selectAll(UserDO::class.java)
.eq(UserDO::name, "张三 2")
val wrapper2: KtLambdaWrapper<UserDO> = KtWrappers.query(UserDO::class.java)
.selectAll(UserDO::class.java)
.eq(UserDO::pid, 2)
wrapper.union(wrapper1, wrapper2)
wrapper.list()
println(1)
val list = wrapper.list()
assert(list.size == 7)
}
}

View File

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