Spring Data

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
 
 
  • 1
  • 2
  • 3
数据库实体Entity
@Entity
public class Person {

    @Id
    @GeneratedValue
    private Long id;

    @Column
    private String name;

    @Column
    private int age;

    @Column
    private Date birthday;

    // setter /getter
}    
 
 
  • 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);
}
 
 
  • 1
  • 2
  • 3
使用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);
    }

}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
启用Repository
@SpringBootApplication
@EnableJpaRepositories("org.pretent.spring.jpa.repository")
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

启用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);
}
 
 
  • 1
  • 2
  • 3
@RepositoryDefinition
@RepositoryDefinition(domainClass = Person.class, idClass = Long.class)
public interface MPersonRepository {
    public List<Person> findByAge(Integer age);
}
 
 
  • 1
  • 2
  • 3
  • 4
@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);
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

可以看出,不管使用Repository接口还是使用@RepositoryDefinition都需要直接或者间接的提供Entity class 和Entity id 的Class。

定义查询方法

在定义好查询接口Repository后,接下来需要定义查询方法,Spring Data 是根据定义方法根据属性来查询数据的,Spring Data称作属性表达式。

// 支持嵌套对象
List<Person> findByAddress_ZipCode(ZipCode zipCode);

// Pageable支持分页
Page<User> findByLastname(String lastname, Pageable pageable);

// Sort支持排序
List<User> findByLastname(String lastname, Sort sort);

// 支持JPQL
@Query("select u from User u")
List<User> findByLastname(String lastname, Pageable pageable);

// 支持SQL
@Query("select * from User", nativeQuery = true) 
List<User> findByLastname(String lastname, Pageable pageable);
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

查询方法关键词片段: 
方法关键词

查询方法连词请参考[repository-query-keywords]

创建Repository实例

定义好Repository接口和查询方法需要指定扫描Repository的包。 
实际上Spring Data 会生成Repository接口的代理来实现。 
JavaConfig

@Configuration
@EnableJpaRepositories("com.acme.repositories")
 
 
  • 1
  • 2

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>
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Spring Data Mongodb 基于Spring Boot 实现

依赖
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
 
 
  • 1
  • 2
  • 3
  • 4
配置数据源

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.

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
定义Document
@Document
public class Person {

    @Id
    private Long id;

    @Field
    private String name;

    @Field
    private int age;

    @Field
    private Date birthday;

    // setter /getter
} 
 
 
  • 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);
}
 
 
  • 1
  • 2
  • 3
使用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);
    }

}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
启用Repository
@SpringBootApplication
@EnableMongoRepositories("org.pretent.spring.mongodb.repository")
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Spring Data JPA 基于Spring 实现

这里提供Servlet3.0+ 基于JavaConfig的示例。

依赖
<dependencies>
        <!-- Spring Data JPA 依赖 -->
        <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>
        <!-- JPA 实现,此处使用hibernate-->
        <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) {
        // Spring Web Mvc 控制器
        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);
        // /不匹配*.jsp,/*匹配所有,包括jsp和静态资源
        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;
    }

    // EntityManagerFactory配置
    @Bean
    public EntityManagerFactory entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        // JPA提供者为hibernate
        HibernateJpaVendorAdapter adaper = new HibernateJpaVendorAdapter();
        adaper.setGenerateDdl(true);
        // JPA提供者为hibernate
        factoryBean.setJpaVendorAdapter(adaper);
        // entity 所在包
        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>
        <!-- Spring Data MongoDB 依赖 -->
        <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) {
        // Spring Web Mvc 控制器
        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);
        // /不匹配*.jsp,/*匹配所有,包括jsp和静态资源
        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() {
    }

    // setter、getter
}

 
 
  • 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类似

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值