热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot的数据访问(一)SpringDataJPA、SpringDataREST

SpringData概述SpringData项目是Spring用来解决数据访问问题的一揽子方案,SpringData是一个伞形项目,包含了大量关系型数
Spring Data概述

Spring Data项目是Spring用来解决数据访问问题的一揽子方案,Spring Data是一个伞形项目,包含了大量关系型数据库及非关系型数据库的数据访问解决方案:

Spring Data为我们使用统一的API来对上述的数据存储技术进行数据访问操作提供了支持。这是Spring通过提供Spring Data Commons项目来实现的,它是上述各种Spring Data项目的依赖。Spring Data Commons让我们在使用关系型或非关系型数据访问技术时都使用基于Spring的统一标准,该标准包含CURD、查询、排序、和分页的相关的操作。

Spring Data Commons重要概念:Spring Data Repository抽象。使用Spring Data Repository可以极大地减少数据访问层的代码。既然是数据访问操作的统一标准,那肯定是定义了各种各样和数据访问相关的接口!

Spring Boot 使用Spring Data JPA

JPA(Java Persistence API): JPA是一个基于O/R映射的标准规范。所谓规范即只定义标准规则(如注解、接口),不提供实现,软件提供商可以按照标准规范来实现,而使用者只需按照规范中定义的方式来使用,而不用和软件提供商的实现打交道!

1:新建Spring Boot项目:依赖选择JPA和Web,并导入数据库驱动;
2:配置属性
application.properties

//数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/book
spring.datasource.username=root
spring.datasource.password=123456//JPA
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jackson.serialization.indent-output=true/ /让控制器输出的json字符串格式更美观

实体类Person.java

@Entity //指明这是一个和数据库表映射的实体类
@NamedQuery(name = "Person.withNameAndAddressNamedQuery", //@NamedQuery定义查询方法,即一个名称映射一个查询语句
query = "select p from Person p where p.name=?1 and address=?2")
public class Person {@Id //主键@GeneratedValue //使用默认的主键生成方式自增private Long id;private String name;private Integer age;private String address;public Person() {super();}public Person(Long id, String name, Integer age, String address) {super();this.id = id;this.name = name;this.age = age;this.address = address;}//。。。省略setter/getter
}

这里没有使用@Table、@Column注解。这是因为我们是采用正向工程通过实体类生成表结构。同时,我们没有通过@Column注解来注解普通属性,@Column是用来映射属性名和字段名,不注解的时候hibernate会自动根据属性名生成数据表的字段名,如:name映射为NAME,多字母属性如testName会自动映射为TEST_NAME。表名的映射规则也是如此!!!
数据访问层接口PersonRepository.java

public interface PersonRepository extends JpaRepository<Person, Long> {List<Person> findByAddress(String address);Person findByNameAndAddress(String name,String address);//&#64;Query注解在接口的方法上实现查询&#64;Query("select p from Person p where p.name&#61; :name and p.address&#61; :address")Person withNameAndAddressQuery(&#64;Param("name")String name,&#64;Param("address")String address);Person withNameAndAddressNamedQuery(String name,String address);}

数据控制器DataController.java

&#64;RestController
public class DataController {//1 Spring Data JPA已自动为你注册bean&#xff0c;所以可自动注入&#64;AutowiredPersonRepository personRepository;/*** 保存* save支持批量保存&#xff1a; Iterable save(Iterable entities);* * 删除&#xff1a;* 删除支持使用id&#xff0c;对象以&#xff0c;批量删除及删除全部&#xff1a;* void delete(ID id);* void delete(T entity);* void delete(Iterable entities);* void deleteAll();* */&#64;RequestMapping("/save")public Person save(String name,String address,Integer age){Person p &#61; personRepository.save(new Person(null, name, age, address));System.out.println("save方法");return p;}/*** 测试findByAddress*/&#64;RequestMapping("/q1")public List<Person> q1(String address){List<Person> people &#61; personRepository.findByAddress(address);return people;}/*** 测试findByNameAndAddress*/&#64;RequestMapping("/q2")public Person q2(String name,String address){Person people &#61; personRepository.findByNameAndAddress(name, address);return people;}/*** 测试withNameAndAddressQuery*/&#64;RequestMapping("/q3")public Person q3(String name,String address){Person p &#61; personRepository.withNameAndAddressQuery(name, address);return p;}/*** 测试withNameAndAddressNamedQuery*/&#64;RequestMapping("/q4")public Person q4(String name,String address){Person p &#61; personRepository.withNameAndAddressNamedQuery(name, address);return p;}/*** 测试排序*/&#64;RequestMapping("/sort")public List<Person> sort(){List<Person> people &#61; personRepository.findAll(new Sort(Direction.ASC,"age"));//按age&#xff0c;升序排序return people;}/*** 测试分页*/&#64;RequestMapping("/page")public Page<Person> page(){Page<Person> pagePeople &#61; personRepository.findAll(new PageRequest(1, 2));//第一个参数表示页数&#xff0c;从0开始计&#xff0c;第二个参数表示每页的数据量。return pagePeople;}
}

测试运行效果&#xff1a;
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

Spring Boot 使用Spring Data REST

Spring Data REST是基于Spring Data的repository之上&#xff0c;可以把 repository 自动输出为REST资源&#xff0c;目前支持Spring Data JPA、Spring Data MongoDB、Spring Data Neo4j、Spring Data GemFire、Spring Data Cassandra的 repository 自动转换成REST服务。注意是自动。简单点说&#xff0c;Spring Data REST把我们需要编写的大量REST模版接口做了自动化实现&#xff0c;使用示例&#xff1a;

1&#xff1a;新建Spring Boot项目&#xff0c;添加依赖JPA和Rest Repositories&#xff0c;并导入数据库驱动
2&#xff1a;配置属性
application.properties

//数据源
spring.datasource.driver-class-name&#61;com.mysql.jdbc.Driver
spring.datasource.url&#61;jdbc:mysql://localhost:3306/book
spring.datasource.username&#61;root
spring.datasource.password&#61;123456//JPA
spring.jpa.hibernate.ddl-auto&#61;update
spring.jpa.show-sql&#61;true
spring.jackson.serialization.indent-output&#61;true

实体类Person

&#64;Entity
public class Person {&#64;Id &#64;GeneratedValueprivate Long id;private String name;private Integer age;private String address;public Person() {super();}public Person(Long id, String name, Integer age, String address) {super();this.id &#61; id;this.name &#61; name;this.age &#61; age;this.address &#61; address;}//。。。省略setter/getter方法
}

实体类的Repository

public interface PersonRepository extends JpaRepository<Person, Long> {Person findByNameStartsWith(String name);
}

安装Postman
https://www.getpostman.com/
这里写图片描述
这里写图片描述
REST服务测试
列表&#xff1a;
这里写图片描述

获取单一对象&#xff08;获得id为1的对象&#xff09;
这里写图片描述

查询&#xff1a;
上面自定义实体类Repository中定义了findByNameStartsWith方法&#xff0c;若想此方法也暴露为REST资源&#xff0c;需要做如下修改&#xff1a;

//Spring Data REST默认规则是在实体类之后加上"s"来形成路径&#xff0c;我们可以通过&#64;RepositoryRestResource注解的path属性进行修改&#xff01;
&#64;RepositoryRestResource(path &#61; "people")
public interface PersonRepository extends JpaRepository<Person, Long> {&#64;RestResource(path &#61; "nameStartsWith", rel &#61; "nameStartsWith")Person findByNameStartsWith(&#64;Param("name")String name);
}

这里写图片描述

分页&#xff1a;
这里写图片描述

排序&#xff1a;
这里写图片描述

保存&#xff1a;
这里写图片描述
通过输出可以看出&#xff0c;保存成功后&#xff0c;我们的新数据的id为45&#xff1b;

更新&#xff08;更新刚刚新增的id为45的数据&#xff09;&#xff1a;
这里写图片描述

删除&#xff08;删除刚刚新增的id为45的数据&#xff09;&#xff1a;
这里写图片描述
此时再用GET方式访问id为45的数据&#xff1a;
这里写图片描述
表明所访问的REST资源不存在&#xff1b;

定制根路径&#xff1a;
在上面的例子中&#xff0c;我们访问的REST资源的路径是在根目录下的&#xff0c;即http://localhost:8080/people&#xff0c;如果我们需要定制根路径的话&#xff0c;只需在application.properties下新增如下定义即可&#xff1a;

spring.data.rest.base-path&#61;/api

此时REST资源的路径变成了http://localhost:8080/api/people;
定制节点路径&#xff1a;
Spring Data REST默认规则是在实体类之后加上"s"来形成路径&#xff0c;我们可以通过&#64;RepositoryRestResource注解的path属性进行修改&#xff01;
默认为http://localhost:8080/persons

&#64;RepositoryRestResource(path &#61; "people")

此时REST资源的路径变成了http://localhost:8080/people;

参考书籍&#xff1a;Spring Boot 实战
以上只是学习所做的笔记&#xff0c; 以供日后参考&#xff01;&#xff01;&#xff01;


推荐阅读
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • Node.js 配置文件管理方法详解与最佳实践
    本文详细介绍了 Node.js 中配置文件管理的方法与最佳实践,涵盖常见的配置文件格式及其优缺点,并提供了多种实用技巧和示例代码,帮助开发者高效地管理和维护项目配置,具有较高的参考价值。 ... [详细]
  • 优化后的标题:深入解析09版Jedis客户端
    深入解析09版Jedis客户端,本文将详细介绍如何在Java项目中正确配置Jedis以操作Redis。首先,确保项目的JDK版本和编译器设置正确。接着,通过Maven或Gradle导入必要的依赖项,如 `redis.clients:jedis`。此外,文章还将探讨Jedis连接池的配置与优化,以及常见问题的解决方案,帮助开发者高效使用Jedis进行Redis操作。 ... [详细]
  • 在近期的项目开发过程中,ORM层采用了MyBatis,并且需要连接多个数据库,这带来了多数据源配置的挑战。为了解决这一问题,我们可以通过巧妙运用注解来实现优雅的数据源切换,确保系统的灵活性和可维护性。这种方法不仅简化了配置,还提高了代码的可读性和扩展性。 ... [详细]
  • 在数据表中,我需要触发一个操作来刷新特定列的数据。例如,对于以下表格:| ID | Name | IsDeleted ||----|-------|-----------|| 1 | test | True || 2 | test2 | False |我希望在点击“更新”按钮时,能够仅刷新选定行的“IsDeleted”列。这将有助于确保数据的实时性和准确性。 ... [详细]
  • 本文详细探讨了MySQL并发参数的优化与调整方法,旨在帮助读者深入了解如何通过合理配置这些参数来提升数据库性能。文章不仅介绍了常见的并发参数及其作用,还提供了实际操作中的调整策略和最佳实践,适合希望提高数据库管理技能的技术人员阅读。 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 利用Java开发功能完备的电话簿应用程序,支持添加、查询与删除操作
    本研究基于Java语言开发了一款功能全面的电话簿应用程序,实现了与数据库的高效连接。该应用不仅支持添加、查询和删除联系人信息,还具备输出最大和最小ID号的功能,并能够对用户输入的ID号进行有效性验证,确保数据的准确性和完整性。详细实现方法可参阅相关文档。 ... [详细]
  • 通过优化模板消息机制,本研究提出了一种高效的信息化推送方案。该方案利用获取的访问令牌(access token)和指定的模板ID,实现了精准且快速的信息推送,显著提升了用户体验和信息传递效率。具体实现中,通过调用相关API接口,确保了消息的准确性和及时性,为用户提供更加便捷的服务。 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • 本文探讨了在Lumen框架中实现自定义表单验证功能的方法与挑战。Lumen的表单验证机制默认返回无状态的JSON格式API响应,这给初学者带来了一定的难度。通过深入研究Validate类,作者分享了如何有效配置和使用自定义验证规则,以提升表单数据的准确性和安全性。 ... [详细]
  • MVVM架构~mvc,mvp,mvvm大话开篇
    返回目录百度百科的定义:MVP是从经典的模式MVC演变而来,它们的基本思想有相通的地方:ControllerPresenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模 ... [详细]
  • Java中处理NullPointerException:getStackTrace()方法详解与实例代码 ... [详细]
  • 从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南
    从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南 ... [详细]
  • 成功实现Asp.Net MVC3网站与MongoDB数据库的高效集成
    我们成功地构建了一个基于Asp.NET MVC3框架的网站,并实现了与MongoDB数据库的高效集成。此次更新不仅完善了基本的创建和显示功能,还全面实现了数据的增删改查操作。在创建功能方面,我们修复了之前代码中的错误,确保每个属性都能正确生成。此外,我们还对数据模型进行了优化,以提高系统的性能和稳定性。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有