1. 程式人生 > 程式設計 >Mybatis 級聯刪除的實現

Mybatis 級聯刪除的實現

需求描述

今日需求是刪除資源時同時刪除與該資源繫結的角色資料,有兩張表,資源表、角色與資源繫結表,級聯刪除的時候有兩種方法:①建立表時直接建立約束,當父表刪除資料時資料庫會自動去刪除子表中的資料,②通過程式碼實現級聯刪除,先刪除子表資料,然後刪除父表中的資料。

通過資料庫實現

可以參考博文://www.jb51.net/article/88148.htm

這種方式假如我們要刪除父表的資料,子表的資料就會被刪除,而我們的業務需求是表中是否刪除由is_delete欄位來標識,所以這種方式是可以實現級聯表刪除的,但是不符合我們的需求,在此只提供一種這樣的思路。

通過程式碼實現

先寫一個刪除資源和角色繫結的介面:

/**
   * 根據資源id刪除相關的角色資源繫結資料
   * @param applicationIds 資源ids
   * @return 受影響行數
   */
  int deleteByApplicationId(List<String> applicationIds);
<delete id="deleteByApplicationId">
    UPDATE tc_role_application
    SET is_delete =1
    WHERE application_id IN (
    <foreach collection="list" item="id" separator=",">
      #{id}
    </foreach>
    ) AND is_delete = 0

  </delete>

寫一個刪除資源的介面:

int deleteByIds(@Param("list") List<String> var1,@Param("operator") String var2);
<delete id="deleteByIds">
  update tc_application set is_delete = 1,update_time=now(),operator = #{operator,jdbcType=VARCHAR}
  where id in (
    <foreach collection="list" item="id" separator=",">
      #{id}
    </foreach>
    ) and is_delete = 0
 </delete>   

執行刪除時,後刪除父表資料:

 /**
   * 批量刪除資源並刪除其下相關的資源角色繫結資料
   * @param ids 資源ids
   */
  @Transactional(rollbackFor = Exception.class)
  @Override
  public void deleteApplicationByIds(List<String> ids) {
    String user = TenancyContext.UserID.get();
    //先刪除資源角色表中資源和角色繫結的資料
    roleApplicationService.deleteByApplicationId(ids);
    //刪除資源表資料
    this.deleteByIds(ids,user);
  }

總結

根據需求和實際選擇合適自己的方法。

到此這篇關於Mybatis 級聯刪除的實現的文章就介紹到這了,更多相關Mybatis 級聯刪除內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!