MyBatis(五)动态SQL之批量操作(删除)
⼀、批量删除
  删除记录的时候,⼤多时候都是根据记录的 id 去删除,所以当实现批量删除的时候,只要我们想法传进去多个 id 值就可以了。
  思路:
第⼀种⽅式:delete from tbl_employee where id in (1,2,3)
第⼆种⽅式:delete from tbl_employee where id = 1 or id = 2 or id = 3
⼆、⽅式⼀
  可以将多个 id 值拼接成字符串,然后传递进去,通过 id in (ids) 的⽅式来删除。
  1、在接⼝中声明⽅法
//通过id所组成的字符串实现批量删除
public void deleteMoreEmp(String eids);
  2、在对应的 xml ⽂件中配置
<!--
public void deleteMoreEmp(String ids);
-->
<delete id="deleteMoreEmp">
delete from tbl_employee where id in (#{ids})
</delete>
  3、测试
@Test
public void testDeleteMore() throws Exception {
SqlSessionFactory sqlSessionFactory =  getSqlSessionFactory();
delete in
SqlSession sqlSession =  sqlSessionFactory.openSession(true);
EmpMapper mapper =  Mapper(EmpMapper.class);
String eids = "19,20,21";
mapper.deleteMoreEmp(eids);
}
   可以发现,这时并没有全部删除,⽽只是删除了 19 这条记录,这是为什么呢?
   执⾏的SQL语句为:
delete from tbl_employee where id in (?)
    如果这时把 ids 传递过去,因为使⽤的是 #{} 获取值的⽅式,
    对于字符串类型来说,默认会给字符串加上单引号,就成了下⾯这种形式:
delete from tbl_employee where id in ('19,20,21')
    对于这条SQL语句来说,只会匹配到第⼀个 id,即id=19的记录,后⾯的将不会再执⾏了,所以只删除了第⼀条记录。
    如果把 #{} 取值改为 ${} 取值呢?
<!--
public void deleteMoreEmp(String ids);
-->
<delete id="deleteMoreEmp">
delete from tbl_employee where id in (${value})
</delete>
    这时再进⾏测试,执⾏的 SQL 语句是:
delete from tbl_employee where id in (19,20,21)
    可以发现,这才是我们想要的结果,并且也在数据库中成功的删除了。
   注意:⼀定要注意 #{} 取值与{} 取值的区别和特点,#{}对字符串类型会加单引号,⽽{} 不会。
三、⽅式⼆
  使⽤ foreach 标签来进⾏删除
  1、在接⼝中声明⽅法
//通过list集合实现批量删除
public void deleteMoreByList(List<Integer> ids);
  2、在 xml 中进⾏配置
<!-- public void deleteMoreByList(List<Integer> ids);  -->
<delete id="deleteMoreByList">
delete from tbl_employee where id in
<foreach collection="list" item="id"  separator="," open="(" close=")">
#{id}
</foreach>
</delete>
  3、测试
@Test
public void testBatchDelete() throws IOException {
//1、获取 sqlSessionFactory
SqlSessionFactory sqlSessionFactory = getsqlSessionFactory();
//2、获取 sqlSession 实例,能直接执⾏已经映射的 SQL 语句
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
EmployeeMapperBatch mapper = Mapper(EmployeeMapperBatch.class);
mapper.deleteMoreByList(Arrays.asList(1, 2, 3));
sqlSessionmit();
} finally {
sqlSession.close();
}
}
  4、执⾏的SQL语句
Preparing: delete from tbl_employee where id in ( ? , ? , ? )
Parameters: 19(Integer), 20(Integer), 23(Integer)
  这时也可以执⾏成功。
四、⽅式三
  使⽤ foreach 标签来批量删除(思路⼆,使⽤ or)
  1、在接⼝中声明⽅法
//通过list集合实现批量删除
public void deleteMoreByList(List<Integer> ids);
  2、在xml中进⾏配置
<!-- public void deleteMoreByList(List<Integer> ids);  -->
<delete id="deleteMoreByList">
delete from tbl_employee where
<foreach collection="list" item="id"  separator="or">
id = #{id}
</foreach>
</delete>
    把多个 id=value 进⾏拼接,⽤ or 作为分隔符。
  3、测试
@Test
public void testBatchDelete() throws IOException {
//1、获取 sqlSessionFactory
SqlSessionFactory sqlSessionFactory = getsqlSessionFactory();
//2、获取 sqlSession 实例,能直接执⾏已经映射的 SQL 语句
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
EmployeeMapperBatch mapper = Mapper(EmployeeMapperBatch.class);              mapper.deleteMoreByList(Arrays.asList(19, 20, 23));
sqlSessionmit();
} finally {
sqlSession.close();
}
}
    执⾏的SQL语句:
Preparing: delete from tbl_employee where id = ? or id = ? or id = ?
Parameters: 19(Integer), 20(Integer), 23(Integer)
    此时也可以运⾏成功。
    注意:上⾯的 List 也可以更换成 Array 数组,但是取值的时候要注意,key 为 array。Processing math: 0%

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。