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

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

在做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也不熟悉,于是乎放弃。 

 

 

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLite的@TableField是Android Room库中用来描述数据库表字段的一种注解。Room是一个用于数据持久化的库,它将ORM(对象关系映射)的概念引入到Android应用中,使得数据操作更加方便和直观。 @TableField注解用于在Java或Kotlin的实体类(Entity)中声明一个字段,它会对应数据库表中的一个列。这个注解提供了关于字段的各种信息,例如: 1. **name**: 必须,指定字段在数据库表中的名称。 2. **type**: 可选,默认为String类型,可以设置为Integer、Long、Float、Double、Blob、Boolean等。 3. **nullable**: 可选,默认为true,表示字段是否可以有NULL值。 4. **primaryKey**: 可选,如果字段应该被设置为表的主键,设为true。 5. **autoValue**: 可选,如果字段值由其他字段自动计算得出,设为true。 6. **defaultValue**: 可选,指定字段的默认值。 7. **foreignKey**: 可选,用于关联其他表,表示外键引用。 使用示例: ```java @Dao public interface MyTableDao { @Insert void insert(User user); @Query("SELECT * FROM users WHERE id = :id") User getUserById(@TableField(name = "id", type = Long.class, primaryKey = true) long id); } @Entity(tableName = "users") data class User( @PrimaryKey(autoGenerate = true) @TableField(name = "user_id") // 使用别名user_id作为主键 var id: Long, @TableField(name = "username", nullable = false) val username: String, @TableField(name = "email", defaultValue = "user@example.com") var email: String ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值