mirror of
https://gitee.com/best_handsome/mybatis-plus-join
synced 2025-07-11 00:02:22 +08:00
update
This commit is contained in:
parent
03fac41eb3
commit
2e712036d9
@ -1,5 +1,6 @@
|
|||||||
package com.github.mybatisplus.interceptor;
|
package com.github.mybatisplus.interceptor;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.MybatisParameterHandler;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.ClassUtils;
|
import com.baomidou.mybatisplus.core.toolkit.ClassUtils;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
||||||
import com.github.mybatisplus.toolkit.Constant;
|
import com.github.mybatisplus.toolkit.Constant;
|
||||||
|
@ -1,205 +0,0 @@
|
|||||||
package com.github.mybatisplus.interceptor;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.IdType;
|
|
||||||
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
|
|
||||||
import com.baomidou.mybatisplus.core.metadata.TableInfo;
|
|
||||||
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
|
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
|
||||||
import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
|
|
||||||
import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
|
|
||||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
|
||||||
import org.apache.ibatis.executor.ErrorContext;
|
|
||||||
import org.apache.ibatis.executor.parameter.ParameterHandler;
|
|
||||||
import org.apache.ibatis.mapping.*;
|
|
||||||
import org.apache.ibatis.reflection.MetaObject;
|
|
||||||
import org.apache.ibatis.session.Configuration;
|
|
||||||
import org.apache.ibatis.type.JdbcType;
|
|
||||||
import org.apache.ibatis.type.TypeException;
|
|
||||||
import org.apache.ibatis.type.TypeHandler;
|
|
||||||
import org.apache.ibatis.type.TypeHandlerRegistry;
|
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* copy {@link com.baomidou.mybatisplus.core.MybatisParameterHandler}
|
|
||||||
* <p>
|
|
||||||
* 兼容3.4以下
|
|
||||||
*/
|
|
||||||
public class MybatisParameterHandler implements ParameterHandler {
|
|
||||||
|
|
||||||
private final TypeHandlerRegistry typeHandlerRegistry;
|
|
||||||
private final MappedStatement mappedStatement;
|
|
||||||
private final Object parameterObject;
|
|
||||||
private final BoundSql boundSql;
|
|
||||||
private final Configuration configuration;
|
|
||||||
private final SqlCommandType sqlCommandType;
|
|
||||||
|
|
||||||
public MybatisParameterHandler(MappedStatement mappedStatement, Object parameter, BoundSql boundSql) {
|
|
||||||
this.typeHandlerRegistry = mappedStatement.getConfiguration().getTypeHandlerRegistry();
|
|
||||||
this.mappedStatement = mappedStatement;
|
|
||||||
this.boundSql = boundSql;
|
|
||||||
this.configuration = mappedStatement.getConfiguration();
|
|
||||||
this.sqlCommandType = mappedStatement.getSqlCommandType();
|
|
||||||
this.parameterObject = processParameter(parameter);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Object processParameter(Object parameter) {
|
|
||||||
/* 只处理插入或更新操作 */
|
|
||||||
if (parameter != null
|
|
||||||
&& (SqlCommandType.INSERT == this.sqlCommandType || SqlCommandType.UPDATE == this.sqlCommandType)) {
|
|
||||||
//检查 parameterObject
|
|
||||||
if (ReflectionKit.isPrimitiveOrWrapper(parameter.getClass())
|
|
||||||
|| parameter.getClass() == String.class) {
|
|
||||||
return parameter;
|
|
||||||
}
|
|
||||||
Collection<Object> parameters = getParameters(parameter);
|
|
||||||
if (null != parameters) {
|
|
||||||
// 感觉这里可以稍微优化一下,理论上都是同一个.
|
|
||||||
parameters.forEach(this::process);
|
|
||||||
} else {
|
|
||||||
process(parameter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return parameter;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getParameterObject() {
|
|
||||||
return this.parameterObject;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void process(Object parameter) {
|
|
||||||
if (parameter != null) {
|
|
||||||
TableInfo tableInfo = null;
|
|
||||||
Object entity = parameter;
|
|
||||||
if (parameter instanceof Map) {
|
|
||||||
Map<?, ?> map = (Map<?, ?>) parameter;
|
|
||||||
if (map.containsKey(Constants.ENTITY)) {
|
|
||||||
Object et = map.get(Constants.ENTITY);
|
|
||||||
if (et != null) {
|
|
||||||
entity = et;
|
|
||||||
tableInfo = TableInfoHelper.getTableInfo(entity.getClass());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
tableInfo = TableInfoHelper.getTableInfo(parameter.getClass());
|
|
||||||
}
|
|
||||||
if (tableInfo != null) {
|
|
||||||
//到这里就应该转换到实体参数对象了,因为填充和ID处理都是争对实体对象处理的,不用传递原参数对象下去.
|
|
||||||
MetaObject metaObject = this.configuration.newMetaObject(entity);
|
|
||||||
if (SqlCommandType.INSERT == this.sqlCommandType) {
|
|
||||||
populateKeys(tableInfo, metaObject, entity);
|
|
||||||
insertFill(metaObject, tableInfo);
|
|
||||||
} else {
|
|
||||||
updateFill(metaObject, tableInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected void populateKeys(TableInfo tableInfo, MetaObject metaObject, Object entity) {
|
|
||||||
final IdType idType = tableInfo.getIdType();
|
|
||||||
final String keyProperty = tableInfo.getKeyProperty();
|
|
||||||
if (StringUtils.isNotBlank(keyProperty) && null != idType && idType.getKey() >= 3) {
|
|
||||||
final IdentifierGenerator identifierGenerator = GlobalConfigUtils.getGlobalConfig(this.configuration).getIdentifierGenerator();
|
|
||||||
Object idValue = metaObject.getValue(keyProperty);
|
|
||||||
if (StringUtils.checkValNull(idValue)) {
|
|
||||||
if (idType.getKey() == IdType.ASSIGN_ID.getKey()) {
|
|
||||||
if (Number.class.isAssignableFrom(tableInfo.getKeyType())) {
|
|
||||||
metaObject.setValue(keyProperty, identifierGenerator.nextId(entity));
|
|
||||||
} else {
|
|
||||||
metaObject.setValue(keyProperty, identifierGenerator.nextId(entity).toString());
|
|
||||||
}
|
|
||||||
} else if (idType.getKey() == IdType.ASSIGN_UUID.getKey()) {
|
|
||||||
metaObject.setValue(keyProperty, identifierGenerator.nextUUID(entity));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected void insertFill(MetaObject metaObject, TableInfo tableInfo) {
|
|
||||||
GlobalConfigUtils.getMetaObjectHandler(this.configuration).ifPresent(metaObjectHandler -> {
|
|
||||||
if (metaObjectHandler.openInsertFill() && tableInfo.isWithInsertFill()) {
|
|
||||||
metaObjectHandler.insertFill(metaObject);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void updateFill(MetaObject metaObject, TableInfo tableInfo) {
|
|
||||||
GlobalConfigUtils.getMetaObjectHandler(this.configuration).ifPresent(metaObjectHandler -> {
|
|
||||||
if (metaObjectHandler.openUpdateFill() && tableInfo.isWithUpdateFill()) {
|
|
||||||
metaObjectHandler.updateFill(metaObject);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 处理正常批量插入逻辑
|
|
||||||
* <p>
|
|
||||||
* org.apache.ibatis.session.defaults.DefaultSqlSession$StrictMap 该类方法
|
|
||||||
* wrapCollection 实现 StrictMap 封装逻辑
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @return 集合参数
|
|
||||||
*/
|
|
||||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
|
||||||
protected Collection<Object> getParameters(Object parameterObject) {
|
|
||||||
Collection<Object> parameters = null;
|
|
||||||
if (parameterObject instanceof Collection) {
|
|
||||||
parameters = (Collection) parameterObject;
|
|
||||||
} else if (parameterObject instanceof Map) {
|
|
||||||
Map parameterMap = (Map) parameterObject;
|
|
||||||
if (parameterMap.containsKey("collection")) {
|
|
||||||
parameters = (Collection) parameterMap.get("collection");
|
|
||||||
} else if (parameterMap.containsKey("list")) {
|
|
||||||
parameters = (List) parameterMap.get("list");
|
|
||||||
} else if (parameterMap.containsKey("array")) {
|
|
||||||
parameters = Arrays.asList((Object[]) parameterMap.get("array"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return parameters;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public void setParameters(PreparedStatement ps) {
|
|
||||||
ErrorContext.instance().activity("setting parameters").object(this.mappedStatement.getParameterMap().getId());
|
|
||||||
List<ParameterMapping> parameterMappings = this.boundSql.getParameterMappings();
|
|
||||||
if (parameterMappings != null) {
|
|
||||||
for (int i = 0; i < parameterMappings.size(); i++) {
|
|
||||||
ParameterMapping parameterMapping = parameterMappings.get(i);
|
|
||||||
if (parameterMapping.getMode() != ParameterMode.OUT) {
|
|
||||||
Object value;
|
|
||||||
String propertyName = parameterMapping.getProperty();
|
|
||||||
if (this.boundSql.hasAdditionalParameter(propertyName)) { // issue #448 ask first for additional params
|
|
||||||
value = this.boundSql.getAdditionalParameter(propertyName);
|
|
||||||
} else if (this.parameterObject == null) {
|
|
||||||
value = null;
|
|
||||||
} else if (this.typeHandlerRegistry.hasTypeHandler(this.parameterObject.getClass())) {
|
|
||||||
value = parameterObject;
|
|
||||||
} else {
|
|
||||||
MetaObject metaObject = this.configuration.newMetaObject(this.parameterObject);
|
|
||||||
value = metaObject.getValue(propertyName);
|
|
||||||
}
|
|
||||||
TypeHandler typeHandler = parameterMapping.getTypeHandler();
|
|
||||||
JdbcType jdbcType = parameterMapping.getJdbcType();
|
|
||||||
if (value == null && jdbcType == null) {
|
|
||||||
jdbcType = this.configuration.getJdbcTypeForNull();
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
typeHandler.setParameter(ps, i + 1, value, jdbcType);
|
|
||||||
} catch (TypeException | SQLException e) {
|
|
||||||
throw new TypeException("Could not set parameters for mapping: " + parameterMapping + ". Cause: " + e, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user