好得很程序员自学网

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

mybatis学习之路mysql批量新增数据的方法

接下来两节要探讨的是批量插入和批量更新,因为这两种操作在企业中也经常用到。

mysql新增语句  

insert into 表名(字段,字段。。。) values ( 值,值 。。。);此种适合单条插入。

批量插入,一种可以在代码中循环着执行上面的语句,但是这种效率太差,下面会有对比,看看它有多差。

另一种,可以用mysql支持的批量插入语句,

insert into 表名(字段,字段。。。) values ( 值,值 。。。),( 值,值 。。。),( 值,值 。。。)....

这种方式相比起来,更高效。

下面开始来实现。

?

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

<!-- 跟普通的insert没有什么不同的地方 ,主要用来跟下面的批量插入做对比。-->

  <insert id= "insert" parametertype= "com.soft.mybatis.model.customer" >

    <!-- 跟自增主键方式相比,这里的不同之处只有两点

          1 insert语句需要写id字段了,并且 values里面也不能省略

          2 selectkey 的order属性需要写成before 因为这样才能将生成的uuid主键放入到model中,

          这样后面的insert的values里面的id才不会获取为空

       跟自增主键相比就这点区别,当然了这里的获取主键id的方式为 select uuid()

       当然也可以另写别生成函数。-->

    <selectkey keyproperty= "id" order= "before" resulttype= "string" >

      select uuid()

    </selectkey>

    insert into t_customer (id,c_name,c_sex,c_cerono,c_cerotype,c_age)

    values (#{id},#{name},#{sex},#{cerono},#{cerotype},#{age})

  </insert>

 

  <!-- 批量插入, -->

  <insert id= "batchinsert" parametertype= "java.util.map" >

    <!-- 这里只做演示用,真正项目中不会写的这么简单。 -->

    insert into

     t_customer (id,c_name,c_sex,c_cerono,c_cerotype,c_age)

    values

    <!-- foreach mybatis循环集合用的

       collection= "list" 接收的map集合中的key 用以循环key对应的属性

         separator= "," 表示每次循环完毕,在sql后面放一个逗号

         item= "cus" 每次循环的实体对象 名称随意-->

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

      <!-- 组装values对象,因为这张表的主键为非自增主键,所以这里 (select uuid()) 用于生成id的值-->

      ((select uuid()),#{cus.name},#{cus.sex},#{cus.cerono},#{cus.cerotype},#{cus.age})

    </foreach>

  </insert>

实体model对象

?

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

62

63

64

65

66

67

68

69

70

71

72

73

74

package com.soft.mybatis.model;

 

/**

  * created by xuweiwei on 2017/9/10.

  */

public class customer {

 

   private string id;

   private string name;

   private integer age;

   private integer sex;

   private string cerono;

   private integer cerotype;

 

   public string getid() {

     return id;

   }

 

   public void setid(string id) {

     this .id = id;

   }

 

   public string getname() {

     return name;

   }

 

   public void setname(string name) {

     this .name = name;

   }

 

   public integer getage() {

     return age;

   }

 

   public void setage(integer age) {

     this .age = age;

   }

 

   public integer getsex() {

     return sex;

   }

 

   public void setsex(integer sex) {

     this .sex = sex;

   }

 

   public string getcerono() {

     return cerono;

   }

 

   public void setcerono(string cerono) {

     this .cerono = cerono;

   }

 

   public integer getcerotype() {

     return cerotype;

   }

 

   public void setcerotype(integer cerotype) {

     this .cerotype = cerotype;

   }

 

   @override

   public string tostring() {

     return "customer{" +

         "id='" + id + '\ '' +

         ", name='" + name + '\ '' +

         ", age=" + age +

         ", sex=" + sex +

         ", cerono='" + cerono + '\ '' +

         ", cerotype='" + cerotype + '\ '' +

         '}' ;

   }

}

接口

?

1

2

int add(customer customer);

int batchinsert(map<string,object> param);

实现

?

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

/**

   * 新增数据

   * @param customer

   * @return

   */

  public int add(customer customer) {

    return insert( "customer.insert" , customer);

  }

 

  /**

   * 批量插入数据

   * @param param

   * @return

   */

  public int batchinsert(map<string,object> param) {

    return insert( "customer.batchinsert" , param);

  }

 

  /**

   * 公共部分

   * @param statementid

   * @param obj

   * @return

   */

  private int insert(string statementid, object obj){

    sqlsession sqlsession = null ;

    try {

      sqlsession = sqlsessionutil.getsqlsession();

      int key = sqlsession.insert(statementid, obj);

      // commit

      sqlsession.commit();

      return key;

    } catch (exception e) {

      sqlsession.rollback();

      e.printstacktrace();

    } finally {

      sqlsessionutil.closesession(sqlsession);

    }

    return 0 ;

  }

测试类

?

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

@test

  public void add() throws exception {

    long start = system.currenttimemillis();

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

      customer customer = new customer();

      customer.setname( "普通一条条插入 " + i);

      customer.setage( 15 );

      customer.setcerono( "000000000000" + i);

      customer.setcerotype( 2 );

      customer.setsex( 1 );

      int result = customerdao.add(customer);

    }

    system.out.println( "耗时 : " +(system.currenttimemillis() - start));

  }

 

  @test

  public void batchinsert() throws exception {

    map<string,object> param = new hashmap<string,object>();

    list<customer> list = new arraylist<customer>();

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

      customer customer = new customer();

      customer.setname( "批量插入" + i);

      customer.setage( 15 );

      customer.setcerono( "111111111111" +i);

      customer.setcerotype( 2 );

      customer.setsex( 1 );

      list.add(customer);

    }

    param.put( "list" ,list);

    long start = system.currenttimemillis();

    int result = customerdao.batchinsert(param);

    system.out.println( "耗时 : " +(system.currenttimemillis() - start));

  }

两种都进行插入1000条测试

由于我没有用连接池等等原因,在插入了700多条的时候 junit直接挂了,

cause: org.apache.ibatis.executor.executorexception: error selecting key or setting result to parameter object.

cause: com.mysql.jdbc.exceptions.jdbc4.mysqlnontransientconnectionexception:

data source rejected establishment of connection,  message from server: "too many connections"

数据库插入结果:

但是第二种仅仅用了2秒多就ok了。可见这种效率很高。

数据库结果

这里写了两个,其实第一种仅仅是做对比效率用。

批量新增数据记录完毕。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:https://blog.csdn.net/xu1916659422/article/details/77971867

查看更多关于mybatis学习之路mysql批量新增数据的方法的详细内容...

  阅读:27次