当我们在新增一条主表的时候,往往有很多明细表,有的人在新增明细表的时候就是在程序中循环新增明细表。
这样做的问题就是效率很低,因为我们要多次连接数据库。
所以我们要用到sql的批量新增,其实就是传入一个明细list,然后在sql中循环执行。
批量新增:(service层)
1
2
3
4
5
6
7
8
9
10
11
12
|
@Transactional
(rollbackFor = Exception.
class
)
@Override
public
void
save(FixedAssetsRequisition fixedAssetsRequisition,List<FixedAssetsreRuisitionDetails> detailss,String filesId)
throws
Exception{
dao.save(
"FixedAssetsRequisitionMapper.save"
, fixedAssetsRequisition);
//主表
if
(!
""
.equals(filesId)){
String[] fileId = filesId.split(
","
);
fileService.update(fixedAssetsRequisition.getId(), fileId);
}
if
(detailss !=
null
&& detailss.size() >
0
) {
dao.batchSave(
"FixedAssetsreRuisitionDetailsMapper.save"
,detailss );
//批量新增明细表
}
}
|
mapper.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<!-- 字段值 -->
<sql id=
"FieldValueList"
>
#{item.id},
#{item.purchaseContent},
#{item.quantity},
#{item.referencePrice},
#{item.referenceTotalPrice},
#{item.fixedAssetsreRuisitionId}
</sql>
<!-- 新增-->
<insert id=
"save"
parameterType=
"java.util.List"
>
insert into
<include refid=
"tableName"
></include>
(
<include refid=
"Field"
></include>
) values
<foreach collection=
"list"
item=
"item"
index=
"index"
separator=
","
>
(<include refid=
"FieldValueList"
></include>)
</foreach>
</insert>
|
示例为:
1
|
INSERT into sys_department(ID,NAME,NAME_EN,CODE) VALUES(
'3'
,
'LI'
,
'LI01'
,
'JIAN01'
),(
'4'
,
'LI2'
,
'LI2'
,
'JIAN2'
)
|
批量修改:(批量修改我们是采用先删除明细表,再重新批量新增明细表)
1
2
3
4
|
if
(detailss !=
null
&& detailss.size() >
0
) {
fixedAssetsRequisitionDetailsService.deleteByFarId(fixedAssetsRequisition.getId());
dao.batchSave(
"FixedAssetsreRuisitionDetailsMapper.save"
,detailss );
}
|
批量删除:(我们通过主表id来删除多个已主表id为外键的明细记录)
本文转自建波李 51CTO博客,原文链接:http://blog.51cto.com/jianboli/1961405,如需转载请自行联系原作者