第十节:删除数据 -- delete
数据删除的时序图与更新相同,由C
层调用service
,然后由service
调用repository
来完成删除操作。
我们参考spring data jpa
的开发文档http://docs.spring.io/spring-data/jpa/docs/1.11.1.RELEASE/reference/html/, 找到4.1 Core concepts。
此时,我们使用的便是其为我们提供的删除操作。
在接口中建立方法
public interface TeacherService {
Teacher saveTeacher(Long id, Teacher teacher) throws EntityNotFoundException;
void deleteTeacher(Teacher teacher); // 删除实体
}
实现接口中的方法
public void deleteTeacher(Teacher teacher) {
teacherRepository.delete(teacher);
return;
}
测试
@Test
public void deleteTeacherTest() {
// 实例化教师 李四
Teacher teacherLisi = new Teacher("lisi",
"lisi@email.com",
"scse of hebut",
false);
// 保存李四至数据库
teacherLisi = teacherRepository.save(teacherLisi);
System.out.println(teacherLisi); // 打印插入的数据
// 执行删除操作
teacherService.deleteTeacher(teacherLisi);
// 数据查找,看数据是否进行了删除
Teacher teacher = teacherRepository.findOne(teacherLisi.getId());
System.out.println(teacher);
}
控制台:
// 插入新数据 -- 在执行save()操作时, Hibernate 自动生成
Hibernate: insert into teacher (address, email, name, sex) values (?, ?, ?, ?)
// 打印插入的数据 -- System.out.println(teacherLisi)
Teacher{id=1, name='lisi', email='lisi@email.com', address='scse of hebut', sex=false}
// 在删除前,先查询数据表中是否存在该条数据 -- 执行delelteTacher操作时, Hibernate 自动生成
Hibernate: select teacher0_.id as id1_0_0_, teacher0_.address as address2_0_0_, teacher0_.email as email3_0_0_, teacher0_.name as name4_0_0_, teacher0_.sex as sex5_0_0_ from teacher teacher0_ where teacher0_.id=?
// 删除数据 -- 执行delelteTacher操作时, Hibernate 自动生成
Hibernate: delete from teacher where id=?
// 查打数据 -- 执行findOne操作时,Hibernate 自动生成
Hibernate: select teacher0_.id as id1_0_0_, teacher0_.address as address2_0_0_, teacher0_.email as email3_0_0_, teacher0_.name as name4_0_0_, teacher0_.sex as sex5_0_0_ from teacher teacher0_ where teacher0_.id=?
// 打印查询到的数据 -- System.out.println(teacher);
null
对接C层
// @DeleteMapping 表明该方法只接收 delete 请求.
@DeleteMapping("/{id}")
public void deleteTeacher(@PathVariable Long id) {
Teacher teacher = teacherRepository.findOne(id);
teacherService.deleteTeacher(teacher);
return;
}
测试
- 增加数据
- 查询数据
- 删除数据
- 再查询数据
有人可能会有一些疑问:我们进行删除操作时,并没有返回任何值,我们怎么知道删除成功了呢?当删除失败时,又会得到什么样的提示呢?
在SpringMVC
中,返回的结果状态值存在于header
中。当header
中的status
为200
时,表示操作成功。
更多方法
相信在上面书写代码的过程中,我们已经发现了SpringMVC
给我们提供的不止一个删除方法。
当我们调用delete()
时,会提示我们有3个参数可选。这说明有3个delete()
方法,分别接收了3种参数类型:
- 第一种是
Long
类型,表示要删除的实体的关键字。 - 第二种是
Teacher
实体类型,表示要删除的实体。 - 第三种是
Iterable
类型,表示要删除的Teacher
实体迭代器(单向链表,链表上的每个节点为一个Teacher
实体)
官方的说明文档中注释中的一句// … more functionality omitted.
也充分的说明了这个问题。
在此,我们在service
补充deleteTeacherById()
方法。
增加接口
public interface TeacherService {
/**
* 保存
* @param id 关键字
* @param teacher 教师
* @return 保存后的教师
*/
Teacher saveTeacher(Long id, Teacher teacher) throws EntityNotFoundException;
void deleteTeacher(Teacher teacher); // 删除实体
void deleteTeacherById(Long id); // 删除实体
}
实现接口
@Override
public void deleteTeacherById(Long id) {
teacherRepository.delete(id);
return;
}
测试
@Test
public void deleteTeacherByIdTest() {
// 实例化教师 李四
Teacher teacherLisi = new Teacher("lisi",
"lisi@email.com",
"scse of hebut",
false);
// 保存李四至数据库
teacherLisi = teacherRepository.save(teacherLisi);
System.out.println(teacherLisi);
// 删除关键字对应的实体
teacherService.deleteTeacherById(teacherLisi.getId());
// 数据查找,看数据是否进行了删除
Teacher teacher = teacherRepository.findOne(teacherLisi.getId());
System.out.println(teacher);
}
控制台:
Hibernate: insert into teacher (address, email, name, sex) values (?, ?, ?, ?)
Teacher{id=1, name='lisi', email='lisi@email.com', address='scse of hebut', sex=false}
Hibernate: select teacher0_.id as id1_0_0_, teacher0_.address as address2_0_0_, teacher0_.email as email3_0_0_, teacher0_.name as name4_0_0_, teacher0_.sex as sex5_0_0_ from teacher teacher0_ where teacher0_.id=?
Hibernate: delete from teacher where id=?
Hibernate: select teacher0_.id as id1_0_0_, teacher0_.address as address2_0_0_, teacher0_.email as email3_0_0_, teacher0_.name as name4_0_0_, teacher0_.sex as sex5_0_0_ from teacher teacher0_ where teacher0_.id=?
null
自本节开始,不再提供完整代码。如果有参考完整代码的需求,请参考github
中的项目仓库中的api
文件夹。