MybatisPlus如何实现批量插入
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章将为大家详细讲解有关MybatisPlus如何实现批量插入,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、背景再数据同步或者幂等场景下,常常需要设置唯一索
千家信息网最后更新 2026年10月31日MybatisPlus如何实现批量插入
这篇文章将为大家详细讲解有关MybatisPlus如何实现批量插入,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
一、背景
再数据同步或者幂等场景下,常常需要设置唯一索引来避免重复请求,
select and update效率低,且并发时还是会报错,并不友好,那么可以用Mysql的Insert ignore语法来优化。MybatisPlus官方并没有针此处场景进行支持
二、环境
com.baomidou mybatis-plus-boot-starter 3.2.0 com.baomidou mybatis-plus-generator
三、注入自定义批量插入sql
因为只需要改造insertBatchSomeColumn方法,那直接CV就好
insertBatchSomeColumn方法属于mybatis plus官方扩展包中
sql模板
public class InsertIgnoreBatchAllColumn extends AbstractMethod { /** * mapper 对应的方法名 */ private static final String MAPPER_METHOD = "insertIgnoreBatchAllColumn"; /** * 字段筛选条件 */ @Setter @Accessors(chain = true) private Predicate predicate; @SuppressWarnings("Duplicates") @Override public MappedStatement injectMappedStatement(Class> mapperClass, Class> modelClass, TableInfo tableInfo) { KeyGenerator keyGenerator = new NoKeyGenerator(); SqlMethod sqlMethod = SqlMethod.INSERT_ONE; String sqlTemplate = ""; List 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; String valuesScript = SqlScriptUtils.convertForeach(insertSqlProperty, "list", null, ENTITY, COMMA); String keyProperty = null; String keyColumn = null; // 表包含主键处理逻辑,如果不包含主键当普通字段处理 if (StringUtils.isNotEmpty(tableInfo.getKeyProperty())) { if (tableInfo.getIdType() == IdType.AUTO) { /* 自增主键 */ keyGenerator = new Jdbc3KeyGenerator(); keyProperty = tableInfo.getKeyProperty(); keyColumn = tableInfo.getKeyColumn(); } else { if (null != tableInfo.getKeySequence()) { keyGenerator = TableInfoHelper.genKeyGenerator(tableInfo, builderAssistant, sqlMethod.getMethod(), languageDriver); keyProperty = tableInfo.getKeyProperty(); keyColumn = tableInfo.getKeyColumn(); } } } String sql = String.format(sqlTemplate, tableInfo.getTableName(), columnScript, valuesScript); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return this.addInsertMappedStatement(mapperClass, modelClass, MAPPER_METHOD, sqlSource, keyGenerator, keyProperty, keyColumn); }} 注入sql
public class CustomerSqlInjector extends DefaultSqlInjector { @Override public List getMethodList(Class> mapperClass) { List methodList = super.getMethodList(mapperClass); methodList.add(new InsertIgnoreBatchAllColumn()); return methodList; }} 通用mapper
public interface CommonMapperextends BaseMapper { /** * 全量插入,等价于insert,忽略唯一索引冲突的行 * {@link InsertIgnoreBatchAllColumn} * * @param entityList * @return */ int insertIgnoreBatchAllColumn(List entityList);}
通用Service
public class CommonServiceImpl, T> extends ServiceImpl { @Transactional(rollbackFor = Exception.class) public boolean fastSaveIgnoreBatch(List list, int batchSize) { if(CollectionUtils.isEmpty(list)) { return true; } batchSize = batchSize < 1 ? BATCH_SIZE : batchSize; if(list.size() <= batchSize) { return retBool(baseMapper.insertIgnoreBatchAllColumn(list)); } for (int fromIdx = 0 , endIdx = batchSize ; ; fromIdx += batchSize, endIdx += batchSize) { if(endIdx > list.size()) { endIdx = list.size(); } baseMapper.insertIgnoreBatchAllColumn(list.subList(fromIdx, endIdx)); if(endIdx == list.size()) { return true; } } } @Transactional(rollbackFor = Exception.class) public boolean fastSaveIgnoreBatch(List list) { return fastSaveIgnoreBatch(list, BATCH_SIZE); }}
关于"MybatisPlus如何实现批量插入"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
方法
篇文章
场景
字段
官方
更多
处理
不错
实用
普通
内容
效率
数据
文章
条件
模板
环境
知识
等价
索引
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
伟宏互联网科技
互联网品科技
互联网医疗科技
有马互联网科技
奇酷互联网科技
互联网科技小额贷款
狮子座互联网科技培训
互联网前沿科技
顺网科技2021年互联网排名
互联网科技创新服务
互联网和黑科技的看法
速维有品互联网信息科技(苏州)有限公司
科技类公司包括互联网吗
深圳艾果互联网通讯科技
阿里互联网科技企业
互联网科技如何创业
万物互联网智能科技
科技信息时代互联网发展
长沙易易互联网科技有限公司
科技互联网专业务虚会材料
咖啡网
中国互联网科技股
互联网中国科技
盛创互联网科技有限公司
海南购全球互联网科技
济南小医互联网科技有限公司招聘
云鲸互联网络科技有限公司
世界互联网科技成果奖
唯美互联网科技
互联网科技大会大佬