题目
MyBatis 实现批量插入有几种方式
答案
@[toc]
---
## for 循环
```java
for(int i = 0 ;i < 100000; i++) {
User user = new User();
user.setId("id" + i);
user.setName("name" + i);
user.setPassword("password" + i);
userMapper.insert(user);
}
------------
<insert id="insert">
INSERT INTO t_user (id, name, password)
VALUES(#{id}, #{name}, #{password})
</insert>
```
## Mybatis BATCH 模式
BATCH 模式对应的 Executor 就是 `BatchExecutor`
```java
// 打开 BATCH 模式
SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
for (int i = 0; i < 100000; i++) {
User user = new User();
user.setId("id" + i);
user.setName("name" + i);
user.setPassword("password" + i);
userMapper.insert(user);
}
sqlSession.commit();
------------
<insert id="insert">
INSERT INTO t_user (id, name, password)
VALUES(#{id}, #{name}, #{password})
</insert>
```
## 动态标签 foreach
```java
List<User> userList = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
User user = new User();
user.setId("id" + i);
user.setName("name" + i);
user.setPassword("password" + i);
userMapper.insert(user);
}
userMapper.insertBatch(userList);
------------
<insert id="insertBatch">
INSERT INTO t_user
(id, name, password)
VALUES
<foreach collection ="userList" item="user" separator =",">
(#{id}, #{name}, #{password})
</foreach >
</insert>
```
> 在插入速度这方面,一般来说,动态标签 foreach > BATCH 模式 > for 循环(最慢)
