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(); 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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM