MyBatis 3 批量插入多条数据

本文介绍如何使用SQL的动态SQL语句优化批量数据插入操作,通过使用Oracle和PostgreSQL的动态SQL模板,避免了传统的循环调用,提高了性能效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际的开发,当我们需要插入多条数据时,大家很多是通过在程序中循环调用添加接口。
这种方式完全可以实现,只是在性能上有很大的损失;

可以通过下面这种方式:
   针对PostgreSQL 9.0数据库
<insert id="addNormalPlan" parameterType="list" > 
<selectKey keyProperty="id" resultType="int" order="BEFORE"> 
            select max(id)+1 from TBL_NORMAL_PLAN 
</selectKey> 
<![CDATA[ INSERT INTO TBL_NORMAL_PLAN( id, plan_type, 
week_type, start_time,end_time) VALUES ]]> 
    <foreach collection="list" item="item" index="index"  
        separator=",">  
        <![CDATA[ (#{id}, #{item.planType}, #{item.weekType},  
        #{item.startTime}, #{item.endTime} ) ]]> 
    </foreach> 
</insert> 

list:是个对象集合,id:这里不是主键,取的最大值,可以换成主键。
这个foreach其实就是组织成insert into values(多行的值)
 
 
    针对oracle的批量添加:
<insert id="addHomeworkListInfo" parameterType="list">
        INSERT INTO homework_list
        (homework_list_id,
        homework_id,
        count,
        type,
        content) SELECT SEQ_HOMEWORK_LIST_ID.NEXTVAL, A.* FROM(
        <foreach collection="homeworkListInfo" item="item" index="index"
            separator="union all">
            SELECT
            #{item.homeworkId},
            #{item.count},
            #{item.type},
            #{item.content}
            FROM dual
        </foreach>
        ) A
    </insert>

### MyBatis 批量插入大量数据的最佳实践 对于批量插入操作,MyBatis 提供了几种方法来优化性能并确保高效的数据处理。当涉及到大批量记录(如1000条记录)的插入时,采用合适的技术手段至关重要。 #### 使用 `foreach` 标签实现批处理 通过使用 `<foreach>` 标签可以简化 SQL 语句中的集合遍历逻辑,并支持多行插入语法。这不仅提高了代码可读性,还减少了数据库连接次数从而提升效率[^1]: ```xml <insert id="batchInsert"> INSERT INTO table_name (column1, column2, ...) VALUES <foreach collection="list" item="item" separator=","> (#{item.column1}, #{item.column2}, ... ) </foreach> </insert> ``` #### 启用 JDBC 批次更新功能 为了进一步提高性能,在配置文件中启用JDBC批次更新模式是非常有效的策略之一。具体来说就是设置 `defaultStatementTimeout` 和 `useBatch` 参数为 true 并调整合适的 batch size 来控制每次提交的数量: ```properties mybatis.configuration.default-statement-timeout=30 mybatis.executor.type=BATCH ``` #### 控制事务范围 合理规划事务边界同样重要。如果在一个大循环内执行多次单个插入,则可能导致长时间占用资源甚至死锁现象;相反地,将整个批量操作封装成单一事务则能显著减少锁定时间以及回滚开销. #### 考虑分片或分区表设计 针对特别大规模的数据集,考虑对目标表格实施水平分割即分片(sharding),或是垂直拆解字段形成多个物理上独立但逻辑关联的小型子表(partitioning)。这样做的好处是可以分散I/O压力,加快查询速度的同时也便于维护管理. ```java public void performBulkInsert(List<Item> items){ SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); try { ItemMapper mapper = sqlSession.getMapper(ItemMapper.class); for (Item item : items) { mapper.insert(item); } sqlSession.commit(); } finally { sqlSession.close(); } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值