MybatisPlus如何实现批量插入
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章将为大家详细讲解有关MybatisPlus如何实现批量插入,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、背景再数据同步或者幂等场景下,常常需要设置唯一索
千家信息网最后更新 2025年01月23日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 Predicatepredicate; @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 ListgetMethodList(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安全错误
数据库的锁怎样保障安全
网络技术基础教程 pdf
剪辑软件开发需要多少钱
封停服务器
镇江agv小车工控机服务器
网络安全法班会总结
5g服务器优点
济南医疗软件开发
cft网络安全比赛报名
es 按条件删除数据库
软件开发行业研究报告
fargate 无服务器
万朋网络技术有限公司
QT软件开发知乎
江苏服务器电源订购
软件开发树叶科技
龙华网络安全建设怎么选择
网络安全论文900字
uos激活服务器设置
安康软件开发市场价
软件数据库数据处理
中国大学生网络安全测试
怎么登记通勤人员数据库
越南adsl服务器
mysql数据库消息队列
数据库字段创建唯一
软件开发定金发票
网络安全培训机构哪里学
金蝶数据库查凭证
雷达检测管理服务器
学生网络安全知识题库