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

    xiaoxiao2022-07-07  148

    目录

    SpringBoot集成Spring Data JPA深入学习项目环境技术介绍Spring Data JPA介绍 测试代码插入测试数据分页查询条件查询@Query注解 项目代码

    SpringBoot集成Spring Data JPA深入学习

    项目环境

    IDEA 2019.1SpringBoot 2.1.5Gradle 4.10

    技术介绍

    Spring Data JPA介绍

    官方文档JPA、Hibernate、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:点击这里
    最新回复(0)