Merge pull request #63 from lingting/master
🐛 修复insertBatchSomeColumn无法插入除list以外的其他 Collection 类型数据
This commit is contained in:
@@ -5,6 +5,7 @@ import com.hccake.ballcat.common.core.exception.BusinessException;
|
||||
import com.hccake.ballcat.common.core.exception.handler.GlobalExceptionHandler;
|
||||
import com.hccake.ballcat.common.core.result.R;
|
||||
import com.hccake.ballcat.common.core.result.SystemResultCode;
|
||||
import javax.validation.ValidationException;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
@@ -21,8 +22,6 @@ import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
|
||||
|
||||
import javax.validation.ValidationException;
|
||||
|
||||
/**
|
||||
* 全局异常处理
|
||||
*
|
||||
@@ -40,6 +39,8 @@ public class GlobalExceptionHandlerResolver {
|
||||
|
||||
public final static String PROD_ERR_MSG = "系统异常,请联系管理员";
|
||||
|
||||
public final static String NLP_MSG = "空指针异常!";
|
||||
|
||||
/**
|
||||
* 全局异常捕获
|
||||
* @param e the e
|
||||
@@ -51,7 +52,8 @@ public class GlobalExceptionHandlerResolver {
|
||||
log.error("全局异常信息 ex={}", e.getMessage(), e);
|
||||
globalExceptionHandler.handle(e);
|
||||
// 当为生产环境, 不适合把具体的异常信息展示给用户, 比如数据库异常信息.
|
||||
String errorMsg = GlobalConstants.ENV_PROD.equals(profile) ? PROD_ERR_MSG : e.getLocalizedMessage();
|
||||
String errorMsg = GlobalConstants.ENV_PROD.equals(profile) ? PROD_ERR_MSG
|
||||
: (e instanceof NullPointerException ? NLP_MSG : e.getLocalizedMessage());
|
||||
return R.failed(SystemResultCode.SERVER_ERROR, errorMsg);
|
||||
}
|
||||
|
||||
|
||||
@@ -4,18 +4,17 @@ import com.baomidou.mybatisplus.annotation.DbType;
|
||||
import com.baomidou.mybatisplus.annotation.FieldFill;
|
||||
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
|
||||
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
|
||||
import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
|
||||
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
||||
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
||||
import com.hccake.extend.mybatis.plus.injector.CustomSqlInjector;
|
||||
import com.hccake.extend.mybatis.plus.methods.InsertBatchSomeColumnByCollection;
|
||||
import com.hccake.extend.mybatis.plus.methods.SelectByPage;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author hccake
|
||||
* @date 2020/04/19 默认配置MybatisPlus分页插件,通过conditional注解达到覆盖效用
|
||||
@@ -55,7 +54,7 @@ public class MybatisPlusConfig {
|
||||
public ISqlInjector customSqlInjector() {
|
||||
List<AbstractMethod> list = new ArrayList<>();
|
||||
// 对于只在更新时进行填充的字段不做插入处理
|
||||
list.add(new InsertBatchSomeColumn(t -> t.getFieldFill() != FieldFill.UPDATE));
|
||||
list.add(new InsertBatchSomeColumnByCollection(t -> t.getFieldFill() != FieldFill.UPDATE));
|
||||
// 分页查询 返回 VO 对象
|
||||
list.add(new SelectByPage());
|
||||
return new CustomSqlInjector(list);
|
||||
|
||||
@@ -239,6 +239,11 @@
|
||||
<artifactId>ballcat-extend-pay-ali</artifactId>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.hccake</groupId>
|
||||
<artifactId>ballcat-extend-pay-wx</artifactId>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
|
||||
<!--swagger注解-->
|
||||
<dependency>
|
||||
|
||||
@@ -1,20 +1,19 @@
|
||||
package com.hccake.extend.kafka;
|
||||
|
||||
import static com.hccake.extend.kafka.KafkaConstants.BOOTSTRAP_SERVERS_DELIMITER;
|
||||
|
||||
import cn.hutool.core.collection.ListUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import lombok.Getter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.kafka.clients.consumer.ConsumerConfig;
|
||||
import org.apache.kafka.clients.consumer.KafkaConsumer;
|
||||
import org.apache.kafka.common.serialization.Deserializer;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
|
||||
import static com.hccake.extend.kafka.KafkaConstants.BOOTSTRAP_SERVERS_DELIMITER;
|
||||
import lombok.Getter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.kafka.clients.consumer.ConsumerConfig;
|
||||
import org.apache.kafka.clients.consumer.KafkaConsumer;
|
||||
import org.apache.kafka.common.serialization.Deserializer;
|
||||
|
||||
/**
|
||||
* 消费者 具体的配置请参考 {@link ConsumerConfig} 这里只提供一些常用配置
|
||||
@@ -121,9 +120,11 @@ public class KafkaConsumerBuilder {
|
||||
}
|
||||
|
||||
public Properties getProperties() {
|
||||
bootstrapServers
|
||||
.addAll(ListUtil.toList(properties.getProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, StrUtil.EMPTY)
|
||||
.split(BOOTSTRAP_SERVERS_DELIMITER)));
|
||||
String nowServes = properties.getProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, StrUtil.EMPTY);
|
||||
if (StrUtil.isNotBlank(nowServes)) {
|
||||
// 仅在存在配置时才插入
|
||||
bootstrapServers.addAll(ListUtil.toList(nowServes.split(BOOTSTRAP_SERVERS_DELIMITER)));
|
||||
}
|
||||
properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
|
||||
String.join(BOOTSTRAP_SERVERS_DELIMITER, bootstrapServers));
|
||||
return properties;
|
||||
|
||||
@@ -34,7 +34,7 @@ public interface ExtendMapper<T> extends BaseMapper<T> {
|
||||
* @return int 改动行
|
||||
* @author lingting 2020-08-26 22:11
|
||||
*/
|
||||
int insertBatchSomeColumn(@Param("list") Collection<T> list);
|
||||
int insertBatchSomeColumn(@Param("collection") Collection<T> list);
|
||||
|
||||
/**
|
||||
* 根据 entity 条件,查询全部记录(并翻页)
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
package com.hccake.extend.mybatis.plus.methods;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.core.enums.SqlMethod;
|
||||
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
|
||||
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
|
||||
import com.baomidou.mybatisplus.core.metadata.TableInfo;
|
||||
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
|
||||
import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
|
||||
import java.util.List;
|
||||
import java.util.function.Predicate;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.experimental.Accessors;
|
||||
import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator;
|
||||
import org.apache.ibatis.executor.keygen.KeyGenerator;
|
||||
import org.apache.ibatis.executor.keygen.NoKeyGenerator;
|
||||
import org.apache.ibatis.mapping.MappedStatement;
|
||||
import org.apache.ibatis.mapping.SqlSource;
|
||||
|
||||
/**
|
||||
* 从 {@link InsertBatchSomeColumn} 复制
|
||||
*
|
||||
* @author lingting 2021/2/23 15:32
|
||||
*/
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class InsertBatchSomeColumnByCollection extends AbstractMethod {
|
||||
|
||||
/**
|
||||
* 字段筛选条件
|
||||
*/
|
||||
@Setter
|
||||
@Accessors(chain = true)
|
||||
private Predicate<TableFieldInfo> predicate;
|
||||
|
||||
@Override
|
||||
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
|
||||
KeyGenerator keyGenerator = new NoKeyGenerator();
|
||||
SqlMethod sqlMethod = SqlMethod.INSERT_ONE;
|
||||
List<TableFieldInfo> fieldList = tableInfo.getFieldList();
|
||||
String insertSqlColumn = tableInfo.getKeyInsertSqlColumn(false)
|
||||
+ this.filterTableFieldInfo(fieldList, predicate, TableFieldInfo::getInsertSqlColumn, EMPTY);
|
||||
String columnScript = LEFT_BRACKET + insertSqlColumn.substring(0, insertSqlColumn.length() - 1) + RIGHT_BRACKET;
|
||||
String insertSqlProperty = tableInfo.getKeyInsertSqlProperty(ENTITY_DOT, false)
|
||||
+ this.filterTableFieldInfo(fieldList, predicate, i -> i.getInsertSqlProperty(ENTITY_DOT), EMPTY);
|
||||
insertSqlProperty = LEFT_BRACKET + insertSqlProperty.substring(0, insertSqlProperty.length() - 1)
|
||||
+ RIGHT_BRACKET;
|
||||
// 从 list 改为 collection. 允许传入除 list外的参数类型
|
||||
String valuesScript = SqlScriptUtils.convertForeach(insertSqlProperty, "collection", null, ENTITY, COMMA);
|
||||
String keyProperty = null;
|
||||
String keyColumn = null;
|
||||
// 表包含主键处理逻辑,如果不包含主键当普通字段处理
|
||||
if (tableInfo.havePK()) {
|
||||
if (tableInfo.getIdType() == IdType.AUTO) {
|
||||
/* 自增主键 */
|
||||
keyGenerator = new Jdbc3KeyGenerator();
|
||||
keyProperty = tableInfo.getKeyProperty();
|
||||
keyColumn = tableInfo.getKeyColumn();
|
||||
}
|
||||
else {
|
||||
if (null != tableInfo.getKeySequence()) {
|
||||
keyGenerator = TableInfoHelper.genKeyGenerator(getMethod(sqlMethod), tableInfo, builderAssistant);
|
||||
keyProperty = tableInfo.getKeyProperty();
|
||||
keyColumn = tableInfo.getKeyColumn();
|
||||
}
|
||||
}
|
||||
}
|
||||
String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), columnScript, valuesScript);
|
||||
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
|
||||
return this.addInsertMappedStatement(mapperClass, modelClass, getMethod(sqlMethod), sqlSource, keyGenerator,
|
||||
keyProperty, keyColumn);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMethod(SqlMethod sqlMethod) {
|
||||
// 自定义 mapper 方法名
|
||||
return "insertBatchSomeColumn";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -16,11 +16,8 @@ import com.hccake.starte.pay.ali.domain.AliPayQuery;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.Map;
|
||||
|
||||
import static com.hccake.starte.pay.ali.constants.AliPayConstant.HUNDRED;
|
||||
|
||||
/**
|
||||
* api文档: https://opendocs.alipay.com/apis.
|
||||
*
|
||||
@@ -31,17 +28,17 @@ import static com.hccake.starte.pay.ali.constants.AliPayConstant.HUNDRED;
|
||||
@Data
|
||||
public class AliPay {
|
||||
|
||||
private String serverUrl;
|
||||
private final String serverUrl;
|
||||
|
||||
private String appId;
|
||||
private final String appId;
|
||||
|
||||
private String privateKey;
|
||||
private final String privateKey;
|
||||
|
||||
private String format;
|
||||
private final String format;
|
||||
|
||||
private String charset;
|
||||
private final String charset;
|
||||
|
||||
private String alipayPublicKey;
|
||||
private final String alipayPublicKey;
|
||||
|
||||
private String signType;
|
||||
|
||||
@@ -375,14 +372,4 @@ public class AliPay {
|
||||
return AlipaySignature.rsaCheckV2(map, alipayPublicKey, charset, signType);
|
||||
}
|
||||
|
||||
/**
|
||||
* 金额单位转换, 元 转为 分
|
||||
* @param amount 支付金额, 单位 元
|
||||
* @return java.lang.String
|
||||
* @author lingting 2021-01-25 10:27
|
||||
*/
|
||||
public String yuanToFen(BigDecimal amount) {
|
||||
return amount.multiply(HUNDRED).setScale(2, RoundingMode.UP).toPlainString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -7,11 +7,6 @@ import java.math.BigDecimal;
|
||||
*/
|
||||
public class AliPayConstant {
|
||||
|
||||
/**
|
||||
* 一百
|
||||
*/
|
||||
public static final BigDecimal HUNDRED = new BigDecimal("100");
|
||||
|
||||
/**
|
||||
* 支付宝支付线上api路径
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user