[[geode-repositories]]
== Spring Data Repositories

Using Spring Data Repositories with Apache Geode makes short work of data access operations when using Apache Geode
as your System of Record (SOR) to persist your application's state.

{spring-data-commons-docs-html}/#repositories[Spring Data Repositories] provides a convenient and highly powerful way
to define basic CRUD and simple query data access operations easily just by specifying the contract of those data access
operations in a Java interface.

Spring Boot for Apache Geode _auto-configures_ the Spring Data for Apache Geode {spring-data-geode-docs-html}/#gemfire-repositories[Repository extension]
when declared on your application's classpath.  You do not need to do anything special to enable it.  Simply start
coding your application-specific Repository interfaces and the way you go.

For example:

Define a `Customer` class to model customers and map it to the GemFire/Geode "Customers" Region using the SDG
{spring-data-geode-javadoc}/org/springframework/data/gemfire/mapping/annotation/Region.html[`@Region`] mapping
annotation:

.`Customer` entity class
[source,java]
----
package example.app.books.model;

import ...;
@Region("Customers")
class Customer {

    @Id
    private Long id;

    private String name;

    ....
}
----

Declare your _Repository_ (a.k.a. {wikipedia-docs}/Data_access_object[Data Access Object (DAO)]) for `Customers`...

.`CustomerRepository` for peristing and accessing `Customers`
[source,java]
----
package example.app.books.repo;

import ...;

interface CustomerRepository extends CrudRepository<Customer, Long> {

    List<Customer> findByLastNameLikeOrderByLastNameDescFirstNameAsc(String customerLastNameWildcard);

}
----

Then use the `CustomerRepository` in an application service class:

.Inject and use the `CustomerRepository`
[source,java]
----
package example.app;

import ...;

@SpringBootApplication
@EnableEntityDefinedRegions(basePackageClasses = Customer.class)
class SpringBootApacheGeodeClientCacheApplication {

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

    @Bean
    ApplicationRunner runner(CustomerRepository customerRepository) {

        // Matches Williams, Wilson, etc.
        List<Customer> customers =
            customerRepository.findByLastNameLikeOrderByLastNameDescFirstNameAsc("Wil%");

        // process the list of matching customers...
    }
}
----

Again, see Spring Data Commons' {spring-data-commons-docs-html}/#repositories[Repositories abstraction] in general,
and Spring Data for Apache Geode {spring-data-geode-docs-html}/#gemfire-repositories[Repositories extension]
in particular, for more details.
