Spring Data
简介
Spring Data 使得访问数据变得简单,包括关系型和非关系型、并行计算框架、基于云的数据服务,包含许多子项目,每一种数据库访问技术都是一个子项目。
Spring Data JPA 是其访问关系型数据库的实现。
特性
- 强大的存储库和自定义对象映射抽象
- 根据仓库方法名称动态推导查询
- 很容易和Spring集成通过based java configuration 和xml配置
主要的项目
- Spring Data Commons 核心概念支撑每一个Spring数据项目。
- Spring Data JPA 基于JPA仓库实现
- Spring Data MongoDB 支持MongoDB文档对象仓库。
- Spring Data Redis 提供简单的配置供Spring应用访问Redis
- Spring Data REST 支持将仓库导出为RESTFul 资源
还支持Gemfire、ES等。
快速开始
Spring Data JPA 基于Spring Boot的实现
依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
配置数据源
resources/application.properties
spring.datasource.url= jdbc:mysql://192.168.34.132:3306/jpa
spring.datasource.username=root
spring.datasource.password=mysqladmin
数据库实体Entity
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
@Column
private String name;
@Column
private int age;
@Column
private Date birthday;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
定义Repository
public interface PersonRepository extends CrudRepository<Person, Long> {
public Person findByAge(Integer age);
}
使用Repository
@Controller
@RestController
@RequestMapping("/persons")
public class PersonController {
@Autowired
private PersonRepository personRepository;
@RequestMapping(method = RequestMethod.GET)
public List<Person> find(Integer age) {
return personRepository.findByAge(age);
}
}
启用Repository
@SpringBootApplication
@EnableJpaRepositories("org.pretent.spring.jpa.repository")
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
启用Spring Boot应用访问http://127.0.0.1:8080/ 可以正常访问数据了。
核心概念
对于Spring Data来讲,不需要实现数据库操作,只需要定义repository,使用属性表达式定义查询方法即可,一般可以扩展Repository接口或者接口使用@RepositoryDefinition标识,如果想定义自己的仓库操作接口模板,并不是数据库操作仓库,可以使用@NoRepositoryBean。
扩展Repository、CrudRepository或者PagingAndSortingRepository
public interface PersonRepository extends CrudRepository<Person, Long> {
public List<Person> findByAge(Integer age);
}
@RepositoryDefinition
@RepositoryDefinition(domainClass = Person.class, idClass = Long.class)
public interface MPersonRepository {
public List<Person> findByAge(Integer age);
}
@NoRepositoryBean
@NoRepositoryBean
interface BaseRepository<T, ID extends Serializable> extends Repository<T, ID> {
T findOne(ID id);
T save(T entity);
}
interface UserRepository extends BaseRepository<User, Long> {
User findByEmailAddress(EmailAddress emailAddress);
}
可以看出,不管使用Repository接口还是使用@RepositoryDefinition都需要直接或者间接的提供Entity class 和Entity id 的Class。
定义查询方法
在定义好查询接口Repository后,接下来需要定义查询方法,Spring Data 是根据定义方法根据属性来查询数据的,Spring Data称作属性表达式。
List<Person> findByAddress_ZipCode(ZipCode zipCode);
Page<User> findByLastname(String lastname, Pageable pageable);
List<User> findByLastname(String lastname, Sort sort);
@Query("select u from User u")
List<User> findByLastname(String lastname, Pageable pageable);
@Query("select * from User", nativeQuery = true)
List<User> findByLastname(String lastname, Pageable pageable);
查询方法关键词片段:

查询方法连词请参考[repository-query-keywords]
创建Repository实例
定义好Repository接口和查询方法需要指定扫描Repository的包。
实际上Spring Data 会生成Repository接口的代理来实现。
JavaConfig
@Configuration
@EnableJpaRepositories("com.acme.repositories")
XML config
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
<repositories base-package="com.acme.repositories" />
</beans:beans>
Spring Data Mongodb 基于Spring Boot 实现
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
配置数据源
resources/application.properties
spring.data.mongodb.host=localhost # Mongo server host.
spring.data.mongodb.port=27017 # Mongo server port.
spring.data.mongodb.username= # Login user of the mongo server.
spring.data.mongodb.password= # Login password of the mongo server.
# 或者使用uri的方式
spring.data.mongodb.uri=mongodb://localhost/test # Mongo database URI. When set, host and port are ignored.
定义Document
@Document
public class Person {
@Id
private Long id;
@Field
private String name;
@Field
private int age;
@Field
private Date birthday;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
定义Repository
这里与Spring Data JPA相同
public interface PersonRepository extends CrudRepository<Person, Long> {
public List<Person> findByAge(Integer age);
}
使用Repository
这里和Spring Data JPA相同
@Controller
@RestController
@RequestMapping("/persons")
public class PersonController {
@Autowired
private PersonRepository personRepository;
@RequestMapping(method = RequestMethod.GET)
public List<Person> find(Integer age) {
return personRepository.findByAge(age);
}
}
启用Repository
@SpringBootApplication
@EnableMongoRepositories("org.pretent.spring.mongodb.repository")
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
Spring Data JPA 基于Spring 实现
这里提供Servlet3.0+ 基于JavaConfig的示例。
依赖
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.10.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.1.0.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.18</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.3</version>
</dependency>
</dependencies>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
配置Spring Web
Spring Web JavaConfig
/**
* 用来在web.xml配置servlet,可以不用配置web.xml
*/
public class MWebApplicationInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext container) {
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet());
registration.setInitParameter("contextClass", "org.springframework.web.context.support.AnnotationConfigWebApplicationContext");
registration.setInitParameter("contextConfigLocation", "org.pretent.spring.JPAConfig");
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
JPA配置
/**
* date: 16/12/26 23:44
* author: PRETENT
**/
@Configuration
@EnableJpaRepositories(basePackages = "org.pretent.spring.repository")
@EnableWebMvc
@ComponentScan(value = {"org.pretent.spring.controller"})
public class JPAConfig {
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setEnable(true);
dataSource.setUrl("jdbc:mysql://192.168.34.132:3306/jpa?useUnicode=true&characterEncoding=UTF-8");
dataSource.setUsername("root");
dataSource.setPassword("mysqladmin");
return dataSource;
}
@Bean
public EntityManagerFactory entityManagerFactory() {
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
HibernateJpaVendorAdapter adaper = new HibernateJpaVendorAdapter();
adaper.setGenerateDdl(true);
factoryBean.setJpaVendorAdapter(adaper);
factoryBean.setPackagesToScan("org.pretent.spring.entity");
factoryBean.setDataSource(dataSource());
Properties properties = new Properties();
properties.put("hibernate.show_sql", true);
properties.put("hibernate.dialect",
"org.hibernate.dialect.MySQLDialect");
properties.put("hibernate.format_sql", true);
properties.put("hibernate.hbm2ddl.auto", "update");
factoryBean.setJpaProperties(properties);
factoryBean.afterPropertiesSet();
return factoryBean.getObject();
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
定义Repository、定义查询方法和使用Spring Boot集成类似。
Spring Data MongoDB 基于Spring 实现
这里提供Servlet3.0+ 基于JavaConfig的示例。
依赖
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.9.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.3</version>
</dependency>
</dependencies>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
配置Spring Web
Spring Web JavaConfig
/**
* 用来在web.xml配置servlet,可以不用配置web.xml
*/
public class MWebApplicationInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext container) {
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet());
registration.setInitParameter("contextClass", "org.springframework.web.context.support.AnnotationConfigWebApplicationContext");
registration.setInitParameter("contextConfigLocation", "org.pretent.spring.MongoConfig");
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
MongoDB配置
/**
* date: 16/12/26 23:44
* author: PRETENT
**/
@Configuration
@EnableWebMvc
@ComponentScan(value = {"org.pretent.spring.controller"})
@EnableMongoRepositories(basePackages = "org.pretent.spring.repository")
public class MongoConfig {
@Bean
public Mongo mongo() throws Exception {
return new Mongo("192.168.34.132");
}
@Bean
public MongoTemplate mongoTemplate() throws Exception {
return new MongoTemplate(mongo(), "database");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
定义Document
需要使用@Document注解
/**
* date: 16/12/24 21:37
* author: PRETENT
**/
@Document
public class Person {
private String name;
private int age;
private Date birthday;
public Person(String name, int age, Date birthday) {
this.name = name;
this.age = age;
this.birthday = birthday;
}
public Person() {
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
定义Repository、定义查询方法和使用Repository查询和Spring Data JPA类似