一、前言
当我们有很多数据需要通过数据库操作,例如很多数据的更新或者插入, 如果用for循环的方式,里面一条条数据去调数据库操作,我们知道那样开销是很大的,会频繁的创建链接,带来性能问题,为了减少连接,我们通常会批量操作。
二、批量插入代码样例
已mybatis的批量插入活动表为例:
1、活动表简单表结构:
CREATE TABLE `activity` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`activity_id` bigint(20) DEFAULT NULL COMMENT '活动id',
`user_id` bigint(20) DEFAULT NULL COMMENT '用户id',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT DEFAULT CHARSET=utf8 COMMENT='活动表';
2、业务层组装数据:
ActivityServiceImpl.java:
private void saveRecords() {
List<Activity> recordList = new ArrayList<>();
Activity activity = new Activity();
activity.setUserId(userId);
activity.setActivityId(activityId);
recordList.add(activity);
activityDao.insertBatchActivity(recordList);
}
ActivityDao.java:
void insertBatchActivity(List<Activity> recordList);
activityDao.xml中写法:
activityDao.xml:
<insert id="insertBatchActivity">
INSERT INTO activity
(
activity_id, user_id, create_time
)
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.activityId},
#{item.userId},
now()
)
</foreach>
</insert>
特别注意:mysql默认接受sql的大小是1048576(1M),即第三种方式若数据量超过1M会报如下异常:(可通过调整MySQL安装目录下的my.ini文件中[mysqld]段的"max_allowed_packet = 1M")
|