题目
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 循环(最慢)