在ssm框架的项目中,我们做mybatis批量删除数据的时候,要尽量避免在service层使用for循环来批量删除数据,如下是这种for循环批量情况(如UserServiceImpl实现类)。
@Transactional public int batchDeleteUser(int[] ids) { try { for(Long userId:ids){ //一条一条的删除 userMapper.deleteByPrimaryKey(userId); } } catch (Exception e) { //批量删除事务回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return -1; } return 1; }
为什么要用mybatis批量删除数据而不使用for循环来单个删除数据呢?这是因为每次for循环操作数据库都要开启一次事务,严重的影响了数据库的操作性能,于是我们就可以直接在mybatis mapper配置文件中使用mybatis批量删除的方法,可以有效的提高mysql操作性能。
我们把UserServiceImpl类经过改造之后,变成如下这样,去掉了for循环。
@Transactional public int batchDeleteUser(int[] ids) { try{ //批量删除 userMapper.deleteAll(ids); }catch (Exception e){ //批量删除事务回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return -1; } return 1; }
这个时候UserMapper.java里面的接口方法是这样的,表示批量删除数据,如下。
//id存储在了Array数组中了 void deleteAll(int[] ids); //假如id存储在List集合中 //void deleteAll(List<id>);
在UserMapper.xml文件中,我们就可以通过foreach来遍历我们的ids数组,然后进行删除,这样就不会每次for循环的时候开启数据库连接了。
<delete id="deleteAll" parameterType="int"> delete from USER u where u.ID in <foreach item="id" collection="array" open="(" separator="," close=")"> #{id} </foreach> </delete>
注释说明:
UserMapper.xml中的collection属性:
当collection=“array”时,表名参数为数组
当collection=“list”时,表名参数为集合
item="id":
表示ids数组中的每一个元素,#{id}表示取这个数组的每一个元素值
USER:
表示user用户表