向数据库里插入10000条数据,分别使用三种插入方式,比较三种方式效率,第一种用时3000ms,第二种用时1500ms,第三种800ms,第三种效率最高。
1 package com.zhanghw.mybatisbatch; 2 3 import com.zhanghw.mybatisbatch.entity.User; 4 import com.zhanghw.mybatisbatch.mapper.UserMapper; 5 import org.apache.ibatis.session.ExecutorType; 6 import org.apache.ibatis.session.SqlSession; 7 import org.junit.Test; 8 import org.junit.runner.RunWith; 9 import org.mybatis.spring.SqlSessionTemplate; 10 import org.springframework.beans.factory.annotation.Autowired; 11 import org.springframework.boot.test.context.SpringBootTest; 12 import org.springframework.test.context.junit4.SpringRunner; 13 14 import java.util.ArrayList; 15 import java.util.List; 16 17 @RunWith(SpringRunner.class) 18 @SpringBootTest 19 public class MybatisBatchApplicationTests { 20 @Autowired 21 private UserMapper userMapper; 22 23 @Autowired 24 private SqlSessionTemplate sqlSessionTemplate; 25 26 /** 27 * 通过简单循环批量插入 28 * @throws Exception 29 */ 30 @Test 31 public void testInsertBatch1() throws Exception { 32 long start = System.currentTimeMillis(); 33 for (int i = 0; i < 10000; i++) { 34 User user = User.builder().age(i).name("zhangsan" + i).password(i + "xxxx").sex("男").build(); 35 int insert = userMapper.insert(user); 36 System.out.println(insert); 37 } 38 long end = System.currentTimeMillis(); 39 System.out.println("-------时间3188--------" + (start - end) + "---------------"); 40 } 41 /** 42 * session使用批量模式插入数据 43 */ 44 @Test 45 public void testInsertBatch2() { 46 long start = System.currentTimeMillis(); 47 //跟上述sql区别,将session设置为批量形式 48 SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory() 49 .openSession(ExecutorType.BATCH, false); 50 UserMapper mapper = sqlSession.getMapper(UserMapper.class); 51 for (int i = 0; i < 10000; i++) { 52 User user = User.builder().age(i).name("zhangsan" + i).password(i + "xxxx").sex("男").build(); 53 int insert = mapper.insert(user); 54 System.out.println(insert); 55 } 56 sqlSession.commit(); 57 long end = System.currentTimeMillis(); 58 System.out.println("----时间1535-----------" + (start - end) + "---------------"); 59 } 60 61 /** 62 * 通过foreach标签完成批量插入 63 */ 64 @Test 65 public void testInsertBatch3() { 66 long start = System.currentTimeMillis(); 67 List<User> list = new ArrayList<>(); 68 for (int i = 0; i < 10000; i++) { 69 User user = User.builder().age(i).name("zhangsan" + i).password(i + "xxxx").sex("男").build(); 70 list.add(user); 71 } 72 int i = userMapper.insertBatch(list); 73 System.out.println(i); 74 long end = System.currentTimeMillis(); 75 System.out.println("----时间824-----------" + (start - end) + "---------------"); 76 } 77 78 }
对应的mapper:
package com.zhanghw.mybatisbatch.mapper; import com.zhanghw.mybatisbatch.entity.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @Mapper public interface UserMapper { public int insert(User user); public int insertBatch(@Param("list") List<User> list); }
对应mapper的xml配置:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="com.zhanghw.mybatisbatch.mapper.UserMapper"> 6 <insert id="insert"> 7 INSERT INTO user ( name,password,sex,age) 8 VALUES( #{name}, #{password}, #{sex}, #{age}) 9 </insert> 10 11 <insert id="insertBatch" parameterType="com.zhanghw.mybatisbatch.entity.User"> 12 INSERT INTO user (name,password,sex,age) 13 VALUES 14 <foreach collection ="list" item="user" separator =","> 15 (#{user.name}, #{user.password}, #{user.sex}, #{user.age}) 16 </foreach > 17 </insert> 18 </mapper>
特别注意:mysql默认接受sql的大小是1048576(1M),即第三种方式若数据量超过1M会报如下异常:(可通过调整MySQL安装目录下的my.ini文件中[mysqld]段的"max_allowed_packet = 1M")