Spring Boot 之Spring data JPA簡介

文章目錄
git

    • 添加依賴
    • 添加entity bean
    • 建立 Dao
    • Spring Data Configuration
    • 測試


Spring Boot 之Spring data JPA簡介github


JPA的全稱是Java Persistence API (JPA),他是一個存儲API的標準,而Spring data JPA就是對JPA的一種實現,能夠讓咱們方便的對數據進行存取。按照約定好的方法命名規則寫dao層接口,從而在不實現接口的狀況下,實現對數據庫的訪問和操做。同時提供了不少除了CRUD以外的功能,如分頁、排序、複雜查詢等等。spring

Spring data JPA能夠看作是對Hibernate的二次封裝。本文將會以一個具體的例子來說解,怎麼在Spring Boot中使用Spring data JPA。sql

添加依賴

咱們要添加以下的Spring data JPA依賴,爲了方便測試,咱們添加一個h2的內存數據庫:數據庫

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency>

添加entity bean

咱們來建立一個entity bean:springboot

@Entity@Datapublic class Book {@Id@GeneratedValue(strategy = GenerationType.AUTO)private long id;@Column(nullable = false, unique = true)private String title;@Column(nullable = false)private String author;}

建立 Dao

public interface BookRepository extends JpaRepository<Book, Long> {List<Book> findByTitle(String title);@Query("SELECT b FROM Book b WHERE LOWER(b.title) = LOWER(:title)")Book retrieveByTitle(@Param("title") String title);}

全部的Dao都須要繼承Repository接口,Repository是一個空的接口:dom

@Indexedpublic interface Repository<T, ID> {}

若是要使用默認的通用的一些實現,則能夠繼承CrudRepository, PagingAndSortingRepository和JpaRepository。ide

上面的例子中咱們繼承了JpaRepository。spring-boot

上面的例子中咱們建立了一個按Title查找的方法:測試

List<Book> findByTitle(String title);

這個方法咱們是不須要本身去實現的,Spring Data JPA會幫咱們去實現。咱們能夠使用find…By, read…By, query…By, count…By,和 get…By的格式定義查詢語句,By後面接的就是Entity的屬性。除了And,咱們還能夠使用Or來拼接方法,下面咱們再舉個例子:

interface PersonRepository extends Repository<Person, Long> {

  List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

  // Enables the distinct flag for the query
  List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
  List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);

  // Enabling ignoring case for an individual property
  List<Person> findByLastnameIgnoreCase(String lastname);
  // Enabling ignoring case for all suitable properties
  List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);

  // Enabling static ORDER BY for a query
  List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
  List<Person> findByLastnameOrderByFirstnameDesc(String lastname);}

固然,處理方法拼接外,咱們還能夠自定義sql查詢語句:

    @Query("SELECT b FROM Book b WHERE LOWER(b.title) = LOWER(:title)")Book retrieveByTitle(@Param("title") String title);

自定義查詢語句給Spring data JPA提供了更大的想象空間。

Spring Data Configuration

要使用Spring Data JPA, 咱們還須要在配置文件中指定要掃描的目錄,使用@EnableJpaRepositories註解來實現:

@Configuration@EnableJpaRepositories(basePackages = "com.flydean.repository")public class PersistenceConfig {}

咱們還須要在配置文件中指定數據源的屬性:

spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

測試

有了上面的一切,咱們就能夠測試咱們的數據源了:

@Slf4j@RunWith(SpringRunner.class)@SpringBootTest(classes = {JpaApp.class})public class BookRepositoryTest {@Autowiredprivate BookRepository bookRepository;@Test@Transactional(readOnly=false)public void testBookRepository(){Book book = new Book();book.setTitle(randomAlphabetic(10));book.setAuthor(randomAlphabetic(15));bookRepository.save(book);   bookRepository.findByTitle(book.getTitle()).forEach(e -> log.info(e.toString()));   log.info(bookRepository.retrieveByTitle(book.getTitle()).toString());}}

本文的例子能夠參考:https://github.com/ddean2009/learn-springboot2/tree/master/springboot-jpa

相關文章
相關標籤/搜索