web项目中有两张表一张班级表表,一张学生表,在删除班级表里的数据到时候如果该班级有学生不能删除的代码实现适应mybatis
时间: 2024-09-20 07:10:25 浏览: 42
在Web项目中,如果你想要在MyBatis中处理删除班级(Class)表数据时,由于可能存在关联的学生(Student)表记录,你需要防止误删导致的数据丢失,可以采用级联删除(Cascade Delete)或者在业务逻辑层添加额外检查。这里我们先解释一下级联删除:
**级联删除(Cascade):**
MyBatis的SqlSession提供了`deleteById`、`delete`等方法,你可以通过设置`association`属性来进行级联删除。例如,在`student`表中有一个外键关联到`class`表,你可以在学生实体(如StudentMapper.xml)文件里配置级联删除规则:
```xml
<mapper namespace="com.example.StudentMapper">
<!-- 示例配置 -->
<update id="deleteClassWithStudentsCascade" parameterType="int">
DELETE FROM class WHERE id = #{id}
CASCADE
</update>
</mapper>
```
然后在删除班级时,调用这个更新操作:
```java
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
int classId = ...; // 班级ID
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
mapper.deleteClassWithStudentsCascade(classId);
}
```
**业务逻辑层校验:**
如果不希望使用级联删除,可以在Service层进行额外的判断:
```java
@Service
public class ClassServiceImpl {
@Autowired
private StudentRepository studentRepository;
public void deleteClass(int classId) {
List<Student> studentsInClass = studentRepository.findByClassId(classId);
if (!studentsInClass.isEmpty()) {
throw new IllegalStateException("班上有学生,无法删除");
}
// 如果没有学生,则正常删除班级
classRepository.deleteById(classId);
}
}
```
在这种情况下,删除前会先查询是否有学生关联,如果有则抛出异常。
阅读全文