MybatisPlus如何实现批量插入
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,这篇文章将为大家详细讲解有关MybatisPlus如何实现批量插入,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、背景再数据同步或者幂等场景下,常常需要设置唯一索
千家信息网最后更新 2025年12月01日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安全错误
数据库的锁怎样保障安全
广东欣道互联网科技有限公司
软件开发英文是什么
网络安全监管情况汇报
今日头条数据库错误怎么解决
小妖服务器是哪个系统带的
服务器开启360防护404
阿勒泰linux服务器维保
深信服集成管理服务器
文本的数据库怎么设置密码
对入侵服务器取证如何入手
2020上市的服务器处理器
大师兄软件开发服务
小学网络安全周活动图片
软件开发调试方面的书
竞聘网络技术人员面试题
云天化软件开发面试难吗
阳江app软件开发
北京广月朝晖互联网科技有限公司
数据库建立数学模型
阿里云服务器好使用吗
sql查询符合多对数据库
软件开发女生可以
乳腺癌数据库作为博士学位
网络安全教育课的心得体会
广州科技园 互联网公司
公安部网络安全优秀
什么是校园日网络安全
饥荒独立服务器人死完
华为全家福数据库
ipv6服务器搭建免流