MyBatis实现删除操作

MyBatis实现删除操作

1 删除一个

接口

/**
 * 根据id删除
 */
void deleteById(int id);

SQL映射

<!--根据id删除-->
<delete id="deleteById">
    delete
    from tb_brand
    where id = #{id};
</delete>

测试

删除前

image-20220815200817474

  @Test
    public void testDeleteById() throws IOException {
//        设置参数
        int id = 6;

//    1.获取SQLSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//        2. 获取SqlSession对象
//        设置为自动提交事务
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
//        3. 获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
//        4. 执行方法
        brandMapper.deleteById(id);
//        5. 释放资源
        sqlSession.close();
    }

删除后

image-20220815200939965

2 批量删除

最初的sql配置为

<delete id="deleteByIds">
    delete
    from tb_brand
    where id in (?,?,?);
</delete>

这样存在问题是不能动态的删除

问号为占位符,但是不知道要删除几个,所以占位符不知道要放多少个

解决办法:

使用标签

注意:

MyBatis会将数组参数,封装为一个Map集合。

  • 默认:array = 数组
  • 使用 @Param注解改变map集合的默认key的名称

本次使用@Param注解的方式

接口

/**
 * 批量删除
 */
void deleteByIds(@Param("ids") int[] ids);

sql映射

<!--    批量删除-->
<delete id="deleteByIds">
    delete
    from tb_brand
    where id
    in (
    <foreach collection="ids" item="id" separator=",">
        #{id}
    </foreach>
    );
</delete>

测试

删除 7 8 9

image-20220815202428287

 @Test
    public void testDeleteByIds() throws IOException {
//        设置参数
        int[] ids = {7, 8, 9};

//    1.获取SQLSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//        2. 获取SqlSession对象
//        设置为自动提交事务
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
//        3. 获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
//        4. 执行方法
        brandMapper.deleteByIds(ids);
//        5. 释放资源
        sqlSession.close();
    }

image-20220815202639936

优化

优化sql映射配置文件

使用属性open和close 这样可以省略在外面手动添加括号,由MyBatis自动添加

<delete id="deleteByIds">
    delete
    from tb_brand
    where id
    in
    <foreach collection="ids" item="id" separator="," open="(" close=")">
        #{id}
    </foreach>
    ;
</delete>
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MyBatis实现多表删除可以使用嵌套查询和关联查询来实现。 1. 嵌套查询:通过SQL语句中的子查询来实现多表删除操作。首先,在Mapper文件中定义一个嵌套查询的SQL语句,该语句可以查询出需要删除数据的相关表的记录。接下来,在Mapper文件的delete标签中使用嵌套查询语句来指定需要删除的数据。最后,在代码中调用Mapper接口的delete方法来执行删除操作。 2. 关联查询:通过SQL语句中的关联查询来实现多表删除操作。首先,在Mapper文件中定义一个关联查询的SQL语句,该语句可以关联查询出需要删除数据的相关表的记录。接下来,在Mapper文件的delete标签中使用关联查询语句来指定需要删除的数据。最后,在代码中调用Mapper接口的delete方法来执行删除操作。 无论是嵌套查询还是关联查询,使用MyBatis实现多表删除需要注意以下几点: 1. 确保所有相关的表都有适当的外键约束,以避免误删除数据。 2. 对于需要删除的数据,要确保在删除之前所有与之相关的数据都已经处理完毕,以免出现数据不一致的情况。 3. 在删除操作之前,最好先进行一次查询来确认要删除的数据是否正确。如果需要删除的数据量较大,可以考虑使用分页查询来提高效率。 综上所述,使用MyBatis实现多表删除需要根据具体的业务需求选择合适的方法,同时要注意数据的完整性和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会挂科i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值