SpringBoot集成Spring Data JPA深入学习(待续)

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

结果如下图所示:
在这里插入图片描述
在这里插入图片描述

项目代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值