diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml
index 07ecad3..c685062 100644
--- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml
+++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml
@@ -46,7 +46,13 @@
com.baomidou
mybatis-plus-extension
- 3.5.3.2
+ 3.5.4
+ provided
+
+
+ org.projectlombok
+ lombok
+ 1.18.28
provided
diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/ITableInfoAdapter.java b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/ITableInfoAdapter.java
index 1614f55..6a8e90d 100644
--- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/ITableInfoAdapter.java
+++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/ITableInfoAdapter.java
@@ -2,10 +2,13 @@ package com.github.yulichang.adapter.base;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import com.github.yulichang.adapter.base.metadata.OrderFieldInfo;
import org.apache.ibatis.session.Configuration;
import java.lang.reflect.Field;
+import java.util.List;
import java.util.function.Supplier;
+import java.util.stream.Collectors;
/**
* @author yulichang
@@ -13,15 +16,32 @@ import java.util.function.Supplier;
*/
public interface ITableInfoAdapter {
- boolean mpjHasLogic(TableInfo tableInfo);
+ default boolean mpjHasLogic(TableInfo tableInfo) {
+ return tableInfo.isWithLogicDelete();
+ }
- boolean mpjIsPrimitive(TableFieldInfo tableFieldInfo);
+ default boolean mpjIsPrimitive(TableFieldInfo tableFieldInfo) {
+ return tableFieldInfo.isPrimitive();
+ }
- TableFieldInfo mpjGetLogicField(TableInfo tableInfo);
+ default TableFieldInfo mpjGetLogicField(TableInfo tableInfo) {
+ return tableInfo.getLogicDeleteFieldInfo();
+ }
- boolean mpjHasPK(TableInfo tableInfo);
+ default boolean mpjHasPK(TableInfo tableInfo) {
+ return tableInfo.havePK();
+ }
- Configuration mpjGetConfiguration(TableInfo tableInfo);
+ default Configuration mpjGetConfiguration(TableInfo tableInfo) {
+ return tableInfo.getConfiguration();
+ }
- Field mpjGetField(TableFieldInfo fieldInfo, Supplier supplier);
+ default Field mpjGetField(TableFieldInfo fieldInfo, Supplier supplier) {
+ return fieldInfo.getField();
+ }
+
+ default List mpjGetOrderField(TableInfo tableInfo) {
+ return tableInfo.getOrderByFields().stream().map(f ->
+ new OrderFieldInfo(f.getColumn(), f.getType(), f.getSort())).collect(Collectors.toList());
+ }
}
diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/metadata/OrderFieldInfo.java b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/metadata/OrderFieldInfo.java
new file mode 100644
index 0000000..a73c045
--- /dev/null
+++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/metadata/OrderFieldInfo.java
@@ -0,0 +1,35 @@
+package com.github.yulichang.adapter.base.metadata;
+
+import lombok.Data;
+
+/**
+ * 兼容MP 3.5.4
+ * copy {@link com.baomidou.mybatisplus.core.metadata.OrderFieldInfo}
+ *
+ * @since 1.4.7
+ */
+@Data
+public class OrderFieldInfo {
+
+ /**
+ * 字段
+ */
+ private String column;
+
+ /**
+ * 排序类型
+ */
+ private String type;
+
+ /**
+ * 排序顺序
+ */
+ private short sort;
+
+
+ public OrderFieldInfo(String column, String type, short orderBySort) {
+ this.column = column;
+ this.type = type;
+ this.sort = orderBySort;
+ }
+}
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/VersionUtils.java b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/tookit/VersionUtils.java
similarity index 96%
rename from mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/VersionUtils.java
rename to mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/tookit/VersionUtils.java
index a692bfd..6a38ff7 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/VersionUtils.java
+++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/tookit/VersionUtils.java
@@ -1,4 +1,4 @@
-package com.github.yulichang.toolkit;
+package com.github.yulichang.adapter.base.tookit;
/**
* 版本工具类
diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/src/main/java/com/github/yulichang/adapter/v33x/TableInfoAdapterV33x.java b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/src/main/java/com/github/yulichang/adapter/v33x/TableInfoAdapterV33x.java
index 73dc984..9aefe80 100644
--- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/src/main/java/com/github/yulichang/adapter/v33x/TableInfoAdapterV33x.java
+++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/src/main/java/com/github/yulichang/adapter/v33x/TableInfoAdapterV33x.java
@@ -1,12 +1,16 @@
package com.github.yulichang.adapter.v33x;
+import com.baomidou.mybatisplus.core.MybatisPlusVersion;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.github.yulichang.adapter.base.ITableInfoAdapter;
+import com.github.yulichang.adapter.base.metadata.OrderFieldInfo;
+import com.github.yulichang.adapter.base.tookit.VersionUtils;
import org.apache.ibatis.session.Configuration;
import java.lang.reflect.Field;
+import java.util.List;
import java.util.Objects;
import java.util.function.Supplier;
@@ -16,6 +20,8 @@ import java.util.function.Supplier;
*/
public class TableInfoAdapterV33x implements ITableInfoAdapter {
+ private static final boolean is330 = VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.3.0") == 0;
+
@Override
public boolean mpjHasLogic(TableInfo tableInfo) {
return tableInfo.isLogicDelete();
@@ -45,6 +51,11 @@ public class TableInfoAdapterV33x implements ITableInfoAdapter {
@Override
public Field mpjGetField(TableFieldInfo fieldInfo, Supplier supplier) {
- return supplier.get();
+ return is330 ? supplier.get() : ITableInfoAdapter.super.mpjGetField(fieldInfo, null);
+ }
+
+ @Override
+ public List mpjGetOrderField(TableInfo tableInfo) {
+ throw new UnsupportedOperationException("不支持排序");
}
}
diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/src/main/java/com/github/yulichang/adapter/v3431/TableInfoAdapter3431.java b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/src/main/java/com/github/yulichang/adapter/v3431/TableInfoAdapter3431.java
new file mode 100644
index 0000000..eaf1081
--- /dev/null
+++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/src/main/java/com/github/yulichang/adapter/v3431/TableInfoAdapter3431.java
@@ -0,0 +1,25 @@
+package com.github.yulichang.adapter.v3431;
+
+import com.baomidou.mybatisplus.core.MybatisPlusVersion;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import com.github.yulichang.adapter.base.ITableInfoAdapter;
+import com.github.yulichang.adapter.base.metadata.OrderFieldInfo;
+import com.github.yulichang.adapter.base.tookit.VersionUtils;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author yulichang
+ * @since 1.4.7
+ */
+public class TableInfoAdapter3431 implements ITableInfoAdapter {
+
+ private static final boolean v = VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3") < 0;
+
+ @Override
+ public List mpjGetOrderField(TableInfo tableInfo) {
+ return v ? null : tableInfo.getOrderByFields().stream().map(f ->
+ new OrderFieldInfo(f.getColumn(), f.getOrderByType(), f.getOrderBySort())).collect(Collectors.toList());
+ }
+}
diff --git a/mybatis-plus-join-boot-starter/pom.xml b/mybatis-plus-join-boot-starter/pom.xml
index 6e177a0..dfd6c0a 100644
--- a/mybatis-plus-join-boot-starter/pom.xml
+++ b/mybatis-plus-join-boot-starter/pom.xml
@@ -58,7 +58,7 @@
com.baomidou
mybatis-plus-boot-starter
- 3.5.3.2
+ 3.5.4
provided
diff --git a/mybatis-plus-join-core/pom.xml b/mybatis-plus-join-core/pom.xml
index 3d59ec3..19c687f 100644
--- a/mybatis-plus-join-core/pom.xml
+++ b/mybatis-plus-join-core/pom.xml
@@ -67,7 +67,7 @@
com.baomidou
mybatis-plus-extension
- 3.5.3.2
+ 3.5.4
provided
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/AdapterHelper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/AdapterHelper.java
index 09ca2a8..3b91ccf 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/AdapterHelper.java
+++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/AdapterHelper.java
@@ -1,9 +1,11 @@
package com.github.yulichang.adapter;
import com.baomidou.mybatisplus.core.MybatisPlusVersion;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
import com.github.yulichang.adapter.base.ITableInfoAdapter;
+import com.github.yulichang.adapter.base.tookit.VersionUtils;
import com.github.yulichang.adapter.v33x.TableInfoAdapterV33x;
+import com.github.yulichang.adapter.v3431.TableInfoAdapter3431;
/**
* @author yulichang
@@ -15,10 +17,14 @@ public class AdapterHelper {
static {
String version = MybatisPlusVersion.getVersion();
- if (StringUtils.isNotBlank(version) && version.startsWith("3.3.")) {
+ if (VersionUtils.compare(version, "3.5.4") >= 0) {
+ adapter = new TableInfoAdapter();
+ } else if (VersionUtils.compare(version, "3.4.0") >= 0) {
+ adapter = new TableInfoAdapter3431();
+ } else if (VersionUtils.compare(version, "3.3.0") >= 0) {
adapter = new TableInfoAdapterV33x();
} else {
- adapter = new TableInfoAdapter();
+ throw ExceptionUtils.mpe("MPJ需要MP版本3.3.0+,当前MP版本%s", version);
}
}
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/TableInfoAdapter.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/TableInfoAdapter.java
index 1b6ae41..145a51c 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/TableInfoAdapter.java
+++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/TableInfoAdapter.java
@@ -1,12 +1,6 @@
package com.github.yulichang.adapter;
-import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
-import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.github.yulichang.adapter.base.ITableInfoAdapter;
-import org.apache.ibatis.session.Configuration;
-
-import java.lang.reflect.Field;
-import java.util.function.Supplier;
/**
* @author yulichang
@@ -14,33 +8,4 @@ import java.util.function.Supplier;
*/
public class TableInfoAdapter implements ITableInfoAdapter {
- @Override
- public boolean mpjHasLogic(TableInfo tableInfo) {
- return tableInfo.isWithLogicDelete();
- }
-
- @Override
- public boolean mpjIsPrimitive(TableFieldInfo tableFieldInfo) {
- return tableFieldInfo.isPrimitive();
- }
-
- @Override
- public TableFieldInfo mpjGetLogicField(TableInfo tableInfo) {
- return tableInfo.getLogicDeleteFieldInfo();
- }
-
- @Override
- public boolean mpjHasPK(TableInfo tableInfo) {
- return tableInfo.havePK();
- }
-
- @Override
- public Configuration mpjGetConfiguration(TableInfo tableInfo) {
- return tableInfo.getConfiguration();
- }
-
- @Override
- public Field mpjGetField(TableFieldInfo fieldInfo, Supplier supplier) {
- return fieldInfo.getField();
- }
}
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java
index 8bd84a2..b51e61c 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java
+++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java
@@ -15,7 +15,7 @@ import com.github.yulichang.adapter.v3431.AbstractMethodV3431;
import com.github.yulichang.method.*;
import com.github.yulichang.toolkit.MPJTableMapperHelper;
import com.github.yulichang.toolkit.TableHelper;
-import com.github.yulichang.toolkit.VersionUtils;
+import com.github.yulichang.adapter.base.tookit.VersionUtils;
import com.github.yulichang.toolkit.reflect.GenericTypeUtils;
import lombok.Getter;
import org.apache.ibatis.builder.MapperBuilderAssistant;
@@ -38,9 +38,9 @@ import static java.util.stream.Collectors.toList;
* @author yulichang
* @see DefaultSqlInjector
*/
+@Getter
public class MPJSqlInjector extends DefaultSqlInjector {
- @Getter
private AbstractSqlInjector sqlInjector;
public MPJSqlInjector() {
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java
index a5d881e..3eec2ec 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java
+++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java
@@ -1,14 +1,14 @@
package com.github.yulichang.interceptor;
+import com.baomidou.mybatisplus.core.MybatisPlusVersion;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
import com.baomidou.mybatisplus.core.toolkit.*;
+import com.github.yulichang.adapter.base.tookit.VersionUtils;
import com.github.yulichang.config.ConfigProperties;
import com.github.yulichang.method.MPJResultType;
import com.github.yulichang.query.MPJQueryWrapper;
-import com.github.yulichang.toolkit.Constant;
-import com.github.yulichang.toolkit.MPJReflectionKit;
-import com.github.yulichang.toolkit.MPJTableMapperHelper;
-import com.github.yulichang.toolkit.TableHelper;
+import com.github.yulichang.toolkit.*;
import com.github.yulichang.toolkit.support.FieldCache;
import com.github.yulichang.wrapper.interfaces.SelectWrapper;
import com.github.yulichang.wrapper.resultmap.IResult;
@@ -41,6 +41,7 @@ import java.util.concurrent.ConcurrentHashMap;
@Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}))
public class MPJInterceptor implements Interceptor {
+ private static final boolean v = VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3.1") > 0;
private static final List EMPTY_RESULT_MAPPING = new ArrayList<>(0);
@@ -286,7 +287,7 @@ public class MPJInterceptor implements Interceptor {
childId.append("]");
}
//双检
- String id = childId.toString();
+ String id = v ? childId.toString() : childId.toString().replaceAll("\\.", "~");
if (!ms.getConfiguration().hasResultMap(id)) {
ResultMap build = new ResultMap.Builder(ms.getConfiguration(), id, mybatisLabel.getOfType(), childMapping).build();
MPJInterceptor.addResultMap(ms, id, build);
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJBaseMethod.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJBaseMethod.java
index 1b4eb67..c3c475e 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJBaseMethod.java
+++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJBaseMethod.java
@@ -1,7 +1,6 @@
package com.github.yulichang.method;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
-import com.baomidou.mybatisplus.core.MybatisPlusVersion;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -10,9 +9,9 @@ import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
import com.github.yulichang.adapter.AdapterHelper;
+import com.github.yulichang.adapter.base.metadata.OrderFieldInfo;
import com.github.yulichang.annotation.DynamicTableName;
import com.github.yulichang.config.ConfigProperties;
-import com.github.yulichang.toolkit.VersionUtils;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
@@ -72,23 +71,19 @@ public interface MPJBaseMethod extends Constants {
*/
default String mpjSqlOrderBy(TableInfo tableInfo) {
/* 不存在排序字段,直接返回空 */
- List orderByFields;
+ List orderByFields;
try {
- if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3") >= 0) {
- orderByFields = tableInfo.getOrderByFields();
- } else {
- return StringPool.EMPTY;
- }
+ orderByFields = AdapterHelper.getTableInfoAdapter().mpjGetOrderField(tableInfo);
} catch (Exception e) {
return StringPool.EMPTY;
}
if (CollectionUtils.isEmpty(orderByFields)) {
return StringPool.EMPTY;
}
- orderByFields.sort(Comparator.comparingInt(TableFieldInfo::getOrderBySort));
+ orderByFields.sort(Comparator.comparingInt(OrderFieldInfo::getSort));
String sql = NEWLINE + " ORDER BY " +
orderByFields.stream().map(tfi -> String.format("${ew.alias}.%s %s", tfi.getColumn(),
- tfi.getOrderByType())).collect(joining(","));
+ tfi.getType())).collect(joining(","));
/* 当wrapper中传递了orderBy属性,@orderBy注解失效 */
return SqlScriptUtils.convertIf(sql, String.format("%s == null or %s", WRAPPER,
WRAPPER_EXPRESSION_ORDER), true);
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java
index b1f9d53..4d12ebe 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java
+++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.github.yulichang.toolkit.support.*;
import org.apache.ibatis.reflection.property.PropertyNamer;
+import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Map;
@@ -50,10 +51,11 @@ public final class LambdaUtils {
// 2. 反射读取
try {
Method method = func.getClass().getDeclaredMethod("writeReplace");
- return new ReflectLambdaMeta((java.lang.invoke.SerializedLambda) ReflectionKit.setAccessible(method).invoke(func));
+ method.setAccessible(true);
+ return new ReflectLambdaMeta((SerializedLambda) method.invoke(func), func.getClass().getClassLoader());
} catch (Throwable e) {
// 3. 反射失败使用序列化的方式读取
- return new ShadowLambdaMeta(SerializedLambda.extract(func));
+ return new ShadowLambdaMeta(com.github.yulichang.toolkit.support.SerializedLambda.extract(func));
}
}
}
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/ReflectionKit.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/ReflectionKit.java
index 96603a2..8cbc3ed 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/ReflectionKit.java
+++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/ReflectionKit.java
@@ -20,10 +20,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
import com.github.yulichang.toolkit.reflect.GenericTypeUtils;
-import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
-import java.security.AccessController;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
@@ -142,11 +140,11 @@ public final class ReflectionKit {
* 中间表实体重写父类属性 ` private transient Date createTime; `
*/
return fieldMap.values().stream()
- /* 过滤静态属性 */
- .filter(f -> !Modifier.isStatic(f.getModifiers()))
- /* 过滤 transient关键字修饰的属性 */
- .filter(f -> !Modifier.isTransient(f.getModifiers()))
- .collect(Collectors.toList());
+ /* 过滤静态属性 */
+ .filter(f -> !Modifier.isStatic(f.getModifiers()))
+ /* 过滤 transient关键字修饰的属性 */
+ .filter(f -> !Modifier.isTransient(f.getModifiers()))
+ .collect(Collectors.toList());
});
}
@@ -161,12 +159,12 @@ public final class ReflectionKit {
public static Map excludeOverrideSuperField(Field[] fields, List superFieldList) {
// 子类属性
Map fieldMap = Stream.of(fields).collect(toMap(Field::getName, identity(),
- (u, v) -> {
- throw new IllegalStateException(String.format("Duplicate key %s", u));
- },
- LinkedHashMap::new));
+ (u, v) -> {
+ throw new IllegalStateException(String.format("Duplicate key %s", u));
+ },
+ LinkedHashMap::new));
superFieldList.stream().filter(field -> !fieldMap.containsKey(field.getName()))
- .forEach(f -> fieldMap.put(f.getName(), f));
+ .forEach(f -> fieldMap.put(f.getName(), f));
return fieldMap;
}
@@ -186,17 +184,6 @@ public final class ReflectionKit {
return (clazz.isPrimitive() && clazz != void.class ? PRIMITIVE_TYPE_TO_WRAPPER_MAP.get(clazz) : clazz);
}
- /**
- * 设置可访问对象的可访问权限为 true
- *
- * @param object 可访问的对象
- * @param 类型
- * @return 返回设置后的对象
- */
- public static T setAccessible(T object) {
- return AccessController.doPrivileged(new SetAccessibleAction<>(object));
- }
-
public static V computeIfAbsent(Map concurrentHashMap, K key, Function super K, ? extends V> mappingFunction) {
V v = concurrentHashMap.get(key);
if (v != null) {
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/IdeaProxyLambdaMeta.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/IdeaProxyLambdaMeta.java
index a4c3482..103d6b0 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/IdeaProxyLambdaMeta.java
+++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/IdeaProxyLambdaMeta.java
@@ -15,11 +15,10 @@
*/
package com.github.yulichang.toolkit.support;
-import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
-import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationHandler;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandleProxies;
+import java.lang.invoke.MethodHandles;
+import java.lang.reflect.Executable;
import java.lang.reflect.Proxy;
/**
@@ -28,35 +27,14 @@ import java.lang.reflect.Proxy;
* Create by hcl at 2021/5/17
*/
public class IdeaProxyLambdaMeta implements LambdaMeta {
- private static final Field FIELD_MEMBER_NAME;
- private static final Field FIELD_MEMBER_NAME_CLAZZ;
- private static final Field FIELD_MEMBER_NAME_NAME;
-
- static {
- try {
- Class> classDirectMethodHandle = Class.forName("java.lang.invoke.DirectMethodHandle");
- FIELD_MEMBER_NAME = ReflectionKit.setAccessible(classDirectMethodHandle.getDeclaredField("member"));
- Class> classMemberName = Class.forName("java.lang.invoke.MemberName");
- FIELD_MEMBER_NAME_CLAZZ = ReflectionKit.setAccessible(classMemberName.getDeclaredField("clazz"));
- FIELD_MEMBER_NAME_NAME = ReflectionKit.setAccessible(classMemberName.getDeclaredField("name"));
- } catch (ClassNotFoundException | NoSuchFieldException e) {
- throw new MybatisPlusException(e);
- }
- }
-
private final Class> clazz;
private final String name;
public IdeaProxyLambdaMeta(Proxy func) {
- InvocationHandler handler = Proxy.getInvocationHandler(func);
- try {
- Object dmh = ReflectionKit.setAccessible(handler.getClass().getDeclaredField("val$target")).get(handler);
- Object member = FIELD_MEMBER_NAME.get(dmh);
- clazz = (Class>) FIELD_MEMBER_NAME_CLAZZ.get(member);
- name = (String) FIELD_MEMBER_NAME_NAME.get(member);
- } catch (IllegalAccessException | NoSuchFieldException e) {
- throw new MybatisPlusException(e);
- }
+ MethodHandle dmh = MethodHandleProxies.wrapperInstanceTarget(func);
+ Executable executable = MethodHandles.reflectAs(Executable.class, dmh);
+ clazz = executable.getDeclaringClass();
+ name = executable.getName();
}
@Override
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ReflectLambdaMeta.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ReflectLambdaMeta.java
index a37c03c..74fbb6c 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ReflectLambdaMeta.java
+++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ReflectLambdaMeta.java
@@ -16,36 +16,22 @@
package com.github.yulichang.toolkit.support;
-import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.github.yulichang.toolkit.ClassUtils;
-import com.github.yulichang.toolkit.ReflectionKit;
import java.lang.invoke.SerializedLambda;
-import java.lang.reflect.Field;
/**
* Created by hcl at 2021/5/14
*/
public class ReflectLambdaMeta implements LambdaMeta {
- private static final Field FIELD_CAPTURING_CLASS;
-
- static {
- Field fieldCapturingClass;
- try {
- Class aClass = SerializedLambda.class;
- fieldCapturingClass = ReflectionKit.setAccessible(aClass.getDeclaredField("capturingClass"));
- } catch (Throwable e) {
- // 解决高版本 jdk 的问题 gitee: https://gitee.com/baomidou/mybatis-plus/issues/I4A7I5
- fieldCapturingClass = null;
- }
- FIELD_CAPTURING_CLASS = fieldCapturingClass;
- }
-
private final SerializedLambda lambda;
- public ReflectLambdaMeta(SerializedLambda lambda) {
+ private final ClassLoader classLoader;
+
+ public ReflectLambdaMeta(SerializedLambda lambda, ClassLoader classLoader) {
this.lambda = lambda;
+ this.classLoader = classLoader;
}
@Override
@@ -57,19 +43,7 @@ public class ReflectLambdaMeta implements LambdaMeta {
public Class> getInstantiatedClass() {
String instantiatedMethodType = lambda.getInstantiatedMethodType();
String instantiatedType = instantiatedMethodType.substring(2, instantiatedMethodType.indexOf(StringPool.SEMICOLON)).replace(StringPool.SLASH, StringPool.DOT);
- return ClassUtils.toClassConfident(instantiatedType, getCapturingClassClassLoader());
- }
-
- private ClassLoader getCapturingClassClassLoader() {
- // 如果反射失败,使用默认的 classloader
- if (FIELD_CAPTURING_CLASS == null) {
- return null;
- }
- try {
- return ((Class>) FIELD_CAPTURING_CLASS.get(lambda)).getClassLoader();
- } catch (IllegalAccessException e) {
- throw new MybatisPlusException(e);
- }
+ return ClassUtils.toClassConfident(instantiatedType, this.classLoader);
}
}
diff --git a/mybatis-plus-join-extension/pom.xml b/mybatis-plus-join-extension/pom.xml
index e60c1ad..1a462ce 100644
--- a/mybatis-plus-join-extension/pom.xml
+++ b/mybatis-plus-join-extension/pom.xml
@@ -51,7 +51,7 @@
com.baomidou
mybatis-plus-extension
- 3.5.3.2
+ 3.5.4
provided
diff --git a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableFieldInfo.java b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableFieldInfo.java
index 53a038a..dd757f2 100644
--- a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableFieldInfo.java
+++ b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableFieldInfo.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.toolkit.*;
+import com.github.yulichang.adapter.AdapterHelper;
import com.github.yulichang.annotation.EntityMapping;
import com.github.yulichang.annotation.FieldMapping;
import com.github.yulichang.toolkit.SpringContentUtils;
@@ -156,7 +157,7 @@ public class MPJTableFieldInfo {
Assert.notNull(info, "未注册的实体类 <%s>", this.joinClass.getSimpleName());
//根据属性名查询
Field field = info.getFieldList().stream().filter(i -> i.getProperty().equals(bindName))
- .findFirst().map(TableFieldInfo::getField).orElse(null);
+ .findFirst().map(f -> getField(this.joinClass, f)).orElse(null);
if (field == null && bindName.equals(info.getKeyProperty())) {
field = ReflectionKit.getFieldList(joinClass).stream().filter(f ->
f.getName().equals(info.getKeyProperty())).findFirst().orElse(null);
@@ -165,7 +166,7 @@ public class MPJTableFieldInfo {
//根据字段查询
field = info.getFieldList().stream()
.filter(i -> i.getColumn().equals(bindName))
- .map(TableFieldInfo::getField).findFirst().orElse(null);
+ .map(f -> getField(this.joinClass, f)).findFirst().orElse(null);
if (field == null && bindName.equals(info.getKeyColumn())) {
field = ReflectionKit.getFieldList(joinClass).stream().filter(f ->
f.getName().equals(info.getKeyProperty())).findFirst().orElse(null);
@@ -175,6 +176,7 @@ public class MPJTableFieldInfo {
}
}
this.bindField = field;
+ this.bindField.setAccessible(true);
}
private void initJoinField(String joinField) {
@@ -188,16 +190,16 @@ public class MPJTableFieldInfo {
TableInfo joinTableInfo = getTableInfo(this.joinClass);
TableFieldInfo joinFieldInfo = joinTableInfo.getFieldList().stream().filter(f ->
- f.getField().getName().equals(this.joinProperty)).findFirst().orElse(null);
+ f.getProperty().equals(this.joinProperty)).findFirst().orElse(null);
if (joinFieldInfo == null) {
- if (joinTableInfo.havePK() && this.joinProperty.equals(joinTableInfo.getKeyProperty())) {
+ if (AdapterHelper.getTableInfoAdapter().mpjHasPK(joinTableInfo) && this.joinProperty.equals(joinTableInfo.getKeyProperty())) {
this.joinColumn = joinTableInfo.getKeyColumn();
this.joinField = ReflectionKit.getFieldList(this.joinClass).stream().filter(i ->
i.getName().equals(joinTableInfo.getKeyProperty())).findFirst().orElse(null);
}
} else {
this.joinColumn = joinFieldInfo.getColumn();
- this.joinField = joinFieldInfo.getField();
+ this.joinField = getField(this.joinClass, joinFieldInfo);
}
Assert.notNull(this.joinField, "注解属性thisField不存在 %s , %s", this.joinClass.getName(),
StringUtils.isBlank(this.joinProperty) ? "主键" : this.joinProperty);
@@ -216,7 +218,7 @@ public class MPJTableFieldInfo {
}
TableInfo tableInfo = getTableInfo(this.entityType);
- if (tableInfo.havePK() && this.thisProperty.equals(tableInfo.getKeyProperty())) {
+ if (AdapterHelper.getTableInfoAdapter().mpjHasPK(tableInfo) && this.thisProperty.equals(tableInfo.getKeyProperty())) {
this.thisField = ReflectionKit.getFieldList(ClassUtils.getUserClass(entityType)).stream().filter(f ->
f.getName().equals(tableInfo.getKeyProperty())).findFirst().orElse(null);
Assert.notNull(this.thisField, "注解属性thisField不存在 %s , %s", entityType.getName(),
@@ -224,10 +226,10 @@ public class MPJTableFieldInfo {
this.thisColumn = tableInfo.getKeyColumn();
} else {
TableFieldInfo fieldInfo = tableInfo.getFieldList().stream().filter(f ->
- f.getField().getName().equals(this.thisProperty)).findFirst().orElse(null);
+ f.getProperty().equals(this.thisProperty)).findFirst().orElse(null);
Assert.notNull(fieldInfo, "注解属性thisField不存在 %s , %s", entityType.getName(),
StringUtils.isBlank(this.thisProperty) ? "主键" : this.thisProperty);
- this.thisField = fieldInfo.getField();
+ this.thisField = getField(this.entityType, fieldInfo);
this.thisColumn = fieldInfo.getColumn();
}
this.thisField.setAccessible(true);
@@ -311,6 +313,11 @@ public class MPJTableFieldInfo {
return tableInfo;
}
+ private Field getField(Class> table, TableFieldInfo tableFieldInfo) {
+ return AdapterHelper.getTableInfoAdapter().mpjGetField(tableFieldInfo, () ->
+ ReflectionKit.getFieldMap(table).get(tableFieldInfo.getProperty()));
+ }
+
public void fieldSet(Object o, Object val) {
try {
this.field.set(o, val);
@@ -368,7 +375,7 @@ public class MPJTableFieldInfo {
} else {
if (data.size() > 1 && fieldInfo.isThrowExp()) {
throw ExceptionUtils.mpe("Expected one result (or null) to be returned by select, but found: " +
- data.size() + " , " + fieldInfo.getField().getName());
+ data.size() + " , " + fieldInfo.getProperty());
} else {
fieldInfo.fieldSet(i, data.stream().findFirst().orElse(null));
}
diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java
index 1989687..e6082c8 100644
--- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java
+++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java
@@ -1,9 +1,11 @@
package com.github.yulichang.test.join;
+import com.baomidou.mybatisplus.core.MybatisPlusVersion;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.adapter.base.tookit.VersionUtils;
import com.github.yulichang.test.join.dto.AddressDTO;
import com.github.yulichang.test.join.dto.UserDTO;
import com.github.yulichang.test.join.entity.*;
@@ -959,13 +961,23 @@ class LambdaWrapperTest {
*/
@Test
void joinOrder() {
- ThreadLocalUtils.set("SELECT id,user_id,name FROM order_t t ORDER BY t.name DESC",
- "SELECT id,user_id,name FROM order_t t ORDER BY t.name desc");
+ if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3") >= 0) {
+ ThreadLocalUtils.set("SELECT id,user_id,name FROM order_t t ORDER BY t.name DESC",
+ "SELECT id,user_id,name FROM order_t t ORDER BY t.name desc");
+ } else {
+ ThreadLocalUtils.set("SELECT id,user_id,name FROM order_t t",
+ "SELECT id,user_id,name FROM order_t t");
+ }
MPJLambdaWrapper wrapper = JoinWrappers.lambda(OrderDO.class);
List list = wrapper.list();
- ThreadLocalUtils.set("SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false ORDER BY t.name DESC",
- "SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false ORDER BY t.name desc");
+ if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3") >= 0) {
+ ThreadLocalUtils.set("SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false ORDER BY t.name DESC",
+ "SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false ORDER BY t.name desc");
+ } else {
+ ThreadLocalUtils.set("SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false",
+ "SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false");
+ }
MPJLambdaWrapper w = JoinWrappers.lambda(OrderDO.class)
.selectAll(OrderDO.class)
.selectAs(UserDO::getName, OrderDO::getUserName)