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