一、Spring Data简介
Spring Data是Spring框架家族中的一员,它主要提供了一种在各种数据存储系统(如关系型数据库、NoSQL数据库、搜索引擎等)和Spring应用程序之间进行数据访问的统一方法。使用Spring Data,我们可以通过一种简单的方式访问数据存储领域,并且这种访问方式是一致的、干净的,更加快捷和简练。
Spring Data的核心模块Spring Data Commons定义了一些通用的接口,如Repository和QueryDSL,这些接口可以在不同的数据存储系统中被具体的实现模块(如Spring Data JPA、Spring Data MongoDB)所实现。这些实现模块对JPA、MongoDB等数据存储系统进行了封装,在封装的过程中并提供了众多便捷的特性。
二、Spring Data JPA
Spring Data JPA是基于Spring Data Commons模块的另一个子模块,它提供了一种使Spring应用程序与JPA(Java Persistence API)兼容的方法。使用Spring Data JPA的好处在于,我们能够通过简化的方式编写数据访问代码。
让我们看一个简单的例子,我们创建一个名为Customer的JPA实体,它包含了id、firstName、lastName、email四个属性,以及一个JpaRepository实例:
@Entity public class Customer { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; private String firstName; private String lastName; private String email; //getters and setters } public interface CustomerRepository extends JpaRepository{ List findByLastName(String lastName); }
在上面的代码中,我们定义了一个Customer实体并声明了CustomerRepository对象,它是一个继承了JpaRepository接口的子接口。该接口中定义了一些常规的CRUD方法以及findByLastName方法,根据lastName属性查找Customer实例。
Spring Data JPA至少需要提供一个数据环境管理器(EntityManager),该管理器负责实现对持久化数据的操作,同时,Spring将于调用持久化CRUD方法之后自动进行持久化操作。此外,我们还需添加一些相关的配置文件,如application.properties。
三、Spring Data MongoDB
Spring Data MongoDB是使用MongoDB数据存储的Spring Data模块之一,它为MongoDB提供类似于Spring Data JPA的CRUD功能。
与Spring Data JPA类似,我们同样需要定义一个MongoDB实体类和一个MongoRepository接口。下面是一个简单的例子,定义了名为Person的MongoDB实体,并且声明了PersonRepository接口:
@Document(collection = "person") public class Person { @Id private String id; private String name; private int age; //getters and setters } @Repository public interface PersonRepository extends MongoRepository{ List findByName(String name); List findByAge(int age); }
在上面的代码中,我们定义了一个Person实体并声明了一个PersonRepository接口,它继承自MongoRepository接口。可以看出,在代码中,我们已定义了一些查找方法,例如findByName方法和findByAge方法,这些方法Spring也会自动进行持久化操作。
我们还需添加MongoDB的配置文件,例如application.yml文件:
spring: data: mongodb: uri: mongodb://localhost:27017/test
其中,要注意的是MongoDB的数据库URI,这个URI一般是由MongoDB运行时自动生成的,而不需要手动去配置。
四、Spring Data Redis
Spring Data Redis是Spring Data的另外一个模块,它对Redis进行了抽象封装,在使用Redis进行数据操作时非常方便。
下面我们定义了一个名为User的Redis实体,它包含了id、name、age三个属性,并且声明了一个UserRepository接口:
@Data @AllArgsConstructor @NoArgsConstructor @RedisHash("user") public class User { @Id private String id; private String name; private int age; //getters and setters public static User createUser(String name,int age){ User user = new User(); user.setId(UUID.randomUUID().toString()); user.setName(name); user.setAge(age); return user; } } public interface UserRepository extends CrudRepository{ List findByName(String name); }
在上面的示例代码中,我们定义了一个User实体和继承自CrudRepository接口的UserRepository接口。该接口中定义了一些常规的CRUD方法以及findByName方法。
与MongoDB一样,我们同样需要配置Redis相关属性如下:
spring: redis: host: 127.0.0.1 port: 6379
五、Spring Data Elasticsearch
Spring Data Elasticsearch是一个基于Spring Data Commons模块的子模块,它提供了一种使用Elasticsearch的简单方法。
与上面的例子相同,我们定义了一个名为Book的Elasticsearch实体和一个BookRepository接口:
@Data @AllArgsConstructor @NoArgsConstructor @Document(indexName="bookindex",type="books") public class Book { @Id private String id; private String bookName; private String author; private String des;//book description //getters and setters } public interface BookRepository extends ElasticsearchRepository{ List findByBookNameLike(String bookName); }
在上面的示例代码中,我们定义了一个名为Book的Elasticsearch实体和继承自ElasticsearchRepository接口的BookRepository接口,接口中定义了常规的CRUD方法以及由findByBookNameLike方法实现的根据bookName属性查找Book实例。
与MongoDB、Redis一样,我们同样需要为Elasticsearch配置相关的信息:
spring: data: elasticsearch: cluster-name: elasticsearch cluster-nodes: 127.0.0.1:9300
总结
Spring Data提供了很多实用且易于使用的API,同时每个API都适用于不同类型的数据存储系统。从Spring Data JPA到Spring Data MongoDB,再到Spring Data Redis和Spring Data Elasticsearch,Spring Data为开发人员提供了丰富的选择,让我们可以以一种统一的方式访问不同类型的数据存储系统。
完整代码示例请参考:https://github.com/paramitamirza/Spring-Data-Examples