spring boot的数据访问
spring data是spring用来解决数据访问问题的的一揽子解决方案,spring data是一个伞形项目,包含了大量的关系型和非关系型数据库的访问解决方案。包含的子项目:
spring data JPA;
spring data MongoDB
spring data REST
spring data Elasticsearch等等等
spring data为我们使用统一的api对上述的存储技术进行支持,这是spring通过spring data common项目实现的,它是上述各个项目的依赖。spring data common的一个重要概念:spring data repository抽象。抽象的根接口是repository接口。它的子接口crudRepository定义了CRUD的相关操作(如findAll,save,saveAndFlush等)。crudRepository的子接口PagingAndSortingRepository定义了排序与分页的操作。
不同的数据访问技术提供了不同的repository实现,如spring data JPA是jpaRepository。
spring data JPA
是对ORM(领域模型和数据库表映射)技术提供的标准规范。所谓规范是只定义标准规则(如注解,借口),不提供实现。实现可以由hibernate等软件提供商实现。
1.定义一个继承jpaRepository的接口,这意味着默认已经有了findAll,save,saveAndFlush等这些方法;(如PersonRepository)
2.通过@EnableJpaRepositories(“数据层所在包”)开启Spring data JPA支持,
3.定义查询方法,可以根据关键字(And,Or,OrderBy等)定义;也可以@NamedQuery或@Query自定义sql语句;
4.实体类加上@Entity注解,指明是一个和数据库表映射的实体类(如Person)
5.运行:Person p = PersonRepository.findByNameAndAddress(name,address);
非关系型数据库
MongoDB
mongoDB是基于文档(document)的存储型数据库。
spring data mongoDB提供了 对象/文档 注解:
@Document:映射领域对象与mongoDB的一个文档
@Id:映射当前属性是id
@DbRef:当前属性将参考其他文档
@Field:为文档的属性定义名称
@version:将当前属性作为版本
eg. @Document//映射领域模型和mongoDB的文档
public class Person{
@Id//表明这个属性为文档id
private String id;
private String name;
@Field(“locs”)//此属性在文档中的名称为locs
private Collection<Location> locations = new LinkedHashSet<Location>();
}
public interface PersonRepository extends MongoRepository<Person,String>{
}
Redis
基于键值对的内存数据存储。
spring Data redis为我们提供了reidsTemplate和StringReidsTemplate两种模板来进行数据操作,其中StringReidsTemplate是只针对键值都是字符型的数据进行操作。template提供的主要数据访问方法:
opsForValue()操作只有简单属性的数据
opsForList()含list的数据
opsForSet()含set的数据
opsForZSet()含有zset(有序的set)数据
opsForHash()含hash的数据
当我们的数据存到redis时,key和value都是通过spring提供的serializer序列化到数据库的。
ValueOperates<String,String> stringRedisTemplate = redisTemplate.opsForValue();
stringRedisTemplate.set(“test”,”test”,10,TimeUnit.SECOND);
String value = stringRedisTemplate.get(“test”);
stringRedisTemplate.delete(“test”); //删除某个键
redisTemplate.opsForSet().add(“testSet”,”1”);
Set<String> members = redisTemplate.opsForSet().members(“testSet”);]
… …
spring data REST
spring data REST支持将Spring data JPA等的repository自动转换为REST服务。
使用GET请求直接访问:HTTP://localhost:8080/persons,得到列表数据json格式;HTTP://localhost:8080/persons/7,得到第7条数据。
节点路径为HTTP://localhost:8080/persons,是spring data REST默认的规则,在实体类之后加s形成路径。
对映射域名进行修改:在Repository的实现类上通过@RepositoryRestResource注解实现。
@RepositoryRestResource(path = “people”)
public interface PersonRepository extends jpaRepository{}