MyBatis关联删除之批量删除与级联删除

数据基础

两张表,头行结构。逻辑结构:一对多,一个老师有多个学生。为帮助理解,相当于是一张老师表一张学生表。以下代码中没有用这两张表的字段,以头表行表来替代老师表和学生表,通用性高一些。
1541582063.jpg
1541582063(1).jpg

问题

  1. 批量删除行表信息,单表删除操作。
  2. 批量删除头表,这里在每删除一条头表内容的时候,就需要相应的取删除它所对应的行表的信息。

解决方法

  1. 在controller中接收到的,是需要删除的头表的id集合ids
@Permission(permissionLogin = true)
@ApiOperation(value = "[删除] 批量删除以及级联删除")
@RequestMapping(value = "/batchDelete",method = RequestMethod.DELETE)
    public ResponseEntity<Map<String,Object>> batchDelete(@RequestBody List<Long> ids) {
        return Optional.ofNullable(listService.batchDelete(ids))
                .map(result -> new ResponseEntity<>(result, HttpStatus.OK))
                .orElseThrow(() -> new HapException("error.listService.batchDelete"));
    }

2.先进行行表的删除。

  • service实现类中,这里是级联删除的关键,
@Override
public Map<String, Object> batchDelete(List<Long> ids) {
        Map<String, Object> resultMap = new HashMap<>();
        int status = 0;
        //级联删除
        if (!ids.isEmpty()) {
            status = listMapper.batchDeleteCascadeList(ids);
        }
        resultMap.put("delete.one", status);
        //批量删除
        if (!ids.isEmpty()) {
            status = listMapper.batchDelete(ids);
        }
        resultMap.put("delete.list", status);
        return resultMap;
    }
  • 行表删除的mapper接口
    /**
     * [删除] 级联删除
     *
     * @return
     */
    int batchDeleteCascadeList(@Param(value = "idList") List<Long> idList);
  • 行表删除的xml,这里也是关键,删除行表中 uuid 是接收到的id集合中的项目所对应的的值,将每个头表项目所对应的行表内容删除。
 <delete id="batchDeleteCascadeList">
        DELETE FROM 
        one
        WHERE
        uuid IN
        (SELECT uuid FROM list WHERE id IN
        <foreach item="id" index="index" collection="idList" open="(" separator="," close=")">
            #{id}
        </foreach>
        )
    </delete>
  1. 进行头表的数据删除
  • mapper接口
    /**
     * [删除] 根据id批量删除头表信息
     *
     * @param idList
     * @return
     */
    int batchDelete(@Param(value = "idList") List<Long> idList);
  • xml
    <delete id="batchDelete" parameterType="java.util.List">
        delete from 
        list
        where id in
        <foreach collection="idList" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>

总结

以上代码中只是截取了部分关键信息,还有一些service接口代码没有贴出来。

这是使用java的方法拼接实现级联删除。如果有mybatis的拼接或者是其他更高效的方法,求指导!

MyBatis中的级联删除可以通过配置多对多关系来实现。下面是一个简单的示例: 首先,创建两个实体类:User和Role。 ```java public class User { private int id; private String username; private List<Role> roles; // 省略其他属性和方法 } public class Role { private int id; private String roleName; // 省略其他属性和方法 } ``` 接下来,创建对应的Mapper接口和XML文件。 UserMapper.java: ```java public interface UserMapper { User getUserById(int id); void deleteUserById(int id); } ``` UserMapper.xml: ```xml <mapper namespace="com.example.mapper.UserMapper"> <resultMap id="userResultMap" type="User"> <id property="id" column="id" /> <result property="username" column="username" /> <collection property="roles" ofType="Role"> <id property="id" column="role_id" /> <result property="roleName" column="role_name" /> </collection> </resultMap> <select id="getUserById" resultMap="userResultMap"> SELECT u.id, u.username, r.id AS role_id, r.role_name FROM user u LEFT JOIN user_role ur ON u.id = ur.user_id LEFT JOIN role r ON ur.role_id = r.id WHERE u.id = #{id} </select> <delete id="deleteUserById"> DELETE FROM user WHERE id = #{id} </delete> </mapper> ``` 在这个示例中,通过resultMap配置了User和Role的关联关系。在删除用户时,如果配置了级联删除,那么与该用户关联的角色也会被删除。 使用时,可以在Service层调用Mapper接口中的deleteUserById方法来实现级联删除。 ```java @Autowired private UserMapper userMapper; public void deleteUserById(int id) { userMapper.deleteUserById(id); } ``` 这样,当调用deleteUserById方法删除某个用户时,与该用户关联的角色也会被删除
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值