本文共 1748 字,大约阅读时间需要 5 分钟。
当我们在新增一条主表的时候,往往有很多明细表,有的人在新增明细表的时候就是在程序中循环新增明细表。
这样做的问题就是效率很低,因为我们要多次连接数据库。
所以我们要用到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,如需转载请自行联系原作者