第四节:增加数据 -- create

和我们以前学习的框架基本一致,框架已经为我们封装好了大部分的基本操作,我们只需要做适当的继承操作就可以实现大部的数据操作了。

CrudRepository

在SpringMVC中,为我提供了用于进行数据增查删改删的CrudRepository接口。下面,我们来新建第一个用于数据表操作的接口文件 – TeacherRepository

没错,是接口,而不是SpringMVC做自动的为我们的接口做相关的实现。而我们并不需要关心Spring是怎么做到的。

TeacherRepository

package com.mengyunzhi.repository;

import org.springframework.data.repository.CrudRepository;

/**
 * Created by panjie on 17/4/6.
 */
public interface TeacherRepository extends CrudRepository<Teacher, Long> {
}

测试

我们在test文件夹中的同名位置上新建对应的测试类。

TeacherRepositoryTest

package com.mengyunzhi.repository;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * Created by panjie on 17/4/6.
 */
// 使用以下两个注解来说明:本测试类基于SpringBoot。(必须)
@RunWith(SpringRunner.class)
@SpringBootTest
public class TeacherRepositoryTest {
    // @Autowired注解:自动加载Spring为我们自动实例化的实现了TeacherRepository接口的对象
    @Autowired
    private TeacherRepository teacherRepository;

    // @Test:本方法为一个单元测试方法
    @Test
    public void addTeacher() {
        // 执行数据保存操作
        teacherRepository.save(new Teacher());

        // 打印Spring为我们自动实例化的对象
        System.out.println(teacherRepository);
    }
}

然后我们点击方法前面的Run Test小图标run test 来启动单元测试。

我们将在控制台,得到如下信息:

org.springframework.data.jpa.repository.support.SimpleJpaRepository@340cb97f

没错,这就是Spring自动实例化的teacherRepository

此时,我们使用Navicat,打开数据表,发现里面已经成功的增加了一条数据。

add data

在实际的开发过程中,每新增一条数据,都去数据表中进行查看,效率还是比较低的。我们还可以通过修改配置文件的方法,来直接输出sql语句,来查看是否执行了我们想要的操作。

在配置文件中,增加一行:

# 显示SQL语句
spring.jpa.show-sql=true

增加后,整体配置文件如下:

# 在项目初始化时,重新创建数据表
spring.jpa.hibernate.ddl-auto=create
# 指定连接的类型为mysql 连接的地址为:localhost 端口为3306 ,数据为springmvc
spring.datasource.url=jdbc:mysql://localhost:3306/springmvc
# 用户名为root
spring.datasource.username=root
# 密码为空
spring.datasource.password=
# 显示SQL语句
spring.jpa.show-sql=true

此时,当我们再次Run Test的时候,在控制台中,将得到如下信息:

Hibernate: insert into teacher (address, email, name, sex) values (?, ?, ?, ?)

当我们看到这条语句时,就可以放心的认为:数据文件已经成功的插入到数据表中了。

参考官方文档:http://docs.spring.io/spring-data/jpa/docs/1.11.1.RELEASE/reference/html/#repositories.core-concepts

对接C层

有了上面的测试代码,C层对接起来,也相应的容易的多了。但对接以前,我们需要做了解以下几点。

  • 数据发送请求的方式为post
  • 数据以json的格式进行发送。
  • json数据中,发送新增教师的姓名、地址、邮箱、性别信息。
  • 除性别的变量类型是boolean外,其它的全部为String

有了以上几点,那我们如下定义后台。

  • 接收post数据
  • 按收json格式传入的数据
  • 接收数据后,进行数据表的存储操作

新建控制器

new controller

自动装入TeacherRepository

...
@RestController
public class TeacherController {
    @Autowired
    private TeacherRepository teacherRepository;
    ...

添加方法,并设置路由:

    ...
    // 设置路由
    @RequestMapping("/teacher/save")
    public Teacher saveTeacher() {
    }
    ...

获取请求数据,并装入Teacher

    ...
    // 设置路由
    @RequestMapping("/teacher/save")
    // 使用@RequestBody注解,将请求的`json`数据,直接加载至teacher对象
    public Teacher saveTeacher(@RequestBody Teacher teacher) {
    ...

打印获取的数据,并执行保存操作:

    ...
    public Teacher saveTeacher(@RequestBody Teacher teacher) {
        // 打印加载的数据
        System.out.println(teacher);

        // 调用保存操作
        return teacherRepository.save(teacher);
    }
    ...

最终的代码如下:

package com.mengyunzhi.controller;

import com.mengyunzhi.repository.Teacher;
import com.mengyunzhi.repository.TeacherRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * Created by panjie on 17/4/6.
 */
// 声明为Rest控制器(支持前后台分离)
@RestController
public class TeacherController {
    @Autowired
    private TeacherRepository teacherRepository;

    // 设置路由
    @RequestMapping("/teacher/save")
    // 使用@RequestBody注解,将请求的`json`数据,直接加载至teacher对象
    public Teacher saveTeacher(@RequestBody Teacher teacher) {
        // 打印加载的数据
        System.out.println(teacher);

        // 调用保存操作
        return teacherRepository.save(teacher);
    }
}

测试

重新启动应用, 我们可以点击SpringMvcApplicationmain函数左侧的启动按钮,也可以点击右上角的启动按钮。如果你点击的为右上角按钮,那么需要注意进行切换(这是由于我们刚刚建立过测试类,而测试类也是可以直接启动的)。

run

启动postMan, 并发送请求。

post man

请求结果: post man

控制台信息:

Teacher{id=null, name='zhangsan', email='zhangsan@yunzhiclub.com', address='scse of hebut', sex=false}
Hibernate: insert into teacher (address, email, name, sex) values (?, ?, ?, ?)

此时,我们看到了insertsql语句,至此,基本确认数据已经被成功增加到数据库了,如果你还不放心,可以打开navicat来查看并确认一下。

我们在前面,按照Teacher构造函数中,变量的顺序使用postman将变量按顺序一一进行了传入。那么是否可以改变变量传入的顺序呢?比如说,我们将请求的json数据变更为:

{
    "address":"scse of hebut",
    "name":"LISI",
    "email":"zhangsan@yunzhiclub.com",
    "sex":0
}

尝试并总结一下它的规律吧。

PagingAndSortingRepository


以下内容后期将迁入至其它章节,本节请直接略过


CrudRepository只能实现基本的增查改删,大多数的时候,我们还需要对数据进行分页、排序。强大的Spring当然想到了这点– PagingAndSortingRepository

在官方文档中,我们看到是这样介绍PagingAndSortingRepository的:

public interface PagingAndSortingRepository<T, ID extends Serializable>
  extends CrudRepository<T, ID> {

  Iterable<T> findAll(Sort sort);

  Page<T> findAll(Pageable pageable);
}

是的,正如我们看到的一样:PagingAndSortingRepository继承了CrudRepository,因而PagingAndSortingRepository具有CrudRepository的全部功能,并且在此之上,补充了两个用于排序和分页的功能。