背景
项目中有个设计不合理的表,总共 8 个字段,有 5 个索引,有几个索引字段还是 32 位的字符串。该表数据量已达 1 亿,最近每天新增 100 万。根据日志看,有次用户上传一个有 200 行记录的 excel,需要往这个表插入 3940 条记录,耗时 72 秒。这么大延迟是没法接受的。
要分析数据库方面的问题,首先是找 DBA 分析下表的情况,说跟以往没多大区别,只是跟这个表有关的插入的执行计划很多。因为这个表的批量插入是这样的:
<select id="batchSave" parameterType="java.util.List">
INSERT INTO TABLE_NAME(ID,NAME)
<foreach collection="list"item="itm" separator="union all">
(SELECT #{itm.id}, #{itm.name} FROM DUAL)
</foreach></select>
这是用 MyBatis 对 Oracle 做批量插入的唯一方法。副作用是:假定 List
的最大长度是 N
,那么 Oracle 服务器端就可能有 N
个插入的执行计划。这么多执行计划,DBA 也不乐意去分析呀,而且生成的每个执行计划确实都是很简单的。
优化
如果放弃 union all
的方式,则每条记录都需要各提交一次到数据库,显然也不好。
为了解决 N
个执行计划的问题,做到真正的批量插入,只能修改 MyBatis 的执行逻辑,因此就有了这个项目:mybatis-batchinsert-plugin
目前可以批量插入,但不支持返回主键等其他的功能,有空再完善。
相关推荐
总的来说,"mybatis-generator代码生成插件(中文注释,生成批量插入及修改)"是一款强大的开发辅助工具,它通过自动化代码生成,降低了开发难度,提高了代码质量,尤其是在处理复杂数据关系和大量数据操作时,其...
本文将深入探讨如何在 Mybatis Plus 中自定义批量插入和批量更新,并根据唯一索引来确保数据的唯一性。 首先,了解 Mybatis Plus 的批量操作基础。Mybatis Plus 提供了 `batchInsert()` 和 `batchUpdate()` 方法来...
它包括自动填充、条件构造器、主键自动生成、批量插入、关联查询等功能,使得在处理数据库操作时更加高效。 2. **MybatisX-idea插件的功能**: - **一键跳转**:该插件允许用户在DAO接口方法与对应的XML映射文件...
根据压缩包子文件的文件名称"mybatis_plus",我们可以推测这可能是指Mybatis Plus,这是一个Mybatis的扩展插件,它在Mybatis的基础上提供了一些额外的功能,如一键生成 CRUD 操作、支持主键自增、支持批量插入、支持...
本篇文章将详细介绍如何在 MyBatis-Plus 中实现批量插入。 ### 1. MyBatis-Plus 简介 MyBatis-Plus 是 MyBatis 的轻量级框架,它在 MyBatis 的基础上做了增强,但不改变其基本结构。MyBatis-Plus 提供了包括单表 ...
5. **批量操作**:支持多条SQL语句一次性执行,提高数据库操作的效率,如批量插入、更新等。 6. **填充实体对象**:在查询结果与实体类映射过程中,MyBatis Plus可以自动将查询结果填充到对应的实体对象中,减少了...
应该说使用Mybatis就一定离不开代码生成插件,而此插件本身还提供了插件扩展功能用于增强插件本身,官方已经提供了一些扩展,本项目的目的也是通过该插件机制来强化Mybatis Generator本质,方便和减少我们平时的代码...
7. **ExecutorType**:MyBatis提供了三种执行器类型:SIMPLE(默认,每个语句都会开启新的事物并执行)、REUSE(复用已经存在的SqlSession,减少创建和关闭SqlSession的开销)、BATCH(批量操作,适用于大量插入、...
本篇文章重点讨论如何在Oracle数据库环境下,利用MyBatis进行批量插入、更新和删除操作,这有助于提高数据库操作的效率,减少资源消耗。 批量操作在处理大量数据时尤其重要,因为单条记录的事务提交会消耗更多的...
本项目提供的"mybatis自动sql生成插件源码"则进一步提升了开发效率,通过拦截器(Interceptor)在运行时自动生成SQL语句,适用于具有主键或唯一索引的单表操作。 首先,`AutoMapperInterceptor.java`是这个插件的...
7. **批量操作**:支持批量插入、更新、删除,避免了多次数据库交互带来的性能损耗。 8. **通用Mapper和Service**:MyBatis Plus提供了通用的Mapper和Service,只需简单配置即可实现基本的CRUD操作。 回到这个IDEA...
对于数据加密的需求,MyBatis提供了一种称为“插件”的机制,可以拦截SQL执行过程并在其中插入加密或解密的逻辑。MyBatis的插件系统允许开发者创建自定义插件,这些插件可以在执行SQL之前或之后进行干预。 在...
4. **批量插入**:支持单表数据的批量插入,提高数据导入效率。 5. **查询Wrapper**:提供了QueryWrapper、UpdateWrapper等工具类,使得条件构造更加方便。 6. **数据权限控制**:内置了数据权限控制功能,可以轻松...
3. 批量操作:支持单表的批量插入、更新等操作。 4. 动态SQL:通过注解或条件对象实现动态SQL,使得SQL更简洁,代码更易维护。 **三、集成步骤** 1. **引入依赖**:首先,在项目的pom.xml文件中添加PageHelper和...
Mybatis自定义插件生成...通过拦截器拦截Mybatis的insert语句,通过自定义注解获取到主键,并为该主键赋值雪花ID,插入数据库中。 2、技术架构 项目总体技术选型 SpringBoot2.1.7 + Mybatis + Maven3.5.4 + Mysql + lom
3. **增强型Mapper接口**:在原有Mybatis的基础上,MybatisX添加了一些便捷的方法,如分页查询、批量插入、批量更新等,使Mapper接口功能更加强大。 4. **数据权限控制**:MybatisX支持基于角色的数据权限控制,...
4. **批量插入与更新**:支持单个对象和List对象的批量插入和更新操作,提高数据库操作效率。 5. **分页插件**:内置了物理分页插件,兼容多种数据库,如MySQL、Oracle等,无需手动编写分页代码。 6. **数据权限...
支持批量插入和更新操作,如 `insertBatch()` 和 `updateBatch()` 方法,这对于处理大量数据时能显著提高效率。 5. **分页查询**: 内置了分页插件,可以方便地实现分页查询,支持多种数据库的分页方式,如 MySQL...
"mybatis-generator-plus"是MBG的一个增强版,它在原版的基础上增加了一些实用功能,如批量插入和分页查询。 批量插入是开发中常见的需求,特别是在数据处理量较大的场景下。mybatis-generator-plus通过自动生成...