好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Mybatis三种批量插入数据的方式

1. 循环插入

mapper.xml:

?

1

2

3

4

5

6

7

<? xml version = "1.0" encoding = "UTF-8" ?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

< mapper namespace = "com.buhe.demo.mapper.StudentMapper" >

   < insert id = "insert" parameterType = "Student" >

     INSERT INTO tb_student (name, age, phone, address, class_id) VALUES (#{name},#{age},#{phone},#{address},#{classId})

   </ insert >

</ mapper >

mapper接口:

?

1

2

3

public interface StudentMapper {

     int insert(Student student);

}

测试代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

@SpringBootTest

class DemoApplicationTests {

     @Resource

     private StudentMapper studentMapper;

 

     @Test

     public void testInsert(){

         //数据生成

         List<Student> studentList = createData( 100 );

 

         //循环插入

         long start = System.currentTimeMillis();

         studentList.stream().forEach(student -> studentMapper.insert(student));

         System.out.println(System.currentTimeMillis() - start);

     }

 

     private List<Student> createData( int size){

         List<Student> studentList = new ArrayList<>();

         Student student;

         for ( int i = 0 ; i < size; i++){

             student = new Student();

             student.setName( "小王" + i);

             student.setAge( 18 );

             student.setClassId( 1 );

             student.setPhone( "1585xxxx669" );

             student.setAddress( "未知" );

             studentList.add(student);

         }

 

         return studentList;

     }

}

2. foreach标签

mapper.xml:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<? xml version = "1.0" encoding = "UTF-8" ?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

< mapper namespace = "com.buhe.demo.mapper.StudentMapper" >

   < insert id = "insert" parameterType = "Student" >

     INSERT INTO tb_student (name, age, phone, address, class_id) VALUES (#{name},#{age},#{phone},#{address},#{classId})

   </ insert >

 

   < insert id = "insertBatch" >

     INSERT INTO tb_student (name, age, phone, address, class_id) VALUES

     < foreach collection = "list" separator = "," item = "item" >

         (#{item.name},#{item.age},#{item.phone},#{item.address},#{item.classId})

     </ foreach >

   </ insert >

</ mapper >

mapper接口:

?

1

2

3

4

5

public interface StudentMapper {

     int insert(Student student);

 

     int insertBatch(List<Student> studentList);

}

测试代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

@SpringBootTest

class DemoApplicationTests {

     @Resource

     private StudentMapper studentMapper;

 

     @Test

     public void testInsertByForeachTag(){

         //数据生成

         List<Student> studentList = createData( 100 );

 

         //使用foreach标签,拼接SQL插入

         long start = System.currentTimeMillis();

         studentMapper.insertBatch(studentList);

         System.out.println(System.currentTimeMillis() - start);

     }

 

 

     private List<Student> createData( int size){

         List<Student> studentList = new ArrayList<>();

         Student student;

         for ( int i = 0 ; i < size; i++){

             student = new Student();

             student.setName( "小王" + i);

             student.setAge( 18 );

             student.setClassId( 1 );

             student.setPhone( "1585xxxx669" );

             student.setAddress( "未知" );

             studentList.add(student);

         }

 

         return studentList;

     }

}

3. 批处理

测试代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

@SpringBootTest

class DemoApplicationTests {

     @Autowired

     private SqlSessionFactory sqlSessionFactory;

 

     @Test

     public void testInsertBatch(){

         //数据生成

         List<Student> studentList = createData( 100 );

 

                 //使用批处理

         long start = System.currentTimeMillis();

         SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false );

         StudentMapper studentMapperNew = sqlSession.getMapper(StudentMapper. class );

         studentList.stream().forEach(student -> studentMapperNew.insert(student));

         sqlSession.commit();

         sqlSession.clearCache();

         System.out.println(System.currentTimeMillis() - start);

     }

 

     private List<Student> createData( int size){

         List<Student> studentList = new ArrayList<>();

         Student student;

         for ( int i = 0 ; i < size; i++){

             student = new Student();

             student.setName( "小王" + i);

             student.setAge( 18 );

             student.setClassId( 1 );

             student.setPhone( "1585xxxx669" );

             student.setAddress( "未知" );

             studentList.add(student);

         }

 

         return studentList;

     }

}

三种方式的对比

MySQL服务器版本:5.6.4

其他依赖版本如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

<? xml version = "1.0" encoding = "UTF-8" ?>

< project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"

     xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" >

     < modelVersion >4.0.0</ modelVersion >

     < parent >

         < groupId >org.springframework.boot</ groupId >

         < artifactId >spring-boot-starter-parent</ artifactId >

         < version >2.4.4</ version >

         < relativePath /> <!-- lookup parent from repository -->

     </ parent >

     < groupId >com.buhe</ groupId >

     < artifactId >demo</ artifactId >

     < version >0.0.1-SNAPSHOT</ version >

     < name >demo</ name >

     < description >Demo project for Spring Boot</ description >

     < properties >

         < java.version >1.8</ java.version >

     </ properties >

     < dependencies >

         < dependency >

             < groupId >org.springframework.boot</ groupId >

             < artifactId >spring-boot-starter-web</ artifactId >

         </ dependency >

 

         < dependency >

             < groupId >org.springframework.boot</ groupId >

             < artifactId >spring-boot-starter-test</ artifactId >

             < scope >test</ scope >

         </ dependency >

 

         < dependency >

             < groupId >mysql</ groupId >

             < artifactId >mysql-connector-java</ artifactId >

             < version >5.1.41</ version >

         </ dependency >

         < dependency >

             < groupId >org.mybatis.spring.boot</ groupId >

             < artifactId >mybatis-spring-boot-starter</ artifactId >

             < version >1.3.1</ version >

         </ dependency >

     </ dependencies >

 

     < build >

         < plugins >

             < plugin >

                 < groupId >org.springframework.boot</ groupId >

                 < artifactId >spring-boot-maven-plugin</ artifactId >

             </ plugin >

         </ plugins >

 

         < resources >

             < resource >

                 < directory >src/main/java</ directory >

                 < includes >

                     < include >**/*.xml</ include >

                 </ includes >

             </ resource >

         </ resources >

     </ build >

 

</ project >

三种插入方式在不同数据量下的表现,测试结果:

 

插入方式 10条 100条 500条 1000条
循环插入 496ms 3330ms 15584ms 33755ms
foreach标签 268ms 366ms 392ms 684ms
批处理 222ms 244ms 364ms 426ms

 

三种方式中,批处理的方式效率是最高的,尤其是在数据量大的情况下尤为明显。

其次是foreach标签,foreach标签是通过拼接SQL语句的方式完成批量操作的。但是当拼接的SQL过多,导致SQL大小超过了MySQL服务器中max_allowed_packet变量的值时,会导致操作失败,抛出PacketTooBigException异常。

最后是循环插入的方式,这种方式在数据量小的时候可以使用,在数据量大的情况下效率要低很多。

以上就是Mybatis的三种批量插入方式的详细内容,更多关于Mybatis 批量插入的资料请关注其它相关文章!

原文链接:https://www.cnblogs.com/seve/p/14654104.html

查看更多关于Mybatis三种批量插入数据的方式的详细内容...

  阅读:12次