mirror of
https://gitee.com/best_handsome/mybatis-plus-join
synced 2025-07-11 00:02:22 +08:00
This commit is contained in:
parent
22ad7c4232
commit
dd35dce49f
@ -10,7 +10,6 @@ import com.github.yulichang.adapter.AdapterHelper;
|
|||||||
import com.github.yulichang.adapter.base.tookit.VersionUtils;
|
import com.github.yulichang.adapter.base.tookit.VersionUtils;
|
||||||
import com.github.yulichang.config.ConfigProperties;
|
import com.github.yulichang.config.ConfigProperties;
|
||||||
import com.github.yulichang.interfaces.MPJBaseJoin;
|
import com.github.yulichang.interfaces.MPJBaseJoin;
|
||||||
import com.github.yulichang.query.MPJQueryWrapper;
|
|
||||||
import com.github.yulichang.toolkit.*;
|
import com.github.yulichang.toolkit.*;
|
||||||
import com.github.yulichang.toolkit.support.FieldCache;
|
import com.github.yulichang.toolkit.support.FieldCache;
|
||||||
import com.github.yulichang.wrapper.interfaces.SelectWrapper;
|
import com.github.yulichang.wrapper.interfaces.SelectWrapper;
|
||||||
@ -26,7 +25,6 @@ import org.apache.ibatis.mapping.ResultFlag;
|
|||||||
import org.apache.ibatis.mapping.ResultMap;
|
import org.apache.ibatis.mapping.ResultMap;
|
||||||
import org.apache.ibatis.mapping.ResultMapping;
|
import org.apache.ibatis.mapping.ResultMapping;
|
||||||
import org.apache.ibatis.plugin.*;
|
import org.apache.ibatis.plugin.*;
|
||||||
import org.apache.ibatis.session.Configuration;
|
|
||||||
import org.apache.ibatis.session.ResultHandler;
|
import org.apache.ibatis.session.ResultHandler;
|
||||||
import org.apache.ibatis.session.RowBounds;
|
import org.apache.ibatis.session.RowBounds;
|
||||||
|
|
||||||
@ -36,9 +34,8 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 连表拦截器
|
* 连表拦截器
|
||||||
|
* <p>
|
||||||
* 用于实现动态resultType
|
* 用于实现动态resultType
|
||||||
* 之前的实现方式是mybatis-plus的Interceptor,无法修改args,存在并发问题
|
|
||||||
* 所以将这个拦截器独立出来
|
|
||||||
*
|
*
|
||||||
* @author yulichang
|
* @author yulichang
|
||||||
*/
|
*/
|
||||||
@ -50,24 +47,18 @@ public class MPJInterceptor implements Interceptor {
|
|||||||
|
|
||||||
private static final List<ResultMapping> EMPTY_RESULT_MAPPING = new ArrayList<>(0);
|
private static final List<ResultMapping> EMPTY_RESULT_MAPPING = new ArrayList<>(0);
|
||||||
|
|
||||||
/**
|
|
||||||
* 缓存MappedStatement,不需要每次都去构建MappedStatement
|
|
||||||
*/
|
|
||||||
private static final Map<String, Map<Configuration, MappedStatement>> MS_CACHE = new ConcurrentHashMap<>();
|
|
||||||
|
|
||||||
private static final Map<String, Val> MS_MAPPER_CACHE = new ConcurrentHashMap<>();
|
private static final Map<String, Val> MS_MAPPER_CACHE = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
private static final Map<String, Val> RES_MAPPER_CACHE = new ConcurrentHashMap<>();
|
private static final Map<String, Val> RES_MAPPER_CACHE = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("Java8MapApi")
|
|
||||||
public Object intercept(Invocation invocation) throws Throwable {
|
public Object intercept(Invocation invocation) throws Throwable {
|
||||||
Object[] args = invocation.getArgs();
|
Object[] args = invocation.getArgs();
|
||||||
if (args[0] instanceof MappedStatement) {
|
if (args[0] instanceof MappedStatement) {
|
||||||
MappedStatement ms = (MappedStatement) args[0];
|
MappedStatement ms = (MappedStatement) args[0];
|
||||||
if (args[1] instanceof Map) {
|
if (args[1] instanceof Map) {
|
||||||
Map<String, Object> map = (Map<String, Object>) args[1];
|
Map<String, Object> map = (Map<String, Object>) args[1];
|
||||||
Object ew = map.containsKey(Constants.WRAPPER) ? map.get(Constants.WRAPPER) : null;
|
Object ew = map.getOrDefault(Constants.WRAPPER, null);
|
||||||
if (Objects.nonNull(ew) && ew instanceof MPJBaseJoin) {
|
if (Objects.nonNull(ew) && ew instanceof MPJBaseJoin) {
|
||||||
if (CollectionUtils.isNotEmpty(map)) {
|
if (CollectionUtils.isNotEmpty(map)) {
|
||||||
Class<?> rt = null;
|
Class<?> rt = null;
|
||||||
@ -97,56 +88,25 @@ public class MPJInterceptor implements Interceptor {
|
|||||||
/**
|
/**
|
||||||
* 获取MappedStatement
|
* 获取MappedStatement
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("rawtypes")
|
public <E> MappedStatement getMappedStatement(MappedStatement ms, Class<?> resultType, Object ew) {
|
||||||
public MappedStatement getMappedStatement(MappedStatement ms, Class<?> resultType, Object ew) {
|
|
||||||
String id = ms.getId() + StringPool.DASH + (resultType.getName().replaceAll("\\.", StringPool.DASH));
|
|
||||||
if (ew instanceof SelectWrapper) {
|
if (ew instanceof SelectWrapper) {
|
||||||
SelectWrapper wrapper = (SelectWrapper) ew;
|
SelectWrapper<E, ?> wrapper = (SelectWrapper<E, ?>) ew;
|
||||||
if (wrapper.getEntityClass() == null) {
|
if (wrapper.getEntityClass() == null) {
|
||||||
wrapper.setEntityClass(MPJTableMapperHelper.getEntity(getMapper(ms.getId(), ms.getResource())));
|
wrapper.setEntityClass((Class<E>) MPJTableMapperHelper.getEntity(getMapper(ms.getId(), ms.getResource())));
|
||||||
}
|
}
|
||||||
if (wrapper.getSelectColumns().isEmpty() && wrapper.getEntityClass() != null) {
|
if (wrapper.getSelectColumns().isEmpty() && wrapper.getEntityClass() != null) {
|
||||||
wrapper.selectAll(wrapper.getEntityClass());
|
wrapper.selectAll(wrapper.getEntityClass());
|
||||||
}
|
}
|
||||||
//TODO 重构缓存 -> 根据sql缓存
|
|
||||||
//不走缓存
|
|
||||||
}
|
}
|
||||||
if (ew instanceof MPJQueryWrapper) {
|
return buildMappedStatement(ms, resultType, ew);
|
||||||
MPJQueryWrapper wrapper = (MPJQueryWrapper) ew;
|
|
||||||
if (ConfigProperties.msCache) {
|
|
||||||
return getCache(ms, id + StringPool.UNDERSCORE + removeDot(wrapper.getSqlSelect()), resultType, ew);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return buildMappedStatement(ms, resultType, ew, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 走缓存
|
|
||||||
*/
|
|
||||||
private MappedStatement getCache(MappedStatement ms, String id, Class<?> resultType, Object ew) {
|
|
||||||
Map<Configuration, MappedStatement> statementMap = MS_CACHE.get(id);
|
|
||||||
if (CollectionUtils.isNotEmpty(statementMap)) {
|
|
||||||
MappedStatement statement = statementMap.get(ms.getConfiguration());
|
|
||||||
if (Objects.nonNull(statement)) {
|
|
||||||
return statement;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MappedStatement mappedStatement = buildMappedStatement(ms, resultType, ew, id);
|
|
||||||
if (statementMap == null) {
|
|
||||||
statementMap = new ConcurrentHashMap<>();
|
|
||||||
MS_CACHE.put(id, statementMap);
|
|
||||||
}
|
|
||||||
statementMap.put(ms.getConfiguration(), mappedStatement);
|
|
||||||
return mappedStatement;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构建新的MappedStatement
|
* 构建新的MappedStatement
|
||||||
*/
|
*/
|
||||||
private MappedStatement buildMappedStatement(MappedStatement ms, Class<?> resultType, Object ew, String id) {
|
private MappedStatement buildMappedStatement(MappedStatement ms, Class<?> resultType, Object ew) {
|
||||||
MappedStatement.Builder builder = new MappedStatement.Builder(ms.getConfiguration(), id, ms.getSqlSource(), ms.getSqlCommandType())
|
MappedStatement.Builder builder = new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), ms.getSqlSource(), ms.getSqlCommandType())
|
||||||
.resource(ms.getResource())
|
.resource(ms.getResource())
|
||||||
.fetchSize(ms.getFetchSize())
|
.fetchSize(ms.getFetchSize())
|
||||||
.statementType(ms.getStatementType())
|
.statementType(ms.getStatementType())
|
||||||
@ -168,7 +128,6 @@ public class MPJInterceptor implements Interceptor {
|
|||||||
/**
|
/**
|
||||||
* 构建resultMap TODO 可以用lambda简化代码
|
* 构建resultMap TODO 可以用lambda简化代码
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
|
||||||
private List<ResultMap> buildResultMap(MappedStatement ms, Class<?> resultType, Object obj) {
|
private List<ResultMap> buildResultMap(MappedStatement ms, Class<?> resultType, Object obj) {
|
||||||
List<ResultMap> result = new ArrayList<>();
|
List<ResultMap> result = new ArrayList<>();
|
||||||
TableInfo tableInfo = TableHelper.get(resultType);
|
TableInfo tableInfo = TableHelper.get(resultType);
|
||||||
@ -182,7 +141,7 @@ public class MPJInterceptor implements Interceptor {
|
|||||||
result.add(getDefaultResultMap(tableInfo, ms, resultType, id));
|
result.add(getDefaultResultMap(tableInfo, ms, resultType, id));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
SelectWrapper wrapper = (SelectWrapper) obj;
|
SelectWrapper<?, ?> wrapper = (SelectWrapper<?, ?>) obj;
|
||||||
Map<String, FieldCache> fieldMap = MPJReflectionKit.getFieldMap(resultType);
|
Map<String, FieldCache> fieldMap = MPJReflectionKit.getFieldMap(resultType);
|
||||||
List<Select> columnList = wrapper.getSelectColumns();
|
List<Select> columnList = wrapper.getSelectColumns();
|
||||||
//移除对多查询列,为了可重复使用wrapper
|
//移除对多查询列,为了可重复使用wrapper
|
||||||
@ -423,14 +382,6 @@ public class MPJInterceptor implements Interceptor {
|
|||||||
return clazz;
|
return clazz;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String removeDot(String str) {
|
|
||||||
if (StringUtils.isBlank(str)) {
|
|
||||||
return str;
|
|
||||||
} else {
|
|
||||||
return str.replaceAll("\\.", StringPool.DASH);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object plugin(Object target) {
|
public Object plugin(Object target) {
|
||||||
try {
|
try {
|
||||||
|
@ -15,8 +15,8 @@ mybatis-plus:
|
|||||||
logic-delete-value: true
|
logic-delete-value: true
|
||||||
logic-not-delete-value: false
|
logic-not-delete-value: false
|
||||||
banner: true
|
banner: true
|
||||||
configuration:
|
# configuration:
|
||||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||||
|
|
||||||
mybatis-plus-join:
|
mybatis-plus-join:
|
||||||
# 打印 mybatis plus join banner
|
# 打印 mybatis plus join banner
|
||||||
@ -25,6 +25,11 @@ mybatis-plus-join:
|
|||||||
ms-cache: true
|
ms-cache: true
|
||||||
logic-del-type: where
|
logic-del-type: where
|
||||||
|
|
||||||
|
|
||||||
|
logging:
|
||||||
|
level:
|
||||||
|
com.github.yulichang: debug
|
||||||
|
|
||||||
---
|
---
|
||||||
spring:
|
spring:
|
||||||
profiles: h2
|
profiles: h2
|
||||||
|
Loading…
x
Reference in New Issue
Block a user