springboot项目使用MySQL遇到的外键约束代码实现解决方案

本文讲述了在进行SpringBoot项目时,遇到多表外键约束删除操作引发的问题,通过重写delete方法和自定义ifdelete方法,结合MyBatis和MyBatisPlus,提供了解决方案。同时提到了使用Ajax进行前端提示的可能性和复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做java spring boot课设的时候,因为涉及到多张表,所以难以避免会有外键约束。而且通常发生在使用delete方法时候出现。报以下的错误

其实解决方法很简单,只需要重写你的delete方法即可

controller

(这里我在最上方加上了@RequestMapping("/admin/category/"))

@RequestMapping("delete")
    public String delete(Integer id) {
        categoryService.ifdelete(id);
       // categoryService.delete(id);//原先的delete方法会导致外键约束的方法
        return "redirect:/admin/category/list";
    }

servicelmpl

(service这里就不给出代码了,只是些方法的定义)

@Override
    public int delete(Integer id) {
        return categoryDao.deleteById(id);
    }//这里是一开始的delete

    @Override
    public Category ifdelete(Integer id) {
        return categoryDao.ifdelete(id);
    }
}

Dao

(这里实现对数据库的查询sql,可以看到,原先的delete(这里用的是接口BaseMappe里面的delete方法)并没有考虑到外键约束,所以我自己写了一个ifdelete方法,当要删除的时候这,个SQL语句的目的是从tab_category表中删除那些在tab_route表中没有的记录,这样就完美解决了外键约束的方法)

@Mapper
public interface CategoryDao extends BaseMapper<Category> {

        @Select("SELECT cname,cid FROM tab_category WHERE cid=#{id}")
        public Category findById(Integer id);

        @Select("DELETE FROM tab_category WHERE cid NOT IN (SELECT cid FROM tab_route);")
        public Category ifdelete(Integer cid);
}

还有实现类 

@Data
@TableName("tab_category")
public class Category implements Serializable {

    @TableId(type = IdType.AUTO)
    private Integer cid;//分类id
    private String cname;//分类名称

}
@Data
@TableName("tab_route")
public class Route implements Serializable {

    @TableId(type = IdType.AUTO)
    private Integer rid;//线路id,必输
    private String rname;//线路名称,必输
    private Double price;//价格,必输
    private String routeIntroduce;//线路介绍
    private String rflag;   //是否上架,必输,0代表没有上架,1代表是上架
    private String rdate;   //上架时间
    private String isThemeTour;//是否主题旅游,必输,0代表不是,1代表是
    private Integer count;//收藏数量
    private Integer cid;//所属分类,必输
    private String rimage;//缩略图
    private Integer sid;//所属商家
    private String sourceId;//抓取数据的来源id

    @TableField(exist = false)
    private Category category;//所属分类 使用resultmap的assocation处理
    @TableField(exist = false)
    private Seller seller;//所属商家 使用resultmap的assocation处理
    @TableField(exist = false)
    private List<RouteImg> routeImgList;//商品详情图片列表,关联属性,mybatis plus不能查,需要配置resultmap使用resultmap的collection处理

}

上述方法对jpa和mybatis以及mybatis plus均适用

不过值得一提的是,这个在实现删除的操作的时候,是没有任何提示的,当然可以自己写一个重定向的前端页面。我一开始考虑的是用ajax来进行数据的传输,这样也可以在上方给出一些提示,但是过程有些小复杂,而且我对ajax也不熟悉,于是乎放弃。 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值