第四节:增加数据 -- create
和我们以前学习的框架基本一致,框架已经为我们封装好了大部分的基本操作,我们只需要做适当的继承操作就可以实现大部的数据操作了。
CrudRepository
在SpringMVC中,为我提供了用于进行数据增查删改删的CrudRepository
接口。下面,我们来新建第一个用于数据表操作的接口文件 – TeacherRepository
。
没错,是
接口
,而不是类
。SpringMVC
做自动的为我们的接口做相关的实现。而我们并不需要关心Spring
是怎么做到的。
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
文件夹中的同名位置上新建对应的测试类。
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
小图标
来启动单元测试。
我们将在控制台,得到如下信息:
org.springframework.data.jpa.repository.support.SimpleJpaRepository@340cb97f
没错,这就是
Spring
自动实例化的teacherRepository
。
此时,我们使用Navicat
,打开数据表,发现里面已经成功的增加了一条数据。
在实际的开发过程中,每新增一条数据,都去数据表中进行查看,效率还是比较低的。我们还可以通过修改配置文件的方法,来直接输出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
格式传入的数据 - 接收数据后,进行数据表的存储操作
新建控制器
自动装入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);
}
}
测试
重新启动应用, 我们可以点击SpringMvcApplication
中main
函数左侧的启动按钮,也可以点击右上角的启动按钮。如果你点击的为右上角按钮,那么需要注意进行切换(这是由于我们刚刚建立过测试类,而测试类也是可以直接启动的)。
启动postMan
, 并发送请求。
请求结果:
控制台信息:
Teacher{id=null, name='zhangsan', email='zhangsan@yunzhiclub.com', address='scse of hebut', sex=false}
Hibernate: insert into teacher (address, email, name, sex) values (?, ?, ?, ?)
此时,我们看到了insert
的sql
语句,至此,基本确认数据已经被成功增加到数据库了,如果你还不放心,可以打开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
的全部功能,并且在此之上,补充了两个用于排序和分页的功能。