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
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",
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;}
}
这里没有使用@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("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 {&#64;AutowiredPersonRepository personRepository;&#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;}&#64;RequestMapping("/q1")public List<Person> q1(String address){List<Person> people &#61; personRepository.findByAddress(address);return people;}&#64;RequestMapping("/q2")public Person q2(String name,String address){Person people &#61; personRepository.findByNameAndAddress(name, address);return people;}&#64;RequestMapping("/q3")public Person q3(String name,String address){Person p &#61; personRepository.withNameAndAddressQuery(name, address);return p;}&#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"));return people;}&#64;RequestMapping("/page")public Page<Person> page(){Page<Person> pagePeople &#61; personRepository.findAll(new PageRequest(1, 2));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
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;}
}
实体类的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;
&#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;