一、批量刪除
刪除記錄的時候,大多時候都是根據記錄的 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(); SqlSession sqlSession = sqlSessionFactory.openSession(true); EmpMapper mapper = sqlSession.getMapper(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 = sqlSession.getMapper(EmployeeMapperBatch.class); mapper.deleteMoreByList(Arrays.asList(1, 2, 3)); sqlSession.commit(); } 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 = sqlSession.getMapper(EmployeeMapperBatch.class); mapper.deleteMoreByList(Arrays.asList(19, 20, 23)); sqlSession.commit(); } 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。