SpringBoot集成Spring Data JPA深入学习
项目环境
- IDEA 2019.1
- SpringBoot 2.1.5
- Gradle 4.10
技术介绍
Spring Data JPA介绍
测试代码
插入测试数据
插入1000条学生数据作为测试数据使用,年龄定义在50岁以内,性别0表示男生。1表示女生,代码如下:
@RequestMapping(value = "/students/add", method = {RequestMethod.GET})
public void insertStudent(){
//插入1000条学生信息用做出测试
for(int i=0;i<1000;i++){
Random random = new Random();
int age = random.nextInt(50);
int gender = random.nextInt(2);
String name = GenChineseName.getName();
Student student = new Student();
student.setAge(age);
student.setGender(gender);
student.setStudentName(name);
studentRepository.save(student);
System.out.println("开始插入第"+i+"条数据:"+student.toString());
}
}
分页查询
Spring Data JPA中提供了PagingAndSortingRepository
接口。该接口可用于处理分页查询和排序。
在之前的测试中我们定义了StudentRepository
接口来对tb_student表进行操作。代码如下:
@Repository
public interface StudentRepository extends JpaRepository<Student, Long> {
}
StudentRepository
接口继承了JpaRepository
,而JpaRepository
则是继承了PagingAndSortingRepository
接口,其集成关系如下图所示:
测试代码如下:
private static final Integer SIZE_OF_EVERY_PAGE = 20;
@ResponseBody
@RequestMapping(value = "/students/{pagenum}", method = {RequestMethod.GET})
public List<Student> pageabledQuery(@PathVariable int pagenum){
//
Page<Student> students = studentRepository.findAll(PageRequest.of(pagenum-1, SIZE_OF_EVERY_PAGE));
return students.getContent();
}
PageRequest.of()方法的第一个参数页数,第二个参数是每页的数据数量。在使用过程中我们发现,传递的页数是0
的时候显示的是第1-20条数据。这里当时有点疑问,查阅源码发现在源码中已经给出了说明。具体如下(AbstractPageRequest.java
):
/**
* Creates a new {@link AbstractPageRequest}. Pages are zero indexed, thus providing 0 for {@code page} will return
* the first page.
*
* @param page must not be less than zero.
* @param size must not be less than one.
*/
public AbstractPageRequest(int page, int size) {
if (page < 0) {
throw new IllegalArgumentException("Page index must not be less than zero!");
}
if (size < 1) {
throw new IllegalArgumentException("Page size must not be less than one!");
}
this.page = page;
this.size = size;
}
大概意思是,页数的索引是从0开始的,当参数page=0时,返回的是第一页。
结果如下图所示:
条件查询
使用IDEA当我们在repository中输入代码时,IDE会根据输入内容进行提示(至于为什么这么提示可以查看JPA规范)。
我们这时有了一个List<Student> findStudentByAge(int age);
方法,这个方法时根据年龄查询所有的学生。我们接下来使用这个方法查询满足条件的数据。编写方法如下
@ResponseBody
@RequestMapping(value = "/students/age/{age}", method = {RequestMethod.GET})
public List<Student> queryStudentByAge(@PathVariable int age){
List<Student> students = studentRepository.findStudentByAge(age);
return students;
}
使用postman测试,请求地址为:http://127.0.0.1:8880/students/age/20
,可以发现将年龄为20随的所有学生都查询出来了。
- 接口约定命名规则:
下面图片来自官方文档
@Query注解
测试代码如下:
@ResponseBody
@RequestMapping(value = "/students/query", method = {RequestMethod.GET})
public List<Student> quertSimple( String studentname){
List<Student> students = studentRepository.findByStudentName(studentname);
return students;
}
@ResponseBody
@RequestMapping(value = "/students/endwith", method = {RequestMethod.GET})
public List<Student> quertSimpleEndWith(String endname){
List<Student> students = studentRepository.findByStudentNameEndsWith(endname);
return students;
}
结果如下图所示:
项目代码
- github:点击这里