mybatis批量插入三种方式效率比较


向数据库里插入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")


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM