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

2025-05-29 0 54

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

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"

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

数据库插入结果:

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

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

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

数据库结果

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

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

批量新增数据记录完毕。

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

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 mybatis学习之路mysql批量新增数据的方法 https://www.kuaiidc.com/109670.html

相关文章

发表评论
暂无评论