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 级联删除内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MyBatis查询、新增、更新与删除操作指南

    调试之控制台打印SQL Mybatis的使用流程 先来回顾一下mybatis的使用流程 创建mybatis-config.xml 全局的配置⽂件 创建XXXMapper.xml配置⽂件 创建SqlSessionFactory ⽤SqlSessionFactory创建SqlSession对象 ⽤SqlSession执⾏增删改查CRUD 打印sql的配置 内置的⽇志⼯⼚提供⽇志功能, 使⽤log4j配置打印sql,添加依赖 <dependency> <groupId>org.slf4j

  • mybatis postgresql 批量删除操作方法

    PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统.POSTGRES的许多领先概念只是在比较迟的时候才出现在商业网站数据库中.PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询.外键.触发器.视图.事务完整性.多版本并发控制等.同样,PostgreSQL也可以用许多方法扩展,例如通过增加新的数据类型.函数.操作符.聚集函数.索引方法.过程

  • MybatisPlus中的删除和逻辑删除及区别介绍

    删除又分为逻辑删除和物理删除,那么它们有什么区别呢? 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据. 逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为"被删除状态",之后在数据库中仍旧能看到此条数据记录. 在我们日常开发中,为了保留数据,经常会使用逻辑删除的方式进行数据删除,下面我们就来看看物理删除与逻辑删除怎么实现的吧 首先假设我有这样一张表 实体类: package com.atguigu.mybatis_plus.entity; import

  • mybatis-plus3.4.0逻辑删除报错的解决

    特别注意!!! 无论数据库字段,实体类字段,还是平时取其它字段名字时候,或者方法这些名字,一定不能和关键字重名,因为这样可能出现一些让人无法看出的错误 在进行mybatis-plus逻辑删除字段时候,我在数据库定义了delete字段定义为int类型,默认值是0,然后又在实体类中定义了这个字段delete并且在实体类的这个字段上面添加了注解@TableLogic,并且在application.properties中开启.(我使用的是3.4.0) 根据官方文档,在3.4.0版本中只需要以上两个步骤即

  • Mybatis入门教程之新增、更新、删除功能

    上一节说了Mybatis的框架搭建和简单查询,这次我们来说一说用Mybatis进行基本的增删改操作: 一. 插入一条数据 1.首先编写USER.XML(表的xml)使用insert元素,元素写在mapper中: <insert id="insertitem" parameterType="cn.qkp.po.user"> INSERT INTO user(username,birthday,sex,address) VALUES(#{username},

  • Mybatis批量删除数据操作方法

    MyBatis的作用我想不用多说,今天说说MyBatis中的批量删除操作.废话不多说,先给大家一段代码片段! <delete id="deleteByStandardIds"> delete from t_standard_catalog where standard_id in <foreach collection="array" item="standardId" open="(" close=&quo

  • MyBatis批量添加、修改和删除

    废话不多说了,直接步入正题了. 1.批量添加元素session.insert(String string,Object o) public void batchInsertStudent(){ List<Student> ls = new ArrayList<Student>(); for(int i = 5;i < 8;i++){ Student student = new Student(); student.setId(i); student.setName("

  • Mybatis批量删除多表

    一. 这里主要考虑两种参数类型:数组或者集合. 而这点区别主要体现在EmpMapper.xml文件中标签的collection属性: 当collection="array"时,表名参数为数组; 当collection="list"时,表名参数为集合. 二. 注意: 无论Mybatis是与mysql数据库结合,还是与Oracle数据库,都同样适合如下设置与操作. 三. 具体示例如下: EmpMapper.xml: <!-- 批量删除员工信息 --> <

  • Oracle + Mybatis实现批量插入、更新和删除示例代码

    前言 Mybatis是web工程开发中非常常用的数据持久化的框架,通过该框架,我们非常容易的进行数据库的增删改查.数据库连接进行事务提交的时候,需要耗费的资源比较多,如果需要插入更新的数据比较多,而且每次事务只提交一条数据,会造成非常大的数据库资源浪费,导致数据库性能.系统性能大幅度下降. 关于mybatis的批量插入,网上的多数示例多半是关于MySQL数据库的,关于Oracle数据库的例子比较少.本文将给大家介绍关于Oracle+Mybatis批量插入.更新和删除的相关内容,下面话不多说了,来

  • Mybatis 级联删除的实现

    需求描述 今日需求是删除资源时同时删除与该资源绑定的角色数据,有两张表,资源表.角色与资源绑定表,级联删除的时候有两种方法:①建立表时直接建立约束,当父表删除数据时数据库会自动去删除子表中的数据,②通过代码实现级联删除,先删除子表数据,然后删除父表中的数据. 通过数据库实现 可以参考博文://www.jb51.net/article/88148.htm 这种方式假如我们要删除父表的数据,子表的数据就会被删除,而我们的业务需求是表中是否删除由is_delete字段来标识,所以这种方式是可以实现级联

  • 解析Oracle中多表级联删除的方法

    表间的关系比较复杂,数据量又比较多,一个个删绝对会出大问题.于是实验了几种解决的办法,现小结一下. 方法一:创建约束时设定级联删除(但一般由于各种原因或出于各种考虑在创建数据库时没有设定级联删除)SQL语句: 复制代码 代码如下: CREATE TABLE "U_WEN_BOOK"."FARTAB" ("FAR_ID" NUMBER(10) NOT NULL,"FAR_NAME" VARCHAR2(10), "OTH

  • Oracle数据库中的级联查询、级联删除、级联更新操作教程

    级联查询 在ORACLE 数据库中有一种方法可以实现级联查询 select * //要查询的字段 from table //具有子接点ID与父接点ID的表 start with selfid=id //给定一个startid(字段名为子接点ID,及开始的ID号) connect by prior selfid=parentid //联接条件为子接点等于父接点,不能反 这个SQL主要用于菜单的级联查询,给一个父接点可以查出所有的子接点.及子接点的子接点,一查到底,很实用.不过呢这个程序只能在ora

  • MySQL使用外键实现级联删除与更新的方法

    本文实例讲述了MySQL使用外键实现级联删除与更新的方法.分享给大家供大家参考,具体如下: MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作,包括RESTRICT.NO ACTION.SET NULL和CASCADE.其中RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新:CASCADE表示父表在更新或者删除时,更

  • django多对多表的创建,级联删除及手动创建第三张表

    创建一张作者表,author,创建外键与book表,多对多关系 ,外键字段放在那张表都可以, class Author(models.Model): name = models.CharField(max_length=32) #在Author表中创建第三张表,与book表创建多对多关系一样的效果 # books = models.ManyToManyField(Book) #再重新生成数据库,因为新增了多对多关系,book表会新增字段,所以直接重新生成数据库就会报错, 在book表里,关联Au

  • php创建多级目录与级联删除文件的方法示例

    本文实例讲述了php创建多级目录与级联删除文件的方法.分享给大家供大家参考,具体如下: 创建多级目录 mkdir函数只能创建一级的目录,如果我们想创建多级目录,则需要自己编写函数. <?php $path = "one/two/three/four"; function mkdir_p($path,$mode=0700){ $arr = explode("/",$path); $path = ''; foreach($arr as $v){ $path .=

  • 解决myBatis中删除条件的拼接问题

    今天刚刚学习了mybatis,做了简单的对数据库的增删改查.在进行删除操作时,单条删除时很简单,但是批量删除的时候拼接删除条件却有些麻烦,现记录一下做法. Sql语句中,当删除条件并不唯一的时候,我们有两种删除的sql语句,一种使用or拼接where中的条件,例如delete from 表名where 条件1 or 条件2,另一种是使用in 例如delete from 表名where 元素in( ) 利用第一种删除语句在mybatis中的mapping.xml中进行拼接: 利用第二种删除语句在m

  • ASP.NET Core使用EF保存数据、级联删除和事务使用

    目录 1.简介 2.基本保存 2.1添加数据 2.2更新数据 2.3删除数据 2.4单个SaveChanges中的多个操作 3.保存关联数据 3.1添加关联数据 3.2添加相关实体 3.3更改关系 4.级联删除 5.事务 5.1控制事务 1.简介 每个上下文实例都有一个ChangeTracker,它负责跟踪需要写入数据库的更改.更改实体类的实例时,这些更改会记录在ChangeTracker中,然后在调用SaveChanges时会被写入数据库中.此数据库提供程序负责将更改转换为特定于数据库的操作(

随机推荐