第十节:删除数据 -- 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。

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;
    }

测试

  1. 增加数据
  2. 查询数据
  3. 删除数据
  4. 再查询数据

delete action test

有人可能会有一些疑问:我们进行删除操作时,并没有返回任何值,我们怎么知道删除成功了呢?当删除失败时,又会得到什么样的提示呢?

SpringMVC中,返回的结果状态值存在于header中。当header中的status200时,表示操作成功。

status 200

更多方法

相信在上面书写代码的过程中,我们已经发现了SpringMVC给我们提供的不止一个删除方法。

more delete

当我们调用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文件夹。